Repository: aripekka/pyTTE (language: python)

Issue:
Peak position do not match bragg angle
The peak position does not match the Bragg angle and it is keep on changing with the change in Debye Waller factor. If it is not a bug please provide citation. 


Discussion / hints:

Fix patch:
diff --git a/README.md b/README.md
index c41fc37..d9ebd55 100755
--- a/README.md
+++ b/README.md
@@ -1,35 +1,43 @@
-# pyTTE
-Package to calculate diffraction curves of deformed crystals by numerically integrating the Takagi-Taupin equations
+# pyTTE v.1.0
+Package to calculate diffraction curves of deformed crystals by numerically integrating the 1D Takagi-Taupin equation.
 
 ### Requirements
-In addition to `numpy`, `scipy`, and `matplotlib`, PyTTE requires `xraylib` https://github.com/tschoonj/xraylib
+PyTTE works on both Python 3 and Python 2. However, Python 2 support is not guaranteed on future versions. 
+
+For crystallographic data and structure factor calculations PyTTE uses `xraylib` whose installing instructions are found at https://github.com/tschoonj/xraylib. PyTTE is developed and tested on version 4.0.0. In addition, `numpy` (>=1.16.6), `scipy`(>=1.2.1), `multiprocess` (>=0.70.9) and `matplotlib` (>=2.2.3) are required. Contents of testing environments are provided in the repository.
 
 ### Installation
-PyTTE can be installed using `pip`:
+
+PyTTE can be installed using `pip` (NB: v 1.0 is not yet in PyPI):
+
 ```
 pip install pyTTE
 ```
-The installation can be tested by running example calculations:
-```
-import pyTTE.examples
-pyTTE.examples.run()
-```
-The script runs four different test cases (Laue-Bragg, symmetric-asymmetric, unbent-bent...) and should take a minute or so to complete.
 
-### Usage
+Note that `xraylib` can not be installed via pip.
+
+Alternatively, the PyTTE works also directly by copying the PyTTE folder to the working directory if the requirements are met.
 
-Following snippet calculates the reflectivity of unstrained GaAs(400) reflection in angle domain for sigma-polarized beam at 6 keV. The thickness of the crystal is set to 300 microns and the asymmetry angle to 0. The Debye-Waller factor is 1 (= 0 K) and the minimum integration step is 1e-10. Scan vector `th` is given in units of arc secs. Reflectivity and transmission (the latter is not implemented yet, though) are given as an output.
+### Example of use
+
+Following snippet calculates the reflectivity of unstrained GaAs(400) reflection in angle domain for sigma-polarized beam at 6 keV. The thickness of the crystal is set to 300 microns and the asymmetry angle to 0. The Debye-Waller factor is 1 (= 0 K). Scan vector is given in units of arc sec (microradians are also supported). Reflectivity and transmission (the latter is not implemented yet, though) are given as the output of .run() and can be quickly plotted with .plot().
 
 ```
 import numpy as np
-from pyTTE import takagitaupin
+import matplotlib.pyplot as plt
+from pyTTE import TakagiTaupin, TTcrystal, TTscan, Quantity
 
-th = np.linspace(-10,30,150)
-R,T=takagitaupin('angle',th,6,'sigma','GaAs',[4,0,0],0,300,None,1,1e-10)
-```
+ttx = TTcrystal(crystal = 'GaAs', hkl = [4,0,0], thickness = Quantity(300,'um'), debye_waller = 1)
+tts = TTscan(constant=Quantity(6,'keV'), scan=Quantity(np.linspace(-10,30,150), 'arcsec'), polarization='sigma')
+
+tt=TakagiTaupin(ttx,tts)
 
-For energy scan, `th` is replaced with energy scan vector which is given in meV. The constant energy (6 in the example), is replaced with the (kinematic) Bragg angle (in degrees).
+scan_vector, R, T = tt.run()
+tt.plot()
+
+plt.show()
+```
 
-The code differentiates between the Bragg and Laue cases on the basis of the exit angle of the diffracted beam which, on the other hand, is dictated by the Bragg angle and the asymmetry. To change the previous example to Laue geometry, the asymmetry angle is changed from 0 to 90.
+The code differentiates between the Bragg and Laue cases on the basis of the exit angle of the diffracted beam which, on the other hand, is dictated by the Bragg angle and the asymmetry. To change the previous example to Laue geometry, give `asymmetry = Quantity(90,'deg')` when initializing `TTcrystal`.
 
-Other examples of use can be found in `pyTTE/examples/examples.py`.
+Comprehensive instructions are presented in the docstrings of `TTcrystal`, `TTscan` and `TakagiTaupin` and in the Jupyter notebooks in `examples/`.
diff --git a/docs/documentation.bib b/docs/documentation.bib
index 25c7aaf..c38941d 100755
--- a/docs/documentation.bib
+++ b/docs/documentation.bib
@@ -1,3 +1,90 @@
+@article{Brown_1989,
+	year = 1989,
+	month = {sep},
+	publisher = {Society for Industrial {\&} Applied Mathematics ({SIAM})},
+	volume = {10},
+	number = {5},
+	pages = {1038--1051},
+	author = {Peter N. Brown and George D. Byrne and Alan C. Hindmarsh},
+	title = {{VODE}: A Variable-Coefficient {ODE} Solver},
+	journal = {{SIAM} Journal on Scientific and Statistical Computing},
+	note={doi:10.1137/0910062}
+}
+
+@article{Chukhovskii_1994,
+	year = 1994,
+	month = {dec},
+	publisher = {International Union of Crystallography ({IUCr})},
+	volume = {27},
+	number = {6},
+	pages = {971--979},
+	author = {F. N. Chukhovskii and W. Z. Chang and E. Förster},
+	title = {Two-dimensional focusing X-ray optics: application of anisotropic elasticity theory for characterization of bent crystals},
+	journal = {Journal of Applied Crystallography},
+	note={doi:10.1107/s002188989400676x}
+}
+
+@article{Honkanen_2020,
+	year = 2020,
+	author = {Ari-Pekka Honkanen and Simo Huotari},
+	title = {General procedure for calculating the elastic deformation and X-ray diffraction properties of toroidally and spherically bent crystal wafers},
+	note = {In preparation}
+}
+
+@article{Chantler_1995,
+	year = 1995,
+	month = {jan},
+	publisher = {{AIP} Publishing},
+	volume = {24},
+	number = {1},
+	pages = {71--643},
+	author = {C. T. Chantler},
+	title = {Theoretical Form Factor, Attenuation, and Scattering Tabulation for Z=1{\textendash}92 from E=1{\textendash}10 {eV} to E=0.4{\textendash}1.0 {MeV}},
+	journal = {Journal of Physical and Chemical Reference Data},
+	note = {doi:10.1063/1.555974}
+}
+
+@article{del_Coso_2004,
+	year = 2004,
+	month = {mar},
+	publisher = {The Optical Society},
+	volume = {21},
+	number = {3},
+	pages = {640},
+	author = {Ra{\'{u}}l del Coso and Javier Solis},
+	title = {Relation between nonlinear refractive index and third-order susceptibility in absorbing media},
+	journal = {Journal of the Optical Society of America B},
+	note={doi:10.1364/josab.21.000640}
+}
+
+@article{Ewald_1986,
+	year = 1986,
+	journal = {Acta Crystallographica Section A: Foundations of Crystallography},
+	volume = {A42},
+	pages = {411--413},
+	author = {P. P. Ewald},
+	title = {The so-called correction of Bragg's law},
+	note = {doi:10.1107/s010876738609894x}
+}
+
+
+@misc{stepanov_server,
+author = {Sergey Stepanov},
+title = {X-ray server},
+note = {\texttt{https://x-server.gmca.aps.anl.gov/x0h.html}. Accessed 27.2.2020},
+}
+
+
+@article{Schoonjans_2011,
+	year = 2011,
+	journal = {Spectrochimica Acta Part B: Atomic Spectroscopy},
+	volume = {66},
+	pages = {776--784},
+	author = {Tom Schoonjans and Antonio Brunetti and Bruno Golosio and Manuel {Sanchez del Rio} and Vicente Armando Sol\'{e} and Claudio Ferrero and Laszlo Vincze},
+	title = {The xraylib library for X-ray–matter interactions. Recent developments},
+	note = {doi:10.1016/j.sab.2011.09.011}
+}
+
 @article{Sanchez_del_Rio_2015,
 	doi = {10.1107/s1600576715002782},
 	url = {https://doi.org/10.1107%2Fs1600576715002782},
diff --git a/docs/documentation.pdf b/docs/documentation.pdf
index 1a8044c..7574dc2 100755
Binary files a/docs/documentation.pdf and b/docs/documentation.pdf differ
diff --git a/docs/documentation.tex b/docs/documentation.tex
index 3bd74d8..c7ca910 100755
--- a/docs/documentation.tex
+++ b/docs/documentation.tex
@@ -8,15 +8,16 @@
 
 
 \author{Ari-Pekka Honkanen}
-\title{PyTTE: The Technical Document}
+\title{PyTTE: The Technical Document\\Version 1.0}
 \begin{document}
 \maketitle
 \section{Introduction}
 PyTTE (pronounced \emph{pie-tee-tee-ee}) is a Python package for solving X-ray diffraction curves of bent crystals in reflection and transmission geometries. The computation of the diffraction curves is based on the numerical integration of 1D Takagi-Taupin equation (TTE) which is derived from a more general Takagi-Taupin theory describing the propagation of electromagnetic waves in a (quasi)periodic medium. Both energy and angle scans are supported.
 This document describes the theoretical basis behind PyTTE.
 
-\section{Takagi-Taupin equation}
-In the typical two-beam case, the Takagi-Taupin equations are can be written as
+\section{Takagi-Taupin theory}
+\subsection{1D Takagi-Taupin equation}
+In the typical two-beam case where the incident wave is written as $\mathbf{D}_0(\mathbf{r}) \exp(i \mathbf{k}_0 \cdot \mathbf{r})$ and the diffracted wave as $\mathbf{D}_h(\mathbf{r}) \exp(i \mathbf{k}_h \cdot \mathbf{r} - i \mathbf{h} \cdot \mathbf{u})$, the Takagi-Taupin equations are can be written as
 \begin{subnumcases}{}
 \frac{\partial D_0}{\partial s_0} =  i c_0 D_0 + i c_{\bar{h}} D_h \label{eq:TT_typicala} \\
 \frac{\partial D_h}{\partial s_h} =  i \left(c_0 + \beta + \frac{\partial (\mathbf{h}\cdot\mathbf{u}) }{\partial s_h}  \right) D_h
@@ -28,9 +29,10 @@ \section{Takagi-Taupin equation}
 \end{equation} 
 where $k=2 \pi/\lambda$ and $C = 1$ for $\sigma$-polarization and $\cos 2 \theta_B$ for $\pi$-polarization. The deviation parameter $\beta = (k_h^2 - k_0^2)/2k_h$ is quite often approximated by $\beta \approx k \Delta \theta \sin 2 \theta_B$, where $\Delta \theta$ is the deviation from the Bragg angle. However, since this approximation ceases to be valid near the backscattering condition, PyTTE uses a more general form
 \begin{equation}
-\beta = \frac{2 \pi}{d_h}\left(\frac{\lambda}{2 d_h}-\sin \theta \right) = h \left(\frac{\lambda}{2 d_h}-\sin \theta \right),
+\beta = \frac{2 \pi}{d_h}\left(\sin \theta - \frac{\lambda}{2 d_h}\right) = h \left(\sin \theta - \frac{\lambda}{2 d_h}\right),
+\label{eq:beta}
 \end{equation}
-where $d_h$ is the interplanar separation of the diffractive planes corresponding to the reciprocal vector $\mathbf{h}$ and $\theta$ is the incidence angle relative to the aforementioned planes.
+where $d_h$ is the interplanar separation of the diffractive planes corresponding to the reciprocal vector $\mathbf{h}$ and $\theta$ is the incidence angle relative to the aforementioned planes. To avoid the possibility of catastrophic cancellation, the subtraction is performed explicitly with 64 bit floating point numbers.
 
 %THIS PARAGRAPH NEEDS A FIGURE
 The partial derivatives with respect to $s_0$ and $s_h$ can be written in Cartesian coordinates as
@@ -47,12 +49,83 @@ \section{Takagi-Taupin equation}
 \frac{d \xi}{d z} = i \gamma_0 c_{\bar{h}} \xi^2 + i \left[ (\gamma_0+\gamma_h)c_0 + \gamma_h \beta + \gamma_h \frac{\partial (\mathbf{h}\cdot\mathbf{u}) }{\partial s_h} \right] \xi + i \gamma_h c_h
 \label{eq:xi}
 \end{equation}
+When $\xi$ is known, the incident wave can be then solved from Eq.~\eqref{eq:TT_b} as follows
+\begin{equation}
+\frac{d D_0}{d z} =  - i \left( \gamma_0 c_0  + \gamma_0 c_{\bar{h}} \xi \right) D_0.
+\label{eq:D0}
+\end{equation}
+
+\subsection{Solving the TT-equation in the reflection and transmission geometries}
+
+In the transmission geometry (Laue case), Eqs.~\eqref{eq:xi} and \eqref{eq:D0} are solved simultaneously by integrating them from the top of the crystal $z=0$ to the bottom $z=-t$. The initial conditions are $\xi(0) = 0$ and $D_0(0)=1$. In the reflection geometry (Bragg case), $\xi$ is solved by integrating from the bottom of the crystal $z = -t$ to the top $z = 0$ with the initial condition $\xi(-t) = 0$. Like in the Laue case, the transmitted beam would have to be integrated from top to bottom, which would require a separate run after $\xi$ is solved and increase the total solving time. Since $D_0$ is rarely needed in the Bragg case, its calculation is not implemented in the version 1.0.
+
+The reflectivity $R$ in the Bragg case is then obtained by $R=|\xi(0)|^2$. However, it should be noted that this definition takes only account the intensities of the beam. From an experimental viewpoint, detectors often record the photon flux which also proportional to the cross-sectional area of the beam. In terms of the photon flux, the reflectivity is $R_\Phi = |\xi(0)|^2 \gamma_0/\gamma_h$. For a symmetric reflection $R=R_\Phi$. (For transmission $T = T_\Phi = |D_0(-t)/D_0(0)|^2$ always.) Similarly in the Laue case the transmission (or forward-diffractivity) $T$ and the diffractivity $R$ in terms of intensities are given by $T = |D_0(-t)/D_0(0)|^2$ and $R = |D_h(-t)/D_0(0)|^2 = |\xi(-t)D_0(-t)/D_0(0)|^2$ and in terms of photon fluxes $T_\Phi = T = |D_0(-t)/D_0(0)|^2$ and $R_\Phi = |\xi(-t)D_0(-t)/D_0(0)|^2  \gamma_0/|\gamma_h|$. The keyword \texttt{output\_type} of \texttt{TTscan} controls whether the solution is given in terms of intensities or photon fluxes.
+
+Eqs.~\eqref{eq:xi} and \eqref{eq:D0} are solved numerically using the variable-coeffient ordinary differential equation solver (VODE) with backward differential formula (BDF) method \cite{Brown_1989} as implemented in \textsc{SciPy}. Analytically calculated Jacobians are provided for the solver.
+
+\subsection{Susceptibilities and structure factors}
+In linear media, the susceptibility $\chi$ is related to the dielectric constant $\epsilon$ by $\epsilon = \epsilon_0 (1 + \chi)$ where $\epsilon_0$ is the vacuum permittivity  \cite{del_Coso_2004}. Since $\chi$ is small, the complex refractive index is thus $n = \sqrt{\epsilon} \approx 1 + \chi/2$. The connection between the refractive index and the atomic form factor is \cite{Chantler_1995}
+\begin{equation}
+n = 1 - \frac{r_0 \lambda^2}{2 \pi} \sum_j n_j f_j
+\end{equation}
+where $r_0$ is the classical electron radius, $n_j$ and $f_j$ are the number density and the form factor of atomic species $j$, respectively. For crystalline matter, the phase factor and the Debye-Waller factors are included in the sum
+\begin{equation}
+\chi(\mathbf{q}) =  - \frac{r_0 \lambda^2}{\pi V} \sum_{i} e^{i \mathbf{q} \cdot \mathbf{R}_i}  \sum_j f_j(\mathbf{q})  e^{i \mathbf{q} \cdot \mathbf{r}_j}  e^{-\tfrac{1}{2}q^2 \langle u_j^2 \rangle}
+\end{equation}
+where $V$ is the volume of the crystal. The first sum goes over all the lattice points $i$, and the second one the atoms in the unit cell. The Fourier coefficients of the series $\chi(\mathbf{r}) = \sum_{\mathbf{h}} \chi_{\mathbf{h}} e^{i\mathbf{h} \cdot \mathbf{r}}$ are thus
+\begin{equation}
+\chi_\mathbf{h} =  - \frac{r_0 \lambda^2}{\pi v}  F_{\mathbf{h}}
+\end{equation}
+where $v$ is the volume of the unit cell, and the crystal structure factor is
+\begin{equation}
+F_{\mathbf{h}} = \sum_j f_j(\mathbf{h})  e^{i \mathbf{h} \cdot \mathbf{r}_j}  e^{-\tfrac{1}{2}h^2 \langle u_j^2 \rangle}.
+\end{equation}
+
+\textsc{PyTTE} uses \texttt{Crystal\_F\_H\_StructureFactor} of \textsc{xraylib} to calculate the structure factors $F_h$. In this case the user given Debye-Waller factor is assumed to be $\exp(-\tfrac{1}{2}h^2 \langle u^2 \rangle)$ which is passed to calculation of $F_h$ and $F_{\bar{h}}$; the Debye-Waller factor is always 1 for $F_0$. Although not explicitely stated, \textsc{xraylib} apparently assumes the form of the Fourier expansion to be $\sum_{\mathbf{h}} \chi_{\mathbf{h}} e^{-i\mathbf{h} \cdot \mathbf{r}}$ due to which the structure factors are complex conjugated in \textsc{PyTTE} before calculating $\chi_{\mathbf{h}}$. According to the \textsc{xraylib} source code and the example files (e.g. \texttt{example/xrlexample1.c}) the input parameter \texttt{rel\_angle} is set to 1.
+
 
-In the reflection geometry (\emph{i.e.} the Bragg case), the reflectivity $R$ of the crystal with thickness $t$ can be solved by integrating Equation~\eqref{eq:xi} from the bottom of the crystal $z=-t$ to the top surface $z=0$. The initial condition is set $\xi(-t)=0$. The reflectivity, which is defined in the terms of integrated intensity, is then computed $R = \gamma_0/\gamma_h|\xi(0)|^2$ where $\gamma_0/\gamma_h$ takes care of different footprint sizes in the asymmetric case. Using the solved $\xi$ and Equation~\eqref{eq:TT_b}, the transmission $T=|D_0(-t)/D_0(0)|^2$ can be then solved from
+\subsection{Scan vector and refraction correction}
+The scan vector, whether in the energy or angle domain, is given to \textsc{PyTTE} relative to the kinematical diffraction condition $\lambda = 2 d_h \sin \theta$, or equivalently $\beta = 0$. 
+However, it is well-known \cite{Ewald_1986} that due to the refraction of X-rays at the crystal-vacuum interface, the diffraction is not exactly at where the kinematical condition suggests it to be. From Eq.~\eqref{eq:xi} we see, that the true center of the diffraction takes place at $\beta = -(1 + \gamma_0/\gamma_h)\mathrm{Re}[c_0]$. Compared to the kinematical condition, the energy of the centre of the diffraction is changed by
 \begin{equation}
-\frac{d D_0}{d z} =  - i \left( \gamma_0 c_0  + \gamma_0 c_{\bar{h}} \xi \right) D_0
+\frac{\Delta E}{E} = -\left(1 + \frac{\gamma_0}{\gamma_h} \right)\frac{\mathrm{Re}[\chi_0]}{4 \sin^2 \theta}
 \end{equation}
-by integrating from $z=0$ to $z=-t$. The transmission geometry (the Laue case) is more straightforward, as the ODEs for $\xi$ and $D_0$ can be integrated simultaneously from $z=0$ to $z=-t$. With the initial conditions are set $\xi(0) = 0$ and $D_0(0)=1$, the forward-diffracted intensity at the exit surface is $|D_0(-t)|^2$ and the diffracted intensity is $|D_h(-t)|^2=|\xi(-t)D_0(-t)|^2$.
+and the angle by
+\begin{equation} 
+\Delta \theta = -\left(1 + \frac{\gamma_0}{\gamma_h} \right)\frac{\mathrm{Re}[\chi_0]}{4 \sin \theta  \cos \theta}.
+\end{equation}
+The refraction corrections can be applied to the scan vector if needed.
+
+\subsection{Automatic scan limit calculation}
+Locally, the diffraction takes place most efficiently in the crystal when 
+\begin{equation}
+\left(1 + \frac{\gamma_0}{\gamma_h}\right) \mathrm{Re} [c_0]  + \beta + \frac{\partial (\mathbf{h}\cdot\mathbf{u}) }{\partial s_h} = 0
+\end{equation}
+in Eq.~\eqref{eq:xi}, which is effectively Bragg's law corrected for the refraction and influence of deformation. The scan limits can be thus be calculated by finding the maximum and minimum values for the deformation term inside the crystal and calculating the corresponding $\beta$-range. In addition we have to take into account that every reflection has a finite width and extend the scan range accordingly. According to \cite{stepanov_server}, the Darwin width of a perfect thick crystal in the case of symmetric Bragg reflection is
+\begin{equation}
+\Delta \theta_D = \frac{2 \sqrt{|\chi_h \chi_{\bar{h}}|}}{\sin 2 \theta_B}
+\end{equation}
+except near $\theta_B = \pi/2$ when 
+\begin{equation}
+\Delta \theta_D = \left(2 \sqrt{|\chi_h \chi_{\bar{h}}|} \right)^{1/2}.
+\end{equation}
+is more appropriate. For scan limit calculation purposes we combine the two expressions continuously in the following way:
+\begin{equation}
+\Delta \theta_D (\theta_B)  = \begin{dcases}
+\left(2 \sqrt{|\chi_h \chi_{\bar{h}}|} \right)^{1/2} & \mathrm{when} \quad \sin 2\theta_B \leq \left(2 \sqrt{|\chi_h \chi_{\bar{h}}|} \right)^{1/2}\\
+\frac{2 \sqrt{|\chi_h \chi_{\bar{h}}|}}{\sin 2 \theta_B} & \mathrm{when} \quad \sin 2\theta_B > \left(2 \sqrt{|\chi_h \chi_{\bar{h}}|} \right)^{1/2}
+\end{dcases}
+\end{equation} 
+Substituting this in Eq.~\eqref{eq:beta} and expanding up to the first order, we get
+\begin{equation}
+|\Delta \beta| = \sigma h \Delta \theta_D (\theta_B) \cos \theta_B,
+\end{equation}
+where $\sigma = 2$ is a scaling factor which makes the scan range look nicer especially in the absence of a deformation field. Therefore the scan limits are
+\begin{align}
+\beta_{\mathrm{min}} &= - \frac{k}{2} \left( 1 + \frac{\gamma_0}{\gamma_h} \right) \mathrm{Re}[\chi_0] - \max \left[ \frac{\partial (\mathbf{h}\cdot\mathbf{u}) }{\partial s_h} \right] - \sigma h \Delta \theta_D (\theta_B) \cos \theta_B \\
+\beta_{\mathrm{max}} &= -\frac{k}{2} \left( 1 + \frac{\gamma_0}{\gamma_h} \right) \mathrm{Re}[\chi_0] - \min \left[  \frac{\partial (\mathbf{h}\cdot\mathbf{u}) }{\partial s_h} \right] +  \sigma h \Delta \theta_D (\theta_B) \cos \theta_B
+\end{align}
+It should be noted, that the limits above do not aim to be perfect but act more like as a suggestion. For example, the Darwin width term used may fall short if the crystal is strongly bent or very thin. Also, the first order expansion of $\beta$ is not accurate in the back-scattering.
 
 \section{Deformation}
 As stated in the previous section, the deformation is introduced through $\partial_h(\mathbf{h}\cdot \mathbf{u})$ term where $\mathbf{u}$ is the displacement vector field. Taking the asymmetry into account, the reciprocal vector is given by $\mathbf{h} = h \sin \varphi \hat{\mathbf{x}} + h \cos \varphi \hat{\mathbf{z}}$. Thus
@@ -62,42 +135,91 @@ \section{Deformation}
 Again we write the partial derivatives in terms of $x$ and $z$. In this case, however, neither $x$- or $z$-derivatives can be dropped as they both contain physical information about the rotation and the separation of the diffractive planes. Since the beam propagates also in the $x$-direction, the situation is not strictly speaking one dimensional. However, since the $x$-coordinate is geometrically related to $z$, the problem can be treated as such. Therefore the deformation term becomes
 \begin{equation}
 \frac{\partial (\mathbf{h}\cdot \mathbf{u})}{\partial s_h} = h \left( 
-\sin \varphi \cos \alpha' \frac{\partial u_x}{\partial x} 
-+\sin \varphi \sin \alpha' \frac{\partial u_x}{\partial z} 
-+\cos \varphi \cos \alpha' \frac{\partial u_z}{\partial x} 
-+\cos \varphi \sin \alpha' \frac{\partial u_z}{\partial z} 
+\sin \varphi \cos \alpha_h \frac{\partial u_x}{\partial x} 
++\sin \varphi \sin \alpha_h \frac{\partial u_x}{\partial z} 
++\cos \varphi \cos \alpha_h \frac{\partial u_z}{\partial x} 
++\cos \varphi \sin \alpha_h \frac{\partial u_z}{\partial z} 
  \right),
 \end{equation}
-where the derivatives, that are functions of $x$ and $z$, are made only $z$-dependent with $x(z)=-z \cot \alpha$. PyTTE computes the strain term from the Jacobian of $\mathbf{u}$.
+where the derivatives, that are functions of $x$ and $z$, are made only $z$-dependent with $x(z)=-z \cot \alpha_0$. PyTTE computes the strain term from the Jacobian of $\mathbf{u}$.
 
-\subsection{Anisotropic plate}
-According to \cite{Sanchez_del_Rio_2015}, the components of the displacement field for an anisotropic plate bent by two (scaled) torques $m_x$ and $m_y$ are
+\subsection{Anisotropic plate, bending due to applied torques}
+According to \cite{Chukhovskii_1994}, the components of the displacement field for an anisotropic plate bent by two (scaled) torques $m_1$ and $m_2$ acting about $y$- and $x$-axes, respectively, are
 \begin{align}
-u_x &= (S_{11} m_x + S_{12} m_y) x z + (S_{51} m_x + S_{52} m_y)\frac{z^2}{2} + (S_{61} m_x +S_{62} m_y) \frac{y z}{2} \\
-u_y &= (S_{21} m_x + S_{22} m_y) y z + (S_{41} m_x + S_{42} m_y)\frac{z^2}{2} + (S_{61} m_x +S_{62} m_y) \frac{x z}{2} \\
-u_z &= -(S_{11} m_x + S_{12} m_y)\frac{x^2}{2} -(S_{21} m_x + S_{22} m_y)\frac{y^2}{2} -(S_{61} m_x +S_{62} m_y) \frac{x y}{2} +(S_{31} m_x + S_{32} m_y)\frac{z^2}{2},
+u_x &= (S_{11} m_1 + S_{12} m_2) x z + (S_{51} m_1 + S_{52} m_2)\frac{z^2}{2} + (S_{61} m_1 +S_{62} m_2) \frac{y z}{2} \\
+u_y &= (S_{21} m_1 + S_{22} m_2) y z + (S_{41} m_1 + S_{42} m_2)\frac{z^2}{2} + (S_{61} m_1 +S_{62} m_2) \frac{x z}{2} \\
+u_z &= -(S_{11} m_1 + S_{12} m_2)\frac{x^2}{2} -(S_{21} m_1 + S_{22} m_2)\frac{y^2}{2} -(S_{61} m_1 +S_{62} m_2) \frac{x y}{2} +(S_{31} m_1 + S_{32} m_2)\frac{z^2}{2},
 \end{align} 
 where $S_{ij}$ are the components of the compliance matrix. Thus we find the partial derivatives:
 \begin{align}
-\frac{\partial u_x}{\partial x} &= (S_{11} m_x + S_{12} m_y) z \\
-\frac{\partial u_x}{\partial z} &= (S_{11} m_x + S_{12} m_y) x + (S_{51} m_x + S_{52} m_y) z 
-+ (S_{61} m_x + S_{62} m_y) \frac{y}{2}\\
-\frac{\partial u_z}{\partial x} &= -(S_{11} m_x + S_{12} m_y) x -(S_{61} m_x + S_{62} m_y) \frac{y}{2} \\
-\frac{\partial u_z}{\partial z} &= (S_{31} m_x + S_{32} m_y) z
+\frac{\partial u_x}{\partial x} &= (S_{11} m_1 + S_{12} m_2) z \\
+\frac{\partial u_x}{\partial z} &= (S_{11} m_1 + S_{12} m_2) x + (S_{51} m_1 + S_{52} m_2) z 
++ (S_{61} m_1 + S_{62} m_2) \frac{y}{2}\\
+\frac{\partial u_z}{\partial x} &= -(S_{11} m_1 + S_{12} m_2) x -(S_{61} m_1 + S_{62} m_2) \frac{y}{2} \\
+\frac{\partial u_z}{\partial z} &= (S_{31} m_1 + S_{32} m_2) z
 \end{align} 
-The torques are related to the bending radii $R_i$ by\footnote{In this work the signs of $R_i$ is the opposite to that of \cite{Sanchez_del_Rio_2015}}
+The torques are related to the bending radii $R_i$ by\footnote{In this work the signs of $R_i$ is the opposite to that of \cite{Chukhovskii_1994}}
 \begin{equation}
-\frac{1}{R_x} = -S_{11} m_x - S_{12} m_y, \qquad
-\frac{1}{R_y} = -S_{21} m_x - S_{22} m_y.
+\frac{1}{R_1} = -S_{11} m_1 - S_{12} m_2, \qquad
+\frac{1}{R_2} = -S_{21} m_1 - S_{22} m_2.
 \end{equation}
 Thus
 \begin{equation}
-m_x = \frac{1}{S_{11}S_{22}-S_{12}S_{21}}\left(\frac{S_{12}}{R_y}-\frac{S_{22}}{R_x} \right), \qquad
-m_y = \frac{1}{S_{11}S_{22}-S_{12}S_{21}}\left(\frac{S_{21}}{R_x}-\frac{S_{11}}{R_y} \right).
+m_1 = \frac{1}{S_{11}S_{22}-S_{12}S_{21}}\left(\frac{S_{12}}{R_2}-\frac{S_{22}}{R_1} \right), \qquad
+m_2 = \frac{1}{S_{11}S_{22}-S_{12}S_{21}}\left(\frac{S_{21}}{R_1}-\frac{S_{11}}{R_2} \right).
 \label{eq:ms}
 \end{equation}
+However, it should be noted $R_1$ and $R_2$ due to $m_1$ and $m_2$ may not be the main axes of curvature of now toroidally bent crystal, as the non-diagonal components $S_{61}$ and $S_{62}$ may cause the rotation with respect to the torques. Therefore the equations presented here apply to the case where the crystal wafer is allowed to adopt the shape freely as an reaction to the orthogonal torques \emph{e.g.} when a thin slab is bent by its edges.
+
+This deformation is implemented as \texttt{deformation.anisotropic\_plate\_fixed\_torques}. As an input, the user gives the bending radii $R_{1,2}$ from which the torques are calculated using Eq.~$\eqref{eq:ms}$. User may also give only the other of the $R_i$:s, when it is assumed that the torque acting in the orthogonal direction is zero, in which case the crystal adopts the corresponding $R_j, j \neq i$ via the anticlastic bending.
+
+\subsection{Anisotropic plate, fixed toroidal shape}
+When the shape of the bending is fixed \emph{e.g.} by bonding the crystal on a substrate, more complicated procedure than described before is needed. In the case of toroidal bending with the meridional bending radius $R_1$ (in the $x$-direction) and the sagittal radius $R_2$ (in the $y$-direction) are set the main axes of curvature, the relevant partial derivatives of $\mathbf{u}$, are \cite{Honkanen_2020}
+\begin{align}
+\frac{\partial u_x}{\partial x} &= - \frac{z}{R_1} \qquad
+\frac{\partial u_z}{\partial x} = \frac{x}{R_1} \qquad
+\frac{\partial u_z}{\partial z} = \left(S_{31}' \mu_x + S_{32}' \mu_y \right) z \nonumber \\
+\frac{\partial u_x}{\partial z} &= -\frac{x}{R_1} + \left[ 
+\left(S_{51}' \mu_x + S_{52}' \mu_y \right) \cos \alpha
+- \left(S_{41}' \mu_x + S_{42}' \mu_y \right) \sin \alpha
+\right]
+\end{align} 
+where
+\begin{align}
+\mu_x = \frac{(S_{12}' - S_{22}')(R_1 + R_2) + (S_{12}' + S_{22}')(R_1 - R_2)\cos 2 \alpha}{2(S_{11}'S_{22}'  - S_{12}'S_{12}')R_1 R_2}\\
+\mu_y = \frac{(S_{12}' - S_{11}')(R_1 + R_2) - (S_{12}' + S_{11}')(R_1 - R_2)\cos 2 \alpha}{2(S_{11}'S_{22}'  - S_{12}'S_{12}')R_1 R_2}.
+\end{align}
+$S_{ij}'$ are related to the input compliance matrix $S_{ij}$ by a rotation $\alpha$ in the $xy$-plane given by
+\begin{equation}
+\alpha = \frac{1}{2} \arctan \left[ \frac{D_\alpha(R_1 + R_2) - B_\alpha (R_1 - R_2)}{ A_\alpha (R_1 - R_2) - C_\alpha (R_1 + R_2) } \right]
+\end{equation}
+where
+\begin{align}
+A_\alpha &= S_{66} (S_{11} + S_{22} + 2 S_{12}) - (S_{61} + S_{62})^2 \\
+B_\alpha &=  2\left[S_{62} (S_{12} + S_{11}) - S_{61} (S_{12} + S_{22}) \right]   \\
+C_\alpha &= S_{66} (S_{22} - S_{11}) + S_{61}^2 - S_{62}^2  \\
+D_\alpha &= 2\left[S_{62} (S_{12} - S_{11}) + S_{61} (S_{12} - S_{22}) \right].
+\end{align}
+\emph{unless} $S_{61} = S_{62} = 0$, $S_{11} = S_{22}$, and $S_{11} + S_{22} - 2 S_{12} - S_{66} = 0$ when $\alpha = 0$.
+
+The rotation is performed to the compliance tensor by
+\begin{equation}
+s'_{ijkl} = \sum_{p,q,r,s} Q_{ip}Q_{jq}Q_{kr}Q_{ls} s_{pqrs} 
+\end{equation}
+where $Q$ is 
+\begin{equation}
+Q = \left[\begin{matrix}
+\cos \alpha & -\sin \alpha & 0 \\
+\sin \alpha & \cos \alpha & 0 \\
+0 & 0 & 1
+\end{matrix}\right].
+\end{equation}
+The Voigt notation\footnote{From \cite{Honkanen_2020}: "In the Voigt notation, a pair of indices $ij$ is replaced with a single index $m$ as follows: $11 \rightarrow 1$; $22 \rightarrow 2$; $33 \rightarrow 3$; $23,32 \rightarrow 4$; $13, 31 \rightarrow 5$ and $12, 21 \rightarrow 6$. The compliance matrix $S$ in the Voigt notation is given in terms of the compliance tensor $s$ so that $S_{mn} = (2 - \delta_{ij})(2 - \delta_{kl})s_{ijkl}$, where $ij$ and $kl$ are any pairs of indices corresponding to $m$ and $n$, respectively, and $\delta$ is the Kronecker delta."} is used to connect the compliance tensors and matrices.
+
+The fixed shape bending is implemented as \texttt{deformation.anisotropic\_plate\_fixed\_shape}.
+
 \subsection{Isotropic plate}
-The general anisotropic equations simplify considerably when assuming the plate to be isotropic. The isotropic compliance matrix is given by
+The general anisotropic equations for fixed torques and fixed shape simplify to the same solution when the plate is assumed to be isotropic. The isotropic compliance matrix is given by
 \begin{equation}
 S = \frac{1}{E}\left[\begin{matrix}
 1 & -\nu & -\nu & 0 & 0 & 0 \\
@@ -122,6 +244,69 @@ \subsection{Isotropic plate}
 \frac{\partial u_z}{\partial z} = \frac{\nu}{1-\nu}\left(\frac{1}{R_x}+\frac{1}{R_y}\right)z.
 \end{equation}
 Finally, since PyTTE assumes the top surface is at $z=0$, we need to shift the $z$-axis $z \rightarrow z + t/2 $
+\section{Crystallography and elastic constants}
+\subsection{Crystallographic vectors}
+For crystallographic data, \textsc{pyTTE} relies on the internal library of \textsc{xraylib}\cite{Schoonjans_2011}. The direct primitive vectors $\mathbf{a}_1$, $\mathbf{a}_2$, and $\mathbf{a}_3$ given in a Cartesian system are calculated from the lattice parameters $a$,$b$,$c$, $\alpha$, $\beta$, and $\gamma$ as follows
+\begin{equation}
+\mathbf{a}_1 = a \left[\begin{matrix} 1 \\ 0 \\ 0 \end{matrix}\right] \qquad
+\mathbf{a}_2 = b \left[\begin{matrix} \cos \gamma \\ \sin \gamma \\ 0 \end{matrix}\right] \qquad
+\mathbf{a}_3 = \frac{c}{\sin \gamma} \left[\begin{matrix} \cos \beta \sin \gamma \\ \cos \alpha - \cos\beta \cos\gamma \\ 
+\sqrt{\sin^2 \gamma - \cos^2 \alpha - \cos^2 \beta + 2 \cos \alpha \cos \beta \cos \gamma} \end{matrix}\right]
+\end{equation}
+The reciprocal primitive vectors are calculated according to
+\begin{equation}
+\mathbf{b}_1 = 2\pi \frac{\mathbf{a}_2 \times \mathbf{a}_3}{|\mathbf{a}_1 \times \mathbf{a}_2 \cdot \mathbf{a}_3|} \qquad
+\mathbf{b}_2 = 2\pi \frac{\mathbf{a}_3 \times \mathbf{a}_1}{|\mathbf{a}_1 \times \mathbf{a}_2 \cdot \mathbf{a}_3|} \qquad
+\mathbf{b}_3 = 2\pi \frac{\mathbf{a}_1 \times \mathbf{a}_2}{|\mathbf{a}_1 \times \mathbf{a}_2 \cdot \mathbf{a}_3|}.
+\end{equation} 
+The reciprocal vector $\mathbf{h}$ corresponding and normal to the Bragg planes with the Miller indices $(h,k,l)$ is thus
+\begin{equation}
+\mathbf{h} = h \mathbf{b}_1 + k \mathbf{b}_2 + l \mathbf{b}_3.
+\end{equation}
+Crystal directions $[n_1 n_2 n_3]$ are converted to Cartesian vectors $(x,y,z)$ followingly
+\begin{equation}
+\left[\begin{matrix} x \\ y \\ z \end{matrix}\right] = \left[\begin{matrix} \mathbf{a}_1 & \mathbf{a}_2 & \mathbf{a}_3  \end{matrix}\right] \left[\begin{matrix} n_1 \\ n_2 \\ n_3 \end{matrix}\right]
+\end{equation}
+and \emph{vice versa} by inverting $[\mathbf{a}_1 \ \mathbf{a}_2 \ \mathbf{a}_3]$.
+
+\subsection{Vector and tensor rotation}
+A general counterclockwise rotation by $\theta$ about axis $\mathbf{u} = (u_1, u_2, u_3)$, with $|\mathbf{u}| = 1$, is given by the matrix
+\begin{equation}
+Q(\mathbf{u},\theta) = \left[\begin{matrix}
+\cos \theta + u_1^2 (1 - \cos \theta) & u_1 u_2 (1 -\cos \theta) - u_3 \sin \theta &  u_1 u_3 (1 -\cos \theta) + u_2 \sin \theta \\
+u_2 u_1 (1 -\cos \theta) + u_3 \sin \theta & \cos \theta + u_2^2 (1 - \cos \theta) & u_2 u_3 (1 -\cos \theta) - u_1 \sin \theta \\
+u_3 u_1 (1 -\cos \theta) - u_2 \sin \theta &  u_3 u_2 (1 -\cos \theta) + u_1 \sin \theta & \cos \theta + u_3^2 (1 - \cos \theta)
+\end{matrix} \right],
+\end{equation}
+also known as Rodrigues' rotation formula. Rotation is applied to vector $\mathbf{v}$ by the ordinary matrix multiplication $Q\mathbf{v}$. For a 4th order tensor $t$, the rotated components are 
+\begin{equation}
+t'_{ijkl} = \sum_{p,q,r,s} Q_{ip}Q_{jq}Q_{kr}Q_{ls} t_{pqrs}.
+\end{equation}
+
+In \textsc{pyTTE}, it is taken that $\mathbf{h} \parallel \hat{\mathbf{z}}$, \emph{i.e.} the symmetric Bragg case, corresponds to the asymmetry angle $\phi=0$. Thus in the most general case the elastic tensors go through the following three rotations:
+\begin{enumerate}
+\item Rotate elastic tensors and direction vectors so that $\mathbf{h}$ is parallel to $z$-axis
+\item Apply a rotation about $z$-axis to align the crystal directions in $xy$-plane
+\item Apply the asymmetry by performing the rotation of $\phi$ about $y$-axis.
+\end{enumerate}
+Assuming that at least either of $h$ an $k$ is non-zero, the rotation of $\mathbf{h}= (h_1,h_2,h_3)$ (step 1) is performed with the following axis and angle
+\begin{equation}
+\mathbf{u} = \frac{1}{\sqrt{h_1^2 + h_2^2}} \left[\begin{matrix} h_2 \\ -h_1 \\ 0 \end{matrix}\right] \qquad
+\theta = \arccos \left( \frac{h_3}{\sqrt{h_1^2 + h_2^2 + h_3^2}} \right).
+\end{equation}
+If $h=k=0$, a rotation of $\theta = \pi$ about $\mathbf{u} = -\hat{\mathbf{y}}$ is applied when $l<0$; no rotation is needed for $l>0$. For the in-plane rotation (step 2), the axis is $\mathbf{u} = [0,0,1]^{\mathrm{T}}$ and for the asymmetry rotation (step 3) $\mathbf{u} = [0,1,0]^{\mathrm{T}}$ and $\theta = \phi$.\footnote{Note that $\phi$ is defined clockwise-positive but about $-\hat{\mathbf{y}}$, not $\hat{\mathbf{y}}$}
+
+The crystal directions $[n_1' n_2' n_3']$ after a rotation $Q$ are calculated as follows
+\begin{equation}
+ \left[\begin{matrix} n_1' \\ n_2' \\ n_3' \end{matrix}\right] = 
+ (Q \left[\begin{matrix} \mathbf{a}_1 & \mathbf{a}_2 & \mathbf{a}_3 \end{matrix} \right])^{-1} \mathbf{r}
+\end{equation}
+where $\mathbf{r}$ is an arbitrary direction in terms of Cartesian coordinates. (Although not clear from the notation, $Q \left[\begin{matrix} \mathbf{a}_1 & \mathbf{a}_2 & \mathbf{a}_3 \end{matrix} \right]$ and it's inverse are square matrices.)
+
+\subsection{Elastic constants}
+PyTTE v 1.0 has built-in elastic tensors for a handful of most commonly encountered crystals taken from CRC Handbook of Chemistry and Physics, 82nd edition.
+
+
 \bibliographystyle{unsrt}
 \bibliography{documentation}
 \end{document}
\ No newline at end of file
diff --git a/examples/TTcrystal.ipynb b/examples/TTcrystal.ipynb
new file mode 100644
index 0000000..95ccc62
--- /dev/null
+++ b/examples/TTcrystal.ipynb
@@ -0,0 +1,714 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# TTcrystal - Define the crystal parameters\n",
+    "\n",
+    "In this file the usage of TTcrystal class is demonstrated. TTcrystal holds all the necessary information about the crystal, it's reflection and deformation that is passed as an input to the TT-solver. Let's start by doing some imports:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import sys\n",
+    "import os.path\n",
+    "\n",
+    "sys.path.insert(1, '..')\n",
+    "\n",
+    "from pyTTE import TTcrystal, Quantity"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "TTcrystal object can be initialized either by passing the parameters of the crystal as keyword arguments, or by reading them from a file. Let's examine the former case first.\n",
+    "\n",
+    "The initialization of the class requires at least the following three parameters: _crystal_, _hkl_, _thickness_. This initializes a symmetric Bragg case of reflection $(hkl)$ of a perfect, non-deformed crystal. For example:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.7071 -0.7071 -1.    ]\n",
+      "    y || [-0.7071  0.7071 -1.    ]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0055 -0.0008 -0.0013  0.      0.      0.0009]\n",
+      " [-0.0008  0.0055 -0.0013 -0.      0.      0.0009]\n",
+      " [-0.0013 -0.0013  0.0059 -0.     -0.     -0.0018]\n",
+      " [ 0.     -0.     -0.      0.0161 -0.0035  0.    ]\n",
+      " [-0.      0.     -0.     -0.0035  0.0161  0.    ]\n",
+      " [ 0.0009  0.0009 -0.0018  0.      0.      0.0179]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal = TTcrystal(crystal = 'Si', hkl=[6,6,0], thickness = Quantity(1,'mm'))\n",
+    "\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The crystallographic parameters are read from _xraylib_. The elastic tensor data is saved in _pyTTE.elastic_tensors.py_.\n",
+    "\n",
+    "TTcrystal has also many optional parameters to define e.g. asymmetry angle, in plane rotation, deformation andd so on. For extensive list use `help(TTcrystal)`. As an example, a Ge(555) reflection in the Laue case with 5 degree asymmetry and the Debye-Waller factor of 0.8 is defined as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Ge\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.565735 nm,  b = 0.565735 nm,  c = 0.565735 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5657 0.     0.    ]\n",
+      "    a2 = [0.     0.5657 0.    ]\n",
+      "    a3 = [0.     0.     0.5657]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.1062 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.1062 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.1062]\n",
+      "\n",
+      "Reflection: [5, 5, 5]\n",
+      "Asymmetry angle: 95 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [0.8097 0.949  1.    ]\n",
+      "    y || [-0.2679  1.     -0.7321]\n",
+      "    z || [-1.      0.1916  0.6278]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 0.8\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0065 -0.0009 -0.0012 -0.0003  0.0005 -0.    ]\n",
+      " [-0.0009  0.0073 -0.002  -0.0001  0.0015  0.0017]\n",
+      " [-0.0012 -0.002   0.0076  0.0004 -0.002  -0.0016]\n",
+      " [-0.0003 -0.0001  0.0004  0.0178 -0.0032  0.003 ]\n",
+      " [ 0.0005  0.0015 -0.002  -0.0032  0.0209 -0.0006]\n",
+      " [-0.      0.0017 -0.0016  0.003  -0.0006  0.0222]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal = TTcrystal(crystal = 'Ge', hkl=[5,5,5], thickness = Quantity(1,'mm'), asymmetry = Quantity(95,'deg'), debye_waller = 0.8)\n",
+    "\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "(Note that the symmetric Laue case would be defined by `asymmetry = Quantity(90,'deg')`).\n",
+    "\n",
+    "It is also possible to adjust the crystal parameters after initialization:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 16,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "BEFORE ADJUSTMENT:\n",
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.7071 -0.7071 -1.    ]\n",
+      "    y || [-0.7071  0.7071 -1.    ]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0055 -0.0008 -0.0013  0.      0.      0.0009]\n",
+      " [-0.0008  0.0055 -0.0013 -0.      0.      0.0009]\n",
+      " [-0.0013 -0.0013  0.0059 -0.     -0.     -0.0018]\n",
+      " [ 0.     -0.     -0.      0.0161 -0.0035  0.    ]\n",
+      " [-0.      0.     -0.     -0.0035  0.0161  0.    ]\n",
+      " [ 0.0009  0.0009 -0.0018  0.      0.      0.0179]] GPa^-1\n",
+      "\n",
+      "AFTER ADJUSTMENT:\n",
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: -45 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [-0. -0. -1.]\n",
+      "    y || [-1.  1. -0.]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 500 um\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0077 -0.0021 -0.0021 -0.      0.      0.    ]\n",
+      " [-0.0021  0.0059 -0.0004  0.     -0.      0.    ]\n",
+      " [-0.0021 -0.0004  0.0059 -0.     -0.      0.    ]\n",
+      " [-0.      0.      0.      0.0196  0.     -0.    ]\n",
+      " [ 0.     -0.     -0.     -0.      0.0126  0.    ]\n",
+      " [ 0.      0.      0.     -0.      0.      0.0126]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal = TTcrystal(crystal = 'Si', hkl=[6,6,0], thickness = Quantity(1,'mm'))\n",
+    "\n",
+    "print('BEFORE ADJUSTMENT:')\n",
+    "print(xtal)\n",
+    "\n",
+    "xtal.set_thickness(Quantity(500,'um'))\n",
+    "xtal.set_in_plane_rotation(Quantity(-45,'deg'))\n",
+    "\n",
+    "print('\\nAFTER ADJUSTMENT:')\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Kinematical diffraction conditions\n",
+    "\n",
+    "`TTcrystal` implements two functions `bragg_energy` and `bragg_angle` that can be used to calculate the photon energy corresponding to the given Bragg angle and vice versa."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 17,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Energy of photons corresponding to the Bragg angle 85 deg: 9.723049764800313 keV\n",
+      "Bragg angle corresponding to the photon energy 9.723 keV: 85.0033530351427 deg\n"
+     ]
+    }
+   ],
+   "source": [
+    "incidence_angle = Quantity(85,'deg')\n",
+    "photon_energy = Quantity(9.723,'keV')\n",
+    "\n",
+    "print('Energy of photons corresponding to the Bragg angle '+ str(incidence_angle) +': ' + str(xtal.bragg_energy(incidence_angle)))\n",
+    "print('Bragg angle corresponding to the photon energy '+ str(photon_energy) +': ' + str(xtal.bragg_angle(photon_energy)))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Elastic constants\n",
+    "\n",
+    "Currently (v. 1.0) _pyTTE_ contains elastic tensors only for a handful of crystals that are used most often. In other cases a KeyError will be raised."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 18,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\"Elastic parameters for 'NaCl' not found!\"\n"
+     ]
+    }
+   ],
+   "source": [
+    "try:\n",
+    "    TTcrystal(crystal = 'NaCl', hkl=[6,6,0], thickness = Quantity(1,'mm'))\n",
+    "except KeyError as ke:\n",
+    "    print(ke)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In such cases the elastic parameters can be given as input. For example, in the isotropic case Young's modulus and Poisson's ratio are given as follows:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 19,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: NaCl\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.563978 nm,  b = 0.563978 nm,  c = 0.563978 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.564 0.    0.   ]\n",
+      "    a2 = [0.    0.564 0.   ]\n",
+      "    a3 = [0.    0.    0.564]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.1408 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.1408 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.1408]\n",
+      "\n",
+      "Reflection: [1, 0, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [-0.  0. -1.]\n",
+      "    y || [0. 1. 0.]\n",
+      "    z || [ 1. -0. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: isotropic toroidal (built-in)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: isotropic\n",
+      "Young's modulus E: 39.98 GPa\n",
+      "Poisson's ratio nu: 0.26\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal =  TTcrystal(crystal = 'NaCl', hkl=[1,0,0], thickness = Quantity(1,'mm'), E = Quantity(39.98,'GPa'), nu = 0.26)\n",
+    "\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Deformation\n",
+    "\n",
+    "PyTTE has three different built-in deformation models for toroidal bending, one for isotropic materials and two for anisotropic. The main parameters defining the deformation are elastic constants (either $E$ and $\\mu$, or $S$) and the bending radii. The meridional and sagittal bending radii are given with the keywords `Rx` and `Ry`, respectively. In the case of spherical bending, a single keyword `R` can be used. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 20,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.7071 -0.7071 -1.    ]\n",
+      "    y || [-0.7071  0.7071 -1.    ]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: 0.5 m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0055 -0.0008 -0.0013  0.      0.      0.0009]\n",
+      " [-0.0008  0.0055 -0.0013 -0.      0.      0.0009]\n",
+      " [-0.0013 -0.0013  0.0059 -0.     -0.     -0.0018]\n",
+      " [ 0.     -0.     -0.      0.0161 -0.0035  0.    ]\n",
+      " [-0.      0.     -0.     -0.0035  0.0161  0.    ]\n",
+      " [ 0.0009  0.0009 -0.0018  0.      0.      0.0179]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal = TTcrystal(crystal = 'Si', hkl=[6,6,0], thickness = Quantity(1,'mm'), Rx = Quantity(0.5,'m'), Ry = 'inf')\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "For anisotropic crystals, there is also an additional keyword `fix_to_axes`. `fix_to_axes = 'torques'` is used when the wafer is bent by two orthogonal torques which act about $x$- and $y$-axes, respectively. The deformation field is still determined by the curvature radii `Rx` and `Ry` in the $x$- and $y$-directions but due to the non-diagonal elements of $S$ these may not be the main axis of curvature. This situation is encountered _e.g._ when a free-standing crystal slab is bend by its ends. If `Rx` or `Ry` is `None`, then the corresponding torque is set to zero and the radius of curvature is determined via anticlastic bending.\n",
+    "\n",
+    "The other option is `fix_to_axes = 'shape'` which fixes `Rx` and `Ry` as the main radii of curvatures and finds the torques needed for such deformation by letting them rotate in the $xy$-plane. This is the case when the wafer is forced to adopt a specific case _e.g._ that of a substrate. In this case `None` values of `Rx` or `Ry` are interpreted as `inf`:s."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 21,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.7071 -0.7071 -1.    ]\n",
+      "    y || [-0.7071  0.7071 -1.    ]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed torques (built-in)\n",
+      "Meridional bending radius: 0.5 m\n",
+      "Sagittal bending radius: None\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0055 -0.0008 -0.0013  0.      0.      0.0009]\n",
+      " [-0.0008  0.0055 -0.0013 -0.      0.      0.0009]\n",
+      " [-0.0013 -0.0013  0.0059 -0.     -0.     -0.0018]\n",
+      " [ 0.     -0.     -0.      0.0161 -0.0035  0.    ]\n",
+      " [-0.      0.     -0.     -0.0035  0.0161  0.    ]\n",
+      " [ 0.0009  0.0009 -0.0018  0.      0.      0.0179]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal = TTcrystal(crystal = 'Si', hkl=[6,6,0], thickness = Quantity(1,'mm'), Rx = Quantity(0.5,'m'), Ry = None, fix_to_axes = 'torques')\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "For isotropic material, the main radii of curvature always follow the bending torques, so there is no difference between `fix_to_axes = 'torques'` and `fix_to_axes = 'shape'`. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 22,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.7071 -0.7071 -1.    ]\n",
+      "    y || [-0.7071  0.7071 -1.    ]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: isotropic toroidal (built-in)\n",
+      "Meridional bending radius: 0.5 m\n",
+      "Sagittal bending radius: None\n",
+      "Material elastic isotropy: isotropic\n",
+      "Young's modulus E: 160 GPa\n",
+      "Poisson's ratio nu: 0.27\n"
+     ]
+    }
+   ],
+   "source": [
+    "xtal = TTcrystal(crystal = 'Si', hkl=[6,6,0], thickness = Quantity(1,'mm'), Rx = Quantity(0.5,'m'), Ry = None, fix_to_axes = 'torques', E = Quantity(160, 'GPa'),nu = 0.27)\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Arbitrary deformation fields can be used by defining a custom function that takes in the $x$ and $z$ coordinates in micrometer and returns 2x2 array $J$ so that\n",
+    "\n",
+    "$\\begin{equation}\n",
+    "J = \\left[\\begin{matrix}\n",
+    "\\frac{\\partial u_x}{\\partial x} & \\frac{\\partial u_x}{\\partial z} \\\\\n",
+    "\\frac{\\partial u_z}{\\partial x} & \\frac{\\partial u_z}{\\partial z} \n",
+    "\\end{matrix}\\right]\n",
+    "\\end{equation}$\n",
+    "\n",
+    "The custom Jacobian is added after initialization using `set_deformation`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 23,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [6, 6, 0]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.7071 -0.7071 -1.    ]\n",
+      "    y || [-0.7071  0.7071 -1.    ]\n",
+      "    z || [ 1.  1. -0.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: custom Jacobian (bending radii and elastic parameters neglected)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0055 -0.0008 -0.0013  0.      0.      0.0009]\n",
+      " [-0.0008  0.0055 -0.0013 -0.      0.      0.0009]\n",
+      " [-0.0013 -0.0013  0.0059 -0.     -0.     -0.0018]\n",
+      " [ 0.     -0.     -0.      0.0161 -0.0035  0.    ]\n",
+      " [-0.      0.     -0.     -0.0035  0.0161  0.    ]\n",
+      " [ 0.0009  0.0009 -0.0018  0.      0.      0.0179]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "from pyTTE.deformation import isotropic_plate\n",
+    "\n",
+    "ujac = isotropic_plate(1,1,0.27,1e-4)[0]\n",
+    "\n",
+    "xtal = TTcrystal(crystal = 'Si', hkl=[6,6,0], thickness = Quantity(1,'mm'))\n",
+    "xtal.set_deformation(ujac)\n",
+    "\n",
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Initialization from a file\n",
+    "\n",
+    "TTcrystal parameters can be written in a file, the path of which is passed as an argument to the constructor."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 24,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: LiF\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.402629 nm,  b = 0.402629 nm,  c = 0.402629 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.4026 0.     0.    ]\n",
+      "    a2 = [0.     0.4026 0.    ]\n",
+      "    a3 = [0.     0.     0.4026]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [15.6054 -0.     -0.    ]\n",
+      "    b2 = [ 0.     15.6054 -0.    ]\n",
+      "    b3 = [ 0.      0.     15.6054]\n",
+      "\n",
+      "Reflection: [2, 0, 0]\n",
+      "Asymmetry angle: 2.5 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.0437  0.     -1.    ]\n",
+      "    y || [0. 1. 0.]\n",
+      "    z || [ 1.     -0.      0.0437]\n",
+      "\n",
+      "Crystal thickness: 200.0 um\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: 1.0 m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0116 -0.0034 -0.0034  0.     -0.0006 -0.    ]\n",
+      " [-0.0034  0.0116 -0.0034 -0.      0.      0.    ]\n",
+      " [-0.0034 -0.0034  0.0116  0.      0.0006  0.    ]\n",
+      " [ 0.     -0.      0.      0.0157  0.      0.    ]\n",
+      " [-0.0006 -0.      0.0006  0.      0.0158  0.    ]\n",
+      " [-0.      0.      0.     -0.      0.      0.0157]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "'''\n",
+    "Contents of TTcrystal_init.inp:\n",
+    "\n",
+    "crystal LiF\n",
+    "hkl 2 0 0\n",
+    "thickness 200 um\n",
+    "asymmetry 2.5 deg\n",
+    "Rx 1 m\n",
+    "'''\n",
+    "\n",
+    "print(TTcrystal(filepath = 'TTcrystal_init.inp'))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/examples/TTcrystal_init.inp b/examples/TTcrystal_init.inp
new file mode 100644
index 0000000..1f4c85d
--- /dev/null
+++ b/examples/TTcrystal_init.inp
@@ -0,0 +1,5 @@
+crystal LiF
+hkl 2 0 0
+thickness 200 um
+asymmetry 2.5 deg
+Rx 1 m
diff --git a/examples/TTscan.ipynb b/examples/TTscan.ipynb
new file mode 100644
index 0000000..0d5fe53
--- /dev/null
+++ b/examples/TTscan.ipynb
@@ -0,0 +1,251 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# TTscan - Define the scan and solver parameters\n",
+    "\n",
+    "In this file the usage of TTscan class is demonstrated. TTscan holds the information on what kind of a scan is performed (energy or angle, beam polarization) and some solver parameters. Let's start by doing some imports:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import sys\n",
+    "import os.path\n",
+    "\n",
+    "import numpy as np\n",
+    "\n",
+    "sys.path.insert(1, '..')\n",
+    "\n",
+    "from pyTTE import TTscan, Quantity"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "TTscan object can be initialized either by passing the parameters of the crystal as keyword arguments, or by reading them from a file. Let's examine the former case first.\n",
+    "\n",
+    "The initialization of the class requires at least the following three parameters: _constant_, _scan_, _polarization_. `constant` is a Quantity object either of type energy or angle which determines the type of the scan _i.e._ if the constant is of type energy, then the incident photon energy is kept constant and the rocking angle is scanned, and vice versa.\n",
+    "\n",
+    "`scan` is a numpy array wrapped in a Quantity instance of type energy or angle, opposite to that of `constant`. The scan values are given relative to the value corresponding to `constant` via the kinematical Bragg condition. For example, if `constant` $= \\theta$, then the zero value of `scan` corresponds to the photon energy $hc/2 d \\sin \\theta$. \n",
+    "\n",
+    "`polarization` is either `'sigma'` or `'s'` for $\\sigma$-polarized beam and `'pi'` or `'p'` for $\\pi$-polarized beam.\n",
+    "\n",
+    "For example, a energy scan from -100 meV to 100 meV about the kinematical diffraction energy at 87$^\\circ$ angle with $\\sigma$-polarized beam is defined by:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : energy\n",
+      "Scan constant : 87 deg\n",
+      "Polarization  : sigma\n",
+      "Scan points   : 150\n",
+      "Scan range    : manual from -100.0 to 100.0 meV\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1e-10 um\n",
+      "Alternative starting depth : None\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "tts = TTscan(constant = Quantity(87,'deg'), scan=Quantity(np.linspace(-100,100,150),'meV'), polarization = 's')\n",
+    "\n",
+    "print(tts)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "`scan` may also be a positive integer indicating the number of scan points. TakagiTaupin will then automatically calculate the scan limits which may not be perfect but allows user to find the optimal range quicker than by manual trial and error."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : angle\n",
+      "Scan constant : 10 keV\n",
+      "Polarization  : pi\n",
+      "Scan points   : 100\n",
+      "Scan range    : automatic\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1e-10 um\n",
+      "Alternative starting depth : None\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "tts = TTscan(constant = Quantity(10,'keV'), scan=100, polarization = 'p')\n",
+    "\n",
+    "print(tts)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Solver parameters\n",
+    "\n",
+    "TTscan also contains optional parameter for the integrator. Currently (v.1.0) PyTTE uses only the variable-coeffient ordinary differential equation solver (VODE) with backward\n",
+    "differential formula (BDF) method. However, it is possible to adjust the minimum intergration step of the VODE integrator which may speed up the integration but lead to numerical instability when the diffraction condition is not met in the crystal. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : angle\n",
+      "Scan constant : 10 keV\n",
+      "Polarization  : pi\n",
+      "Scan points   : 100\n",
+      "Scan range    : automatic\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 0.001 um\n",
+      "Alternative starting depth : None\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "tts = TTscan(constant = Quantity(10,'keV'), scan=100, polarization = 'p',solver = 'zvode_bdf', integration_step = Quantity(0.001, 'um'))\n",
+    "\n",
+    "print(tts)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "For thick crystals with a strain gradient, the integration will take a long time and numerical instability will eventually occur. If the diffraction takes place in the upper part of the crystal, the performance of the integration can be improved by starting the integration somewhere inside the crystal. This can be controlled with `start_depth`, which should be a value in between 0 (the top) and -thickness (the bottom of the crystal)."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : angle\n",
+      "Scan constant : 10 keV\n",
+      "Polarization  : pi\n",
+      "Scan points   : 100\n",
+      "Scan range    : automatic\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1e-10 um\n",
+      "Alternative starting depth : -100 um\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "tts = TTscan(constant = Quantity(10,'keV'), scan=100, polarization = 'p', start_depth = Quantity(-100, 'um'))\n",
+    "\n",
+    "print(tts)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "## Initialization from a file\n",
+    "\n",
+    "TTscan parameters can be written in a file, the path of which is passed as an argument to the constructor."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : angle\n",
+      "Scan constant : 8.0 keV\n",
+      "Polarization  : sigma\n",
+      "Scan points   : 150\n",
+      "Scan range    : manual from -100.0 to 25.0 arcsec\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1.0 nm\n",
+      "Alternative starting depth : None\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "'''\n",
+    "Contents of TTscan_init.inp:\n",
+    "\n",
+    "constant 8 keV\n",
+    "scan -100 25 150 arcsec\n",
+    "polarization sigma\n",
+    "solver zvode_bdf\n",
+    "integration_step 1 nm\n",
+    "'''\n",
+    "\n",
+    "print(TTscan(filepath = 'TTscan_init.inp'))"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/examples/TTscan_init.inp b/examples/TTscan_init.inp
new file mode 100644
index 0000000..0831f24
--- /dev/null
+++ b/examples/TTscan_init.inp
@@ -0,0 +1,5 @@
+constant 8 keV
+scan -100 25 150 arcsec
+polarization sigma
+solver zvode_bdf
+integration_step 1 nm
\ No newline at end of file
diff --git a/examples/TakagiTaupin.ipynb b/examples/TakagiTaupin.ipynb
new file mode 100644
index 0000000..1a44899
--- /dev/null
+++ b/examples/TakagiTaupin.ipynb
@@ -0,0 +1,862 @@
+{
+ "cells": [
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "# TakagiTaupin - Calculate the Takagi-Taupin curves\n",
+    "\n",
+    "This file demonstrates the usage of TakagiTaupin that is the main class of the package. TakagiTaupin solves the TT-equations for deformed crystal using the information given to it in TTcrystal and TTscan. For detailed instruction on their use, please refer to the respective documentation and example Jupyter notebooks."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 1,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "import sys\n",
+    "import os.path\n",
+    "\n",
+    "import numpy as np\n",
+    "import matplotlib.pyplot as plt\n",
+    "\n",
+    "sys.path.insert(1, '..')\n",
+    "from pyTTE import TakagiTaupin, TTcrystal, TTscan, Quantity"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### First example: rocking curve of a perfect Si crystal in the Bragg case\n",
+    "\n",
+    "Let us start with a simple example of calculating the rocking curve of the (111) reflection of a 1 mm thick Si perfect, single crystal. First we define the crystal using TTcrystal class:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 2,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "xtal = TTcrystal(crystal='Si', hkl=[1,1,1], thickness=Quantity(1,'mm'))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The given keywords `crystal`, `hkl`, and `thickness` are the required minimum amount of parameters to define a crystal. To avoid conversion errors, all the quantities with physical units are handled in _pyTTE_ using the Quantity class which supports most units commonly used in the context of X-ray diffraction.\n",
+    "\n",
+    "Full information of a TTcrystal instance can be seen by passing it to the `print` function:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 3,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Crystal: Si\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.543069 nm,  b = 0.543069 nm,  c = 0.543069 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.5431 0.     0.    ]\n",
+      "    a2 = [0.     0.5431 0.    ]\n",
+      "    a3 = [0.     0.     0.5431]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [11.5698 -0.     -0.    ]\n",
+      "    b2 = [ 0.     11.5698 -0.    ]\n",
+      "    b3 = [ 0.      0.     11.5698]\n",
+      "\n",
+      "Reflection: [1, 1, 1]\n",
+      "Asymmetry angle: 0 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 1.     -0.2679 -0.7321]\n",
+      "    y || [-0.2679  1.     -0.7321]\n",
+      "    z || [1. 1. 1.]\n",
+      "\n",
+      "Crystal thickness: 1 mm\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: inf m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0059 -0.0015 -0.001  -0.0012  0.0012  0.    ]\n",
+      " [-0.0015  0.0059 -0.001   0.0012 -0.0012  0.    ]\n",
+      " [-0.001  -0.001   0.0053  0.      0.     -0.    ]\n",
+      " [-0.0012  0.0012  0.      0.0173 -0.     -0.0024]\n",
+      " [ 0.0012 -0.0012  0.      0.      0.0173 -0.0024]\n",
+      " [ 0.      0.     -0.     -0.0024 -0.0024  0.0149]] GPa^-1\n"
+     ]
+    }
+   ],
+   "source": [
+    "print(xtal)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In addition to the crystal parameters, we need to define the scan using the TTscan class. Let's fix the photon energy of the incident beam to 5 keV, use $\\sigma$-polarization and scan the rocking angle from -50 to 150 µrad in 150 steps. In _pyTTE_, all scans are performed relative to the values fulfilling the kinematical Bragg condition $\\lambda = 2 d \\sin \\theta$.  "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 4,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : angle\n",
+      "Scan constant : 5 keV\n",
+      "Polarization  : sigma\n",
+      "Scan points   : 150\n",
+      "Scan range    : manual from -50.0 to 150.0 urad\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1e-10 um\n",
+      "Alternative starting depth : None\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "scan = TTscan(constant = Quantity(5,'keV'), scan = Quantity(np.linspace(-50,150,150),'urad'), polarization = 'sigma')\n",
+    "print(scan)"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The rocking curve is now calculated by initializing the TakagiTaupin instance with the crystal and scan parameter instances, and calling `.run()`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 5,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Solving the 1D Takagi-Taupin equation for Si(1,1,1) reflection\n",
+      "---------------------------------------------------------------\n",
+      "\n",
+      "The direction of diffraction out of the crystal -> Bragg case\n",
+      "Solving for sigma-polarization\n",
+      "Asymmetry angle : 0.0 deg\n",
+      "Wavelength      : 0.247968386 nm\n",
+      "Energy          : 5.0 keV\n",
+      "Bragg angle     : 23.292879649001986 deg\n",
+      "Incidence angle : 23.292879649001986 deg\n",
+      "Exit angle      : 23.292879649001986 deg\n",
+      "\n",
+      "Structure factors\n",
+      "F0   : (115.0489207774186+6.498559984990174j)\n",
+      "Fh   : (46.915823878813626-40.417263893823474j)\n",
+      "Fb   : (40.417263893823446+46.91582387881365j)\n",
+      "\n",
+      "Susceptibilities\n",
+      "chi0 : (-3.961773705462428e-05+2.237815348282492e-06j)\n",
+      "chih : (-1.615572542160448e-05-1.3917910073321994e-05j)\n",
+      "chib : (-1.3917910073321984e-05+1.6155725421604487e-05j)\n",
+      "\n",
+      "(Mean F and chi values for energy scan)\n",
+      "\n",
+      "Transmission in the Bragg case not implemented!\n",
+      "\n",
+      "Calculating the TT-curve using 4 cores.\n",
+      "Solving...0%\n",
+      "Done.\n"
+     ]
+    }
+   ],
+   "source": [
+    "tt = TakagiTaupin(xtal, scan)\n",
+    "\n",
+    "scan_vector, reflectivity, transmission = tt.run()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "(Note that Jupyter does not update the solving process in the notebook but in the terminal/command prompt.)\n",
+    "\n",
+    "`.run()` returns the solution but also stores it in `.solution` with all the relevant information and settings pertaining to it. The stored solution can be quickly visualized by calling `.plot()` and saved as an ASCII file with `.save(filename)` "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 6,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "tt.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "For reference, the same curve was calculated using _XCRYSTAL_ in _XOP_ 2.4 (http://dx.doi.org/10.1117/12.560903) with the EPDL97 anomalous scattering cross-sections, that are also used by _xraylib_. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 7,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ref = np.loadtxt('reference_spectra/xop_Si_111_bragg.dat')\n",
+    "\n",
+    "plt.plot(scan_vector,reflectivity)\n",
+    "plt.plot(ref[:,0],ref[:,1])\n",
+    "plt.legend(['pyTTE','XCRYSTAL'])\n",
+    "plt.ylabel('Reflectivity')\n",
+    "plt.xlabel('Angle (urad)')\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "The result is practically identical with the one calculated with _pyTTE_. Nearly insignificant deviations are probably explained by slight differences in structure factors: \n",
+    "\n",
+    "_PyTTE_ output:\n",
+    "```\n",
+    "F0   :  (115.0489207774186+6.498559984990174j)\n",
+    "Fh   :  (46.915823878813626-40.417263893823474j)\n",
+    "Fb   :  (40.417263893823446+46.91582387881365j)\n",
+    "```\n",
+    "\n",
+    "_Crystal Parameters_ of `XCRYSTAL`:\n",
+    "```\n",
+    " Structure factor F(0,0,0) =  (  115.01669312000000     ,  6.5506672799999999     )\n",
+    " Structure factor FH =  (  47.595073721453730     , -41.044406441453731     )\n",
+    " Structure factor FH_BAR =  (  41.044406441453731     ,  47.595073721453730     )\n",
+    "```"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Second example: The Laue case and automatic scan limits\n",
+    "\n",
+    "_PyTTE_ does not require explicit differentiation between the Bragg case (reflection geometry) and the Laue case (transmission geometry) since the diffraction geometry is determined automatically from the propagation direction of the diffracted beam. This can be controlled via the asymmetry angle. For a symmetric Laue case, asymmetry angle is set to 90 degrees:"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 8,
+   "metadata": {},
+   "outputs": [],
+   "source": [
+    "xtal = TTcrystal(crystal='Ge', hkl=[4,0,0], thickness=Quantity(100,'um'), asymmetry = Quantity(90,'deg'))"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "In the previous example we defined the scan points manually but it can be inconvenient to iterate good values for the scan limits, especially with bent crystals. To make the task easier, _pyTTE_ can try to determine the limits automatically by giving `TTscan` the number of scan points instead of a scan vector. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 9,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "Scan type     : angle\n",
+      "Scan constant : 7 keV\n",
+      "Polarization  : sigma\n",
+      "Scan points   : 150\n",
+      "Scan range    : automatic\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1e-10 um\n",
+      "Alternative starting depth : None\n",
+      "\n"
+     ]
+    }
+   ],
+   "source": [
+    "scan = TTscan(constant = Quantity(7,'keV'), scan = 150, polarization = 'sigma')\n",
+    "print(scan)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 10,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Solving the 1D Takagi-Taupin equation for Ge(4,0,0) reflection\n",
+      "---------------------------------------------------------------\n",
+      "\n",
+      "Using automatically determined scan limits:\n",
+      "Theta min: -100.21483794864227 urad\n",
+      "Theta max: 100.22290397615485 urad\n",
+      "\n",
+      "The direction of diffraction in to the crystal -> Laue case\n",
+      "Solving for sigma-polarization\n",
+      "Asymmetry angle : 90.0 deg\n",
+      "Wavelength      : 0.17712027571428574 nm\n",
+      "Energy          : 7.0 keV\n",
+      "Bragg angle     : 38.7673720607094 deg\n",
+      "Incidence angle : 128.76737206070942 deg\n",
+      "Exit angle      : -51.2326279392906 deg\n",
+      "\n",
+      "Structure factors\n",
+      "F0   : (249.73280927589715+9.339607731323417j)\n",
+      "Fh   : (157.1390925424523+9.339607731323358j)\n",
+      "Fb   : (157.1390925424523+9.339607731323472j)\n",
+      "\n",
+      "Susceptibilities\n",
+      "chi0 : (-3.8811010956508024e-05+1.451469748972486e-06j)\n",
+      "chih : (-2.4421008437153955e-05+1.451469748972477e-06j)\n",
+      "chib : (-2.4421008437153955e-05+1.4514697489724946e-06j)\n",
+      "\n",
+      "(Mean F and chi values for energy scan)\n",
+      "\n",
+      "\n",
+      "Calculating the TT-curve using 4 cores.\n",
+      "Solving...0%\n",
+      "Done.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYgAAAEWCAYAAAB8LwAVAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOzdd3yb9bX48c/x3ttOYmc4w9mLTFYIlE3Z4zK6oIOb0sKvtxfa0vbS0vZ2l5aywmqhhVtKRwotAcoKkCY0g5iQbWc7TmLH2/G2zu+PRwqKI9myNTxy3q+XXpIePePYlnX03aKqGGOMMV1F9XcAxhhjBiZLEMYYY3yyBGGMMcYnSxDGGGN8sgRhjDHGJ0sQxhhjfLIEMUSIiIrIhBCfc7SINIpIdCjP28dYPiEi/4zwNfeIyHl9PDZsvzv3eceF6Fw3i8jKUJzLDD2WIAYY9z+/5+YSkWav55+IZCyquk9VU1S1s0uMS71iahORdq/nL4cplmdV9YJwnDsUuiYTf7+7UHCfd1dvjxORQvcXiZhQx+Q+/3dF5JlwnNv0j7C8UUzfqWqK57GI7AE+r6qv919EJ1LVJcAScD4UgAmq+sl+DcoYE3JWghgkRGSBiKwWkVoROSgiD4pInJ99zxSR/SJyjohkisg/RKRSRGrcj0d67TtWRN4RkQYReV1EHvJ8C+zLN04R+ZOIHBKROvd5p3m9tkJEPu/1/LjqDfe17hCRXSJyRER+JiJR3ey7RERK3D/XQyIi3fzu1olIvYgcFpH7vF67XEQ2u3+vK0Rkip9zPCUiP/B6fraIlLkf/x4YDfzdXYr6WtffnYjki8iLIlItIqUi8gWvc31XRJ4Xkd+5/w6bRWReN7/jY9WJ7rgeEpGX3Mf+W0TG+zn0Hfd9rTvO07zO+XP373G3iFzstT1dRJ50v+cOiMgPpA/VZiLyDRHZ6Y5xi4hc1eXnf8bredffXcAxiEi0iHzT61rrRWSU+7X73f8X9e7ti7yO6+49cqqIrHK/Rz4QkbN7+/MPVpYgBo9O4L+AHOA04Fzgtq47iciFwB+Aa1T1LZy/8W+BMTgfYs3Ag16H/B+wBsgGvgt8Ksg4XwaKgDzgfeDZXh5/FTAPmANcAXy2m30vBeYDs4D/AC70s9/9wP2qmgaMB54HEJGJOL+rrwC5wHKcD3mfidcfVf0UsA+4zF3981Mfu/0BKAPygWuBH4rIuV6vXw48B2QAL3L836gnNwL3AplAKfC/fvY7y32f4Y5ztfv5QmA7znvrp8CTXsn2aaADmACcAlwAfJ7e2wksAtLdsT4jIiMCPLY3MXwV5/dxCZCG8/5pcr+2FpgNZOG87/8kIgnu1/y9RwqAl4AfuI+7E/iLiOQGGPugZglikFDV9ar6nqp2qOoe4FFgcZfdrgMeAy5R1TXu46pU9S+q2qSqDTgfHovBaUjF+YC9R1XbVHUlzodTMHH+RlUbVLUVJ+HMEpH0XpziJ6parar7gF/h/LP782NVrXXv+xbOP78v7cAEEclR1UZVfc+9/XrgJVV9TVXbgZ8DicDpvYi3R+5vsGcCX1fVFlUtBp7g+GS8UlWXu9ssfo+T9AL1V1Vdo6odOAnZ3+/Bn72q+rj72k8DI4BhIjIMuBj4iqoeVdUK4JfADb08P6r6J1UtV1WXqv4RKAEW9HRcH2L4PPBtVd2ujg9UtcodwzPu/4cOVf0FEA9Mch/n7z3ySWC5+2/jUtXXgHU4CWjIswQxSIjIRHGqhw6JSD3wQ5xvfN6+Ajyvqh96HZckIo+KyF73ce8AGe4iej5QrapNXufY7+f6i+SjhujNfvaJFpEfu4v39cAe90td4+yO9/X3umP055DX4yYgxc9+nwMmAttEZK2IXOrenu++BgCq6nJfv6AX8QbC83tu8Nq2t8t1uv4sCRJ41V6gv4cej/d6L6TglDpjgYPu6pVanC8meb08PyLyaREp9jrPdAJ7X/Q2hlE4pRVfMfy3iGwVp/qzFqc044nB33tkDHCd59ru487ESaJDnjVSDx6PABuAG1W1QUS+glNV4e06nOqBA6r6K/e2/8b5lrRQVQ+JyGz3eQQ4CGSJSJLXB8MoXxdX1Xfp+YPnJpxqofNwkkM6UOO+FsBRIMlr/+E+zjEK8CSg0UB5D9fskaqWADeK055xNfBnEcl2n3uGZz93tcoo4ICP0/QUe3fTIpfj/J5TvZLEaD/XCafeTt28H2gFctylkz4RkTHA4zjVoqtVtVNEignsfdHbGPbjVBFt6hLDIuDr7hg2q6pLRI69N7t5j+wHfq+qX+AkZCWIwSMVqAcaRWQy8EUf+5Tj/APcISK3eR3XjNMwmQV8x7Ozqu7FKS5/V0Ti3I2WlwUZYytQhfMP/8MurxcDV7tLNRNwvrV1dZc4DeujgP8H/DGIeAAQkU+KSK67hFDr3tyJU8/8cRE5V0RicZJpK7DKx2mKgUtEJEtEhuOU1rwdBnyOTVDV/e5z/khEEkRkJs7P3tv2mWBVAi78xNmVqh4E/gn8QkTSRCRKRMaLSNeqTW9R7p/Rc4sHknGSUyWAiNyCU4LwKAbOEmfsSDpwdxAxPAF8X0SKxDHT/UGfitOOUQnEiMg9OG0UuGPy9x55BrhMRC50l5ATxOmgMJKTgCWIweNOnG/oDTjfxnx+cLrr488Fvi5Oj6Ff4dSrHwHeA17pcsgncBq9q3Aa4v6I8yHZF7/DqTo5AGxxX8/bL4E2nA/Tp/H9AfkCsB7nQ+Ml4Mk+xuLtImCziDTiNEbe4G4L2I5Tx/wAzu/nMpyG5jYf5/g98AFOyeifnPj7/xHwbXc1xJ0+jr8RKMRJ4suA77jrsyPGXUr8X+Bf7jhPDeCwTwNxOH/PGuDPdF+9ciPOFxLPbaeqbgF+AazG+dvPAP7lFddrOL/PjTh/+38EEcN9OIn/nzhfqJ7Eef+/itOBYgfOe7SF46sz/b1H9uOUir+Jk1z2A3dxknx2ii0YZLyJyB+Bbar6nR53Dv21FShS1dJIX9sYc6KTIgsa/0RkvrvIHiUiF+F8W/pbf8dljOl/1khthgN/xRkHUQZ8UVU39G9IxpiBwKqYjDHG+GRVTMYYY3waUlVMOTk5WlhY2N9hGGPMoLF+/fojqupz6pAhlSAKCwtZt25df4dhjDGDhojs9feaVTEZY4zxyRKEMcYYnyxBGGOM8WlItUEYY07U3t5OWVkZLS0t/R2K6UcJCQmMHDmS2NjYgI+xBGHMEFdWVkZqaiqFhYWI70X3zBCnqlRVVVFWVsbYsWMDPs6qmIwZ4lpaWsjOzrbkcBITEbKzs3tdirQEYcxJwJKD6ct7wBKEMX2kqrxQfICdlY39HYoxYWEJwpg+enjFTv7fc8Vct3Q12w7V93c4A1p0dDSzZ88+dtuzZ09/h8TZZ58d0MBa7/0uueQSamud9YR+/etfM2XKFD7xiU/Q2trKeeedx+zZs/njH4Nb46q2tpaHH3742PPy8nKuvbbr4pGRYY3UxvTB//17Hz97dTsXThvGB/vruOnxf/PHW0+laFhqf4c2ICUmJlJcXNzr4zo6OoiJCf5jKlTnWb58+bHHDz/8MC+//DJjx47lvffeo7293efP2NnZSXR0dMDX8CSI225zFoXMz8/nz3/+c9Cx94WVIIzppUN1LdzzwibOnpTLgzfN4blbT8Wlyn2v7ejv0AaV4uJiTj31VGbOnMlVV11FTU0N4Hxj/+Y3v8nixYu5//77GTduHKpKbW0tUVFRvPPOOwAsWrSI0tJS1qxZw+mnn84pp5zC6aefzvbt2wF46qmnuO6667jsssu44IILaG5u5oYbbmDmzJlcf/31NDc3+4yru/0KCws5cuQIS5YsYdeuXVx++eX85Cc/4ZOf/CTFxcXMnj2bnTt3UlhYyPe+9z3OPPNM/vSnP/H4448zf/58Zs2axTXXXENTk7ME/OHDh7nqqquYNWsWs2bNYtWqVXzjG99g586dzJ49m7vuuos9e/YwfbqzQmtLSwu33HILM2bM4JRTTuGtt9469rNeffXVXHTRRRQVFfG1r30tJH8jK0EY00vPrd1Hpyrfu3w6sdFRFOYkc/H0EbxYfIDWjk7iYwL/thhp9/59M1vKQ1sdNjU/je9cNq3bfZqbm5k9ezYAY8eOZdmyZXz605/mgQceYPHixdxzzz3ce++9/OpXvwKcb9Fvv/02AK+99hpbtmxh9+7dzJ07l3fffZeFCxdSVlbGhAkTqK+v55133iEmJobXX3+db37zm/zlL38BYPXq1WzcuJGsrCzuu+8+kpKS2LhxIxs3bmTOnDk+Y33kkUd63G/p0qW88sorvPXWW+Tk5LBw4UJ+/vOf849/fLRaakJCAitXrgSgqqqKL3zhCwB8+9vf5sknn+T222/njjvuYPHixSxbtozOzk4aGxv58Y9/zKZNm46VRryr4x566CEAPvzwQ7Zt28YFF1zAjh3OF5Pi4mI2bNhAfHw8kyZN4vbbb2fUqFHd/l16YgnCmF7o6HTx3Jr9nFWUy+jspGPbz5uSxx/W7OPfu6o5a6LPiTFPal2rmOrq6qitrWXx4sUAfOYzn+G666479vr1119/7PGiRYt455132L17N3fffTePP/44ixcvZv78+cfO9ZnPfIaSkhJEhPb29mPHnn/++WRlZQHwzjvvcMcddwAwc+ZMZs6c6TPWQPfriffPsGnTJr797W9TW1tLY2MjF154IQBvvvkmv/vd7wCnnSY9Pf1YScqXlStXcvvttwMwefJkxowZcyxBnHvuuaSnpwMwdepU9u7dawnCmEh6fWsFh+pb+P6V04/bfsaEHBJio3h96+EBnSB6+qY/UCQnJx97vGjRIpYuXUp5eTnf+973+NnPfsaKFSs466yzAPif//kfzjnnHJYtW8aePXs4++yzfZ4HfHf1XLZsGffeey8ATzzxhN/9gvkZbr75Zv72t78xa9YsnnrqKVasWNGnc3a3wFt8fPyxx9HR0XR0dPTpGt6sDcKYXnj233vJT0/gY5PzjtueEBvNoqJcXt9yuNt/YuNIT08nMzOTd999F4Df//73x0oTXS1cuJBVq1YRFRVFQkICs2fP5tFHH2XRokWAU4IoKCgAnLp4f8466yyeffZZwPlGv3HjRgCuuuoqiouLKS4uZt68eX73C0ZDQwMjRoygvb392LnB+db/yCOPAE5jdn19PampqTQ0NPT4M+zYsYN9+/YxadKkoOPzxxKEMQGqqG/h3ZIjXD9/NNFRJ37DPG9KHuV1LWw96Puf2xzv6aef5q677mLmzJkUFxdzzz33+NwvPj6eUaNGceqppwJOiaKhoYEZM2YA8LWvfY27776bM844g87OTr/X++IXv0hjYyMzZ87kpz/9KQsWLAhqv974/ve/z8KFCzn//POZPHnyse33338/b731FjNmzGDu3Lls3ryZ7OxszjjjDKZPn85dd9113Hluu+02Ojs7mTFjBtdffz1PPfXUcSWHUAvrmtQichFwPxANPKGqP+7y+hXA9wEX0AF8RVVXBnKsL/PmzVNbMMiEy982HOArfyzmH7efyfSC9BNer2xoZcEPX+e/zpvIHecW9UOEvm3dupUpU6b0dxhmAPD1XhCR9ao6z9f+YStBiEg08BBwMTAVuFFEpnbZ7Q1glqrOBj4LPNGLY42JqFU7j5CeGMuUEWk+X89NjWfSsFTW7/XfyGjMYBLOKqYFQKmq7lLVNuA54ArvHVS1UT8qwiQDGuixxkSSqvKv0ipOG5fts3rJY1p+OlsO2qhqMzSEM0EUAPu9npe5tx1HRK4SkW3ASziliICPdR9/q4isE5F1lZWVIQncmK72VTdxoLaZMyZkd7vf1Pw0KhtaqWiwtRfM4BfOBOHra9YJDR6qukxVJwNX4rRHBHys+/jHVHWeqs7LzR243QvN4Pav0ioAThuf0+1+U93VT6EejGZMfwhngigDvEdpjATK/e2squ8A40Ukp7fHGhNuq3YeYVhaPONzk7vdb2q+O0FYNZMZAsKZINYCRSIyVkTigBuAF713EJEJ4h6RIiJzgDigKpBjjYkUl0tZvbOKM8bn9DiAKj0xlpGZiVaCMENC2BKEqnYAXwZeBbYCz6vqZhFZIiJL3LtdA2wSkWKcXkvXq8PnseGK1Zju7Kk6StXRNhaOywpo/6kj0qwE0YVnuu9p06Yxa9Ys7rvvPlwuFwDr1q07NrVF12mz3333XaZNm8bs2bP9Tq4XqBUrVrBq1apjz5cuXXpsmgvjW1in2lDV5cDyLtuWej3+CfCTQI81pj94Puyn5Z849sGXqflpvLb1ME1tHSTF2Ww2cPxcTBUVFdx0003U1dVx7733Mm/ePObNc7rhb9iw4bhps5csWcKdd97JLbfcctz5ejuFNjgJIiUlhdNPP/3YuU33bCS1MT3YerCemCihaFhKQPtPHZGGKmw7ZCOqfcnLy+Oxxx7jwQcfRFVZsWIFl156KRUVFcdNm/3oo4/y/PPP873vfY9PfOITrFixgnPOOYebbrrp2CjqK6+8krlz5zJt2jQee+yxY9d45ZVXmDNnDrNmzeLcc89lz549LF26lF/+8pfMnj2bd999l+9+97v8/Oc/B7qfevzrX/86CxYsYOLEicemBjlZ2NcbY3qw9WAD43NTAp7G29NQvbm8njmjM8MZWu+9/A049GFozzl8Blzc40QHxxk3bhwul4uKiopj2/Ly8njiiSeOmzZ79erVXHrppVx77bWsWLGCNWvWsGnTJsaOHQvAb37zG7Kysmhubmb+/Plcc801uFwuvvCFL/DOO+8wduxYqqurycrKYsmSJaSkpHDnnXcC8MYbbxy7dndTj3d0dLBmzRqWL1/Ovffey+uvvx7Ur2swsQRhTA+2lNdz2vjuxz94K8hIJD0x1hqqe9CXaX4WLFhwLDmAs+znsmXLANi/fz8lJSVUVlZy1llnHdvPM923Pz1NPX711VcDMHfu3AGxVGokWYIwphs1R9s4VN/ClBGBLyUqIhTlpbCzsjGMkfVRL7/ph8uuXbuIjo4mLy+PrVu3Bnyc9xTaK1as4PXXX2f16tUkJSVx9tln09LSgqqGZLpuD89keKGaQnswsTYIY7qx1d1A7W/+JX8Kc5LZc+RoOEIa9CorK1myZAlf/vKXg/ogr6urIzMzk6SkJLZt28Z7770HwGmnncbbb7/N7t27AaiurgbwO412b6YeP9lYCcKYbmzpY4IYm5PMn9eXWU8mN8+So+3t7cTExPCpT32Kr371q0Gd86KLLmLp0qXMnDmTSZMmHZsOPDc3l8cee4yrr74al8tFXl4er732GpdddhnXXnstL7zwAg888MBx53r66adZsmQJTU1NjBs3jt/+9rdBxTZUhHW670iz6b5NqH31+WJWlhxhzbfO69VxL208yJf+732W37HoWKN1f7Hpvo3HgJnu25ihYOvBhl6XHgDGuNer3lNl1Uxm8LIEYYwfbR0uSiv6liAKc5zG1N3WDmEGMUsQxvixs7KR9k7tVQ8mj5T4GHJT49k7QEoQQ6kq2fRNX94DliCM8cMzjmFaH9sQxmYns+dIUyhD6pOEhASqqqosSZzEVJWqqioSEhJ6dZx1rzDGj60H64mPiaIwu/spvv0Zk53Eih39v4jVyJEjKSsrwxbUOrklJCQwcuTIXh1jCcIYP7YeqmfS8FRiovtW0C7MSaZyfRmNrR2kxPffv1psbOxxo4+NCZRVMRnjg6o6PZiG972L6lh3Q/VAaYcwprcsQRjjw+H6VqqPtgU1hsFTNTUQ2iGM6QtLEMb40NcpNrwV5thYCDO4WYIwxgfPFBuT+9DF1SMpLoa81Hibk8kMWpYgjPFh68F6RmYmkpYQG9R5CrOT2VttVUxmcLIEYYwPWw7WMzWI6iWPgsxEDtQEt5ayMf3FEoQxXTS3dbLnyNGg2h88CjISOVTfQkenKwSRGRNZliCM6WLH4QZcSp+m2OhqZGYinS7lUH1LCCIzJrIsQRjTRUmFsxLcxGHBJ4iCzEQAq2Yyg1KPCUJEfh/INj/HXiQi20WkVES+4eP1T4jIRvdtlYjM8nptj4h8KCLFImKLPJiIKaloIC46itFZSUGfqyDDSRBlliDMIBTI+P9p3k9EJBqY29NB7v0eAs4HyoC1IvKiqm7x2m03sFhVa0TkYuAxYKHX6+eo6pEAYjQmZEoPNzIuN7nPU2x4y3cniAO1liDM4OP3P0BE7haRBmCmiNS7bw1ABfBCAOdeAJSq6i5VbQOeA67w3kFVV6lqjfvpe0DvZpIyJgxKKhqZkJcSknMlHN7Al5LeYHTps3Dow5Cc05hI8ZsgVPVHqpoK/ExV09y3VFXNVtW7Azh3AbDf63mZe5s/nwNe9g4B+KeIrBeRW/0dJCK3isg6EVlns1WaYDW3dbK/pomivODbH2iuhWeu4S7Xk1x58Jfw7HXQbiUJM3j0WIZW1btFpEBETheRszy3AM4tvk7nc0eRc3ASxNe9Np+hqnOAi4Ev+bumqj6mqvNUdV5ubm4AYRnj387KRlShaFgIShCrH4KWWu4b9Wu+Hv9taDgIa58M/rzGREiPbRAi8mPgBmAL0OnerMA7PRxaBozyej4SKPdx/pnAE8DFqlrl2a6q5e77ChFZhlNl1dM1jQlKqbsHU1GwVUyNlU6CmHYVrSkLWLZrDz+edA6y8j6Y+xmID0EJxZgwC6QV7ipgkqpeoqqXuW+XB3DcWqBIRMaKSBxOknnRewcRGQ38FfiUqu7w2p4sIqmex8AFwKbAfiRj+q6kooGYKGFMHxcJOmblL6GjGc75FiMzEmnrdFG98GvQVAXvPRKaYI0Js0ASxC6g1xPSqGoH8GXgVWAr8LyqbhaRJSKyxL3bPUA28HCX7qzDgJUi8gGwBnhJVV/pbQzG9FbJ4UYKc5KJiwmiB5OrE4qfhWlXQ04RIzPds7omTIEJ58P6p8GW/zSDQCDdXJuAYhF5A2j1bFTVO3o6UFWXA8u7bFvq9fjzwOd9HLcLmNV1uzHhVlrRyKThQVb/lG+AllqYfAnw0WC5spom5k6+BEpfg6pSyCkKNlxjwiqQBPEiXaqGjBmKWjs62VN1lEtnjgjuRKVvAAJjzwY+Gix3oLYZZn3M2Wfnm5YgzIDXY4JQ1adFJBEYrarbIxCTMf1i95GjuBQmBDvFxs43IX82JGcDkBwfQ2ZSrDOaOnMGZI1z9ln4nyGI2pjwCWSqjcuAYuAV9/PZImIlCjPklBwOQQ+mljooWwvjzz1u83HTfo//GOx+Fzra+n4dYyIgkJa47+J0Ma0FUNViYGwYYzKmX5RUNBIlMDYniB5Mu98F7XSSgJf89ETKa70SRPtRKFsTRLTGhF8gCaJDVeu6bLMuGGbIKa1oYEx2Mgmx0X0/yc43IC4FRs4/bnN+RiIH69xTfhcuAol2qpmMGcACSRCbROQmIFpEikTkAWBVmOMyJuJKDodgDqZdK6DwTIiJO27ziPQEGls7qG9ph4Q0GLUAdr4V3LWMCbNAEsTtODO6tgJ/AOqBr4QzKGMirb3TxZ6qo8G1PzRVQ/UuGLXwhJdGuHsyHax1lyJGLXQm7+toPWFfYwaKQOZialLVb6nqfPecR99SVVseywwpe6uaaO/U4OZgOviBc59/ygkv5acnAFBe526HyJ8NrnY4vLnv1zMmzPx2cxWRv9NNW0OA020YMyiUVjQABDeL68Fi537EiWM8h7sTxLESxIjZHx1TMKfv1zQmjLobB/Fz9/3VwHDgGffzG4E9YYzJmIgrOdyICIzPDaIEUb4BMsZAUtYJLw1LS0AEDnlKEJmFkJAB5cV9v54xYeY3Qajq2wAi8n1V9Z5q++8iYrOqmiGlpKKRkZmJJMYF0YOpvNhn9RJAbHQUeanxlHt6Mok41UzlG/p+PWPCLJBG6lwRGed5IiJjAVt4wQwpJRWNwVUvNVVD7V7nQ9+PEemJHKzzWjBoxGyo2GoN1WbACiRB/BewQkRWiMgK4C2sF5MZQjpdys7KxuB6MHnaH/yUIADyMxI+aoPw7GsN1WYAC2QupldEpAiY7N60TVXtK48ZMvZXN9HW4QpuDES5/wZqjxHpiby5rQJVRTxVTOBUM1lDtRmAuuvF9DFVfVNEru7y0ngRQVX/GubYjImIEs8qcsFM0le+ATLHQmKm311GpCfQ0u6itqmdzOQ4p0E7IeOj0ocxA0x3JYjFwJvAZT5eU5yV4IwZ9ErcXVyDKkEcLIaCud3uku8eLFde1+wkCBGnmskaqs0A1V0vpu+472+JXDjGRF7p4Uby0xNIiQ9keRQfWuqhdh/Mvbnb3UZ4jYWYlp/ubBw+A/69FDrbIbrXCzcaE1aBTPf9QxHJ8HqeKSI/CG9YxkROSUVjcGtAVGx17vOmdbubpwRxXE+mYdOgsw2qdvb9+saESSC9mC5W1VrPE1WtAS4JX0jGRI7LpZRWBNmDqcLdC2nY1G53y0mJJyZKPhoLAZA3xX2OLX2/vjFhEkiCiBaReM8T9+py8d3sb8ygcaC2meb2zuASxOEtEJcK6aO63S06ShiWlsDBWq8SRM4kZ+pvSxBmAAqk0vUZ4A0R+S1O4/RngafDGpUxEVJ6rAdTMCWILU5JQKTHXfMzEo4vQcQmQPZ4J8kYM8AEMg7ipyLyIXAuIMD3VfXVsEdmTAQc68GU28c2CFUnQUy9IqDdR6QnsmF/zfEb86Z+NBOsMQNIIFVMqOrLqnqnqv53b5KDiFwkIttFpFREvuHj9U+IyEb3bZWIzAr0WGNCoeRwI7mp8aQn9bEHUcMhaK7psYHaY0RGAofqWnC5vCZKzpsKNXug7WjfYjAmTALpxXS1iJSISJ2I1ItIg4jUB3BcNPAQcDEwFbhRRLq24u0GFqvqTOD7wGO9ONaYoJVEqIHaIz89kfZO5chRr8kIhk0FFCq29T0OY8IgkBLET4HLVTVdVdNUNVVV0wI4bgFQqqq7VLUNeA44rhyuqqvcvaIA3gNGBnqsMcFSDUEPJk/bQV5gCWJE13UhvI+tsDmZzMASSII4rKpb+3DuAmC/1/My9zZ/Pge83NtjReRWEVknIusqKyv7EKY5WR2qb6GxtSPIMRBbIGW4zzUgfE1jjLMAACAASURBVPE5FiKzEGISPxpPYcwAEUgvpnUi8kfgbzjrUgMEMheTry4dPleoE5FzcBLEmb09VlUfw101NW/ePL8r4BnT1Y7D7h5MQVUxbQm4egk+KkGUe5cgoqIhb7LN6moGnEASRBrQBFzgtS2QuZjKAO+O4SOB8q47ichM4AmcAXlVvTnWmGBsP+Q0pU3qawnC1QmV22H+5wM+JCs5jviYqONLEOA0cpdY50AzsATSzbWvczGtBYrcCwwdAG4AbvLeQURG4ySaT6nqjt4ca0ywth5sYHhagjNxXl/U7YeOFsiZGPAhIsKI9C5jIQByJ0HxM87CQwFWVxkTbt1N9/019xiIB/BRvaOqd3R3YlXtEJEvA68C0cBvVHWziCxxv74UuAfIBh4WZ5BRh6rO83ds335EY3zberCeKSOCaH84UuLc9yJBgHtludouJYhc93IrldthzGl9j8mYEOquBOFpMVvX15Or6nJgeZdtS70efx7wWT73dawxodLW4WJnZSPnTM7r+0mOuAu9vU0QGQms3ll1/MbcSc595TZLEGbA6G6677+7721aDTPk7KxspL1TmTw8mBLEDkjMguTsXh2Wn57I4foWOjpdxES7OxKmj4LYpI+SjjEDQEAjqY0Zara5G6injghkSI8fR0ohp6jXh43ISMClUNHgNVguKsopiVTaYDkzcFiCMCelrQcbiIuJYmxOct9PcmRHnxJEfrpnLISPhurK7X2Px5gQC2SqjTMC2WbMYLL1YD0Th6V8VMXTW801cLSi1+0PAMM9o6m7dnXNnQT1B5wV6owZAAL573ggwG3GDBrbDjUweXiQ1UvQpwRxrARR27UE4e7J5OkdZUw/666b62nA6UCuiHzV66U0nK6nxgxKRxpbqWxoDa6Busr9IZ7d+yqmtMQYkuKiKT+hBOHp6roNRs7te2zGhEh33VzjgBT3Pt7/SfXAteEMyphw2nbQWQMiuAbqHRAVC5ljen2oZ7DcCSWIjDEQHW8N1WbA6K6b69vA2yLylKrujWBMxoSVpwfT5KASRAlkjYPovq0jkZ+ReGIbRHQMZE+whmozYPTYBuErOYjIreEJx5jw23KwnmFp8WT1dYoN6HMPJg+f022A01B9xBKEGRi6TRAiEiUip/t6KUzxGBN22w4G2UDd2Q7Vu4NMEIkcaWylrcN1/Au5k6BmL7Q3+z7QmAjqNkGoqgv4hY/tj4YtImPCqL3TRWlFI1OCqV6q2Quu9j71YPLIz0hAFQ7XdylFZE8AFKp39T0+Y0IkkG6u/xSRa8Q9m54xg9muyqO0dbqCnKSvb3MweRvh7upa3nXSPk+pxLq6mgEgkPUgvgokAx0i0oJTvaQBLjtqzIByrIE6qDEQ7gSRPaHPp8jP8AyW61KCyBrv3FeV9vncxoRKIOtBBPFVy5iBZcvBeuKioxiXG8QUG1UlkJwHiRl9PsWxEkTXnkzxKZCabwnCDAg2F5M5qWw72MCEvBRi+zrFBjjVP0FULwEkx8eQlhBz4lgIgJwJVsVkBoQ+/ZeIyPuhDsSYSHAWCQqieknVGacQRA8mD59jIcAZnV1V4lzLmH4UyGR9HxORJO9tqjonfCEZEx5Vja1UNLQG10DdVAUttUGXIMA9FsJnCaIIWurg6JGgr2FMMAIpQdwMFIvIahH5qYhcJiJ9r3w1pp9sP+RMsRFcA3Xflhn1ZUR3JQj4aL4nY/pJICOpP62qE4FrgDLgIcC+2phBZ1N5HUCIurj2vQeTR356AjVN7TS3dR7/Qrb1ZDIDQ4+9mETkk8AiYAZOYngQeDfMcRkTcsX7axmVlUh2SnzfT3JkB8QkOEuEBmnEsYWDmhmXm/LRCxmjnUn7rKHa9LNAxkH8CtgJLAXeUtU9YY3ImDDZsK+W+YVZwZ3kSIkz/iEq+BnvR3iNhTguQURFOxMBWgnC9LNAqphygM8CCcD/isgaEfl92CMzJoQO17dwsK6F2aOCbD4LcpI+b/n+RlODdXU1A0IgvZjSgNHAGKAQSAdc3R3jdexFIrJdREpF5Bs+Xp/sbvxuFZE7u7y2R0Q+FJFiEVkXyPWM8WfDvloAZo8OIkF0tELt3j4tEuTLR0uP+ujJlF0ENbudiQGN6SeBVDGt9Lo9qKplgZxYRKJxGrTPx2ncXisiL6rqFq/dqoE7gCv9nOYcVbUGcRO0DftriIuOYlp+ED2YqneBukLSgwkgITaa7OQ43z2ZcorA1eFMDBiCBnFj+iKQqTZm9vHcC4BSVd0FICLPAVcAxxKEqlYAFSLy8T5ew5iAFO+rZUp+GvExQbQdHOvBFJoSBDjtED7HQnjmeaoqsQRh+k04p9ooAPZ7PS9zbwuU4swku767BYpE5FYRWSci6yorK/sYqhnKOjpdbCyr45RQtD9AUJP0dTUi3d9YCE+CsIZq03/CmSB8TQ/em7kDznCP2L4Y+JKInOVrJ1V9TFXnqeq83NzcvsRphrgdhxtpbu/klGDaHwCOlEJagTOhXogUZCRSXtuCdp1WIykLkrKtodr0q77OxRTIWo1lgHdn8ZFAeaDXUNVy930FsAynysqYXive726gHkA9mDzyMxJobO2gvrnjxBezi6wEYfpVIL2YVohIodfzBcDaAM69FigSkbHuhHID8GIgQYlIsoikeh4DFwCbAjnWmK427KshKzmO0VlJPe/sj2pIZnHtqiDDiamstunEF62rq+lngfRi+hHwioj8GqcN4WLglp4OUtUOEfky8CoQDfxGVTeLyBL360tFZDiwDkgDXCLyFWAqkAMscy9iFwP8n6q+0uufzhicEsTsURkEtShiwyFoawh9gsh0xkIcqGlmWn768S9mF8HRZ5yJ+xLSfRxtTHgF0ovpVfeH+ms4U22coqqHAjm5qi4HlnfZttTr8SGcqqeu6oFZgVzDmO7Ut7RTWtnIZbPygzuRZ+K8EDZQg9MGAX4Gy3mudaQURs4N6XWNCUQgVUz/AzwAnAV8F1hh3VLNYLFxfx2qhKCBOvh1qH3JSYkjPiaKAz5HU3tmdbV2CNM/AqliygEWqGozsFpEXgGeAF4Ka2TGhMCGfTUAzBwZbIIogdhkSAuyJNKFiFCQkeg7QWSOBYm2ab9Nvwmkiun/dXm+F2d0tDEDXvH+WsbnJpOeGBvciTw9mIJpx/CjIDORAzU+EkRMHGSOsYZq028Cme77LXyMX1DVj4UlImNCRFUp3l/LOZPzgj/ZkVIYvTD48/hQkJHI1oP1vl+0rq6mHwVSxeQ9iV4CzsJBPjptGzOw7K9upupoW/DjH9qaoG4f5HwqNIF1UZCRyJHGNlraO0mI7TIVSE4R7H4bXC6ICue4VmNOFEgV0/oum/4lIm+HKR5jQmbDfqf9IegG6sptzn3upCAj8u1YV9faZsbndhmlnTMROlqcWWSzxobl+sb4E0gvpiyvW46IXAgMj0BsxgRl3Z4akuKimTQsiCVGASrc80sOmx58UD54urr6bIcYNs25P7w5LNc2pjuBVDGtx2mDEJyqpd3A58IZlDGhsHpXFfMLs4iJDrJq5vBmiE2CzMKQxNWVdwniBLmTAXFimHJpWK5vjD+BVDFZudYMOhUNLZRWNHLtXF/jMHvp8CbngzoEy4z6Mjwtgego8V2CiE9xqpYqrARhIs9vghCRq7s7UFX/GvpwjAmN93ZVA3DauOzgTqTqfHufdEkIovItJjqK4WkJvksQAHlTrYrJ9IvuShCXdfOaApYgzIC1emcVqfExwa0gB9BYAU1VYWt/8CjI8DMWApxrb3vJ6U0VF8SEg8b0UncJolhV7xeRM1V1ZcQiMiYEVu88wsJxoWh/cE8iPGxq8EF1oyAzkTW7q32/OGwaoE5vqoI5YY3DGG/d/fd4Zmz9dSQCMSZUDtY1s6eqiVODrV6Cj3ow5U0L/lzdGJXprCzX1uE68UXryWT6SXcliK0isgfIFZGNXtsF0CDWqjYmrFbvrALgtPEhSBCHN0PqCEgOwbm6MSorCZc6s7oW5iQf/2JmodOLyhKEiTC/CUJVb3Sv1/AqcHnkQjImOCtLjpCZFMuU4UG2P4BTxZQX3uolgDHZTlLYW910YoKIioa8KdaTyURct91c3es12LoMZtDodClvba/g7El5REUFObFeZwdUbodx54QmuG54VrvbV+1jZTlwktS2l5xeVWGYMNAYX2xyFzOkFO+vpaapnY+FYoK+qlLobAt7DyaAvNR44mKi2O8vQQybDs3V0Hg47LEY42EJwgwpb247THSUcNbE3OBPFqEeTABRUcLorCT2Vh31vYM1VJt+YAnCDClvbqtk7pjM4Nd/AOfDOCom5KvI+TM6K4l91f7GQliCMJEXyHoQE4G7gDHe+9t6EGagOVjXzNaD9dx98eTQnLBii5McYuJDc74ejM5KYs3ualQV6drOkJTl9KayBGEiKJDJ+v4ELAUeBzrDG44xfffmtgqA0LQ/gPNhPCo8iwT5MjoricbWDqqPtpGd4iMpDZtmPZlMRAWSIDpU9ZGwR2JMkN7aVsGorEQm5KX0vHNPmmuhbj/M+2zw5wqQd08mnwkibyrsfgc62yE6BFVoxvQgkDaIv4vIbSIywnttiEBOLiIXich2ESkVkW/4eH2yiKwWkVYRubM3xxrjraW9k5WlR/jYpLwTq2f6omKrcx+BHkweo7N76Oo6bLrTq8qWIDUREkgJ4jPu+7u8tikwrruDRCQaeAg4HygD1orIi6q6xWu3auAO4Mo+HGvMMat3VdHS7uJjU4aF5oQR7MHkMSrTnSCq/CUIr4bqvCkRisqczHosQajqWB+3bpOD2wKgVFV3qWob8BxwRZdzV6jqWqC9t8ca4+3NrRUkxkazcGxAhdueHd4MCemQVhCa8wUgMS6avNR4/yWInIlOryprqDYREkgvpljgi8BZ7k0rgEdVteuHelcFwH6v52VAoC1+wRxrTjKqypvbKjizKIeE2BAt6lOxxanSifCoZaerq58EERPnJAlLECZCAmmDeASYCzzsvs11b+uJr/8sDTCugI8VkVtFZJ2IrKusrAzw9GYo2XG4kQO1zaHrveRyweEtEZmDqavR2d0kCHCqmSxBmAgJJEHMV9XPqOqb7tstwPwAjisDRnk9HwmUBxhXwMeq6mOqOk9V5+XmhmD0rBl0PN1bz5kUogRRtw/aGj6q84+gsdnJHKxroamtw/cOw6ZBfRk010Q2MHNSCiRBdIrIeM8TERlHYOMh1gJFIjJWROKAG4AXA4wrmGPNSealD8uZOTKd4ekJoTnhgfed+xGRn6eyaJjTRXdnhZ8pN4a7Z9kvL45QROZkFkiCuAt4S0RWiMjbwJvAnT0cg6p2AF/GmS58K/C8qm4WkSUisgRARIaLSBnwVeDbIlImImn+ju3LD2iGttKKBjYdqOeK2SFsTC5bBzEJMHxG6M4ZoAl5qQDsONzge4eCuc592boIRWROZoF0c10JFAGTcNoGtgV6clVdDizvsm2p1+NDONVHAR1rTFd/21BOlMBls0aE7qQH1sGI2f0yGG1MdhKx0UJJRaPvHRIzIGcSlK2NbGDmpBRICWK1qraq6kZV/UBVW4HV4Q7MmJ6oKn8rPsCZRbnkpYaoeqmjzam+GTkvNOfrpdjoKMblpFBa4acEATByvpMgNNA+H8b0jd8E4a7+mQskisgpIjLHfTsbSIpYhMb4sX5vDWU1zVx1Sn7oTnr4Q+hsdT6E+8mEYSnsOOynBAFO8mquhupdkQvKnJS6q2K6ELgZpwroPq/tDcA3wxiTMQH5y/sHSIyN5oKpw0N3Uk/dfj8miKK8FJZ/eJDmtk4S43yM6/DEVrYOssef+LoxIdLdmtRPA0+LyDWq+pcIxmRMj+qa2/nbhgNcOnMEyfGBNKUFqGwtpOZDeuRGUHc1cVgqqrCzspHpBekn7pA3BWKTnVhnXR/5AM1JI5A2iDdE5D7PYDQR+YWI+HjXGhM5f1q3n+b2Tm4+ozC0Jy5bByPnhvacvVTkno22xF87RFQ0FMyxhmoTdoEkiCdxqpX+w32rB34bzqCM6U6nS3l69R4WFGYxLT+E31WOHoGa3f1avQQwJjuZmCihpNt2iPnOhIJt3Yy6NiZIgSSI8ar6HffEebtU9V56mMnVmHB6c1sF+6ubQ1962L/Gue/nBBEXE8XYnGT/XV0BRi0AVweUvx+5wMxJJ5AE0SwiZ3qeiMgZgJ+Fc40Jv6dX7WFEegIXTA3R1N4ee/8F0fGQPye05+2DomEplPgbLAcfrXS313qcm/AJpHVvCfA7d7uD4KzhcHM4gzLGn5LDDawsPcJdF04iJjqQ7ze9sG+1M1I5NkRjKoJQlJfKy5sO0dTWQVKcj3/TpCxnMsF9qyIfnDlpBLIexAeqOguYCcxQ1VNU9YPwh2bMiZ5atYe4mChuXDA6tCdubXQGyI05PbTn7aPpBemowtaD9f53Gn2aUy3W6WdiP2OCFMh6EPHANUAhEONZzlFVvxfWyIzpoq65nb++f4ArZ+eTlRwX2pOXrQXthDGnhfa8fTTD3b11Y1kdc8f4WQRpzOmw7klncF/+KRGMzpwsAimjv4CzmlsHcNTrZkxEebq2fub0wtCffO8qkCgYuSD05+6DYWnx5KbG8+GBOv87eUo7e62ayYRHIG0QI1X1orBHYkw32jpc/Gbl7tB3bfXYt9qZSjshLfTn7gMRYWZBOh+WdZMg0vIhY4yTIE77UuSCMyeNQEoQq0Qk8vMeG+PlL++XUV7Xwpc+NiH0J+9odaqYBkj7g8f0gnR2Vjb6XzwIYMwZsO89m7jPhEV3k/V9KCIbgTOB90Vku4hs9NpuTES0d7p4eEUps0amc1ZRTugvUL4BOlqcRt8BZObIdFwKW8q7aagecxo0HYHK7ZELzJw0uqtiujRiURjTjReKy9lf3cx3Lp2Gp5NESJW8BhINYxeF/txB8G6onlfop6F63NnOfenrkDc5InGZk0d3VUyHgatwVpS7CDigqns9t4hEZ056Le2d3P/GDqaOSOPcKSFac7qrkledgWeJmeE5fx/lpSUwLC2eTd01VGeMhtwpzs9gTIh1lyCeBuYBHwIXA7+ISETGeHlkxU72Vzfz7UunhKf0UF8Ohz6EiReE/twhMKMgnY3dJQiAiRc6DdUtPexnTC91lyCmquonVfVR4FpgYJW/zZC3t+ooj7y9k8tn5XP6+DC0PQCU/NO5L7owPOcP0oyCDHZWNtLY2k1D9cQLnXmZdr4VucDMSaG7BNHueaCqNlTTRJSqcs8Lm4mNEr718Snhu9COf0L6aGeNhQFo9ugMVOGD/bX+dxq5ABIyYIdVM5nQ6i5BzBKRevetAZjpeSwi3XSrMCZ4f1izn7d3VHLXhZMYlhamuZE6WmHXCqd6KRzVVyEwe1QGABv21fjfKToGJpznlIZcrghFZk4GfhOEqkarapr7lqqqMV6PB8ZoIjMk7a06yg9e2sIZE7L59GmF4bvQnneh/eiArV4CSE+MpSgvhff3dVOCAKeaqekIHFgfmcDMSSHE02EaE5xOl/LV5z8gOkr42bWziIoK4zf7LS9CXAqMPSt81wiBU0ZnsGFfDdrdYLii8yEqBra+GLnAzJAX1gQhIhe5B9iVisg3fLwuIvJr9+sbRWSO12t73IPyikVkXTjjNAPH0rd3sn5vDd+/Yjr5GYnhu1BnB2z7B0y8aEBM792dOaMzqWlqZ/eRbqZAS8x0xkRsecFGVZuQCVuCEJFo4CGcLrJTgRtFZGqX3S4Gity3W4FHurx+jqrOVtV54YrTDByby+v41es7+PiMEVwxOz+8F9v7L2iqgqlXhPc6ITBnjDM+Y0NP1UxTr4DavXDQZuM3oRHOEsQCoNS9TGkb8BzOrLDergB+p473gAwRGRHGmMwA1dTWwVeeKyYzKY4fXDk9PGMevG15AWKTnMbdAW5Cbgqp8TG8311DNcCkjzsjwq2ayYRIOBNEAbDf63mZe1ug+yjwTxFZLyK3+ruIiNwqIutEZF1lZWUIwjaRpqrc/dcPKa1s5Bf/MYvMUK/10JWrE7b+HYougLik8F4rBKKihNmjM3puqE7OdqYL2fw3q2YyIRHOBOHrK2DXd213+5yhqnNwqqG+JCI+WxJV9TFVnaeq83Jzc/serek3z7y3lxeKy/nqeRNZVBSBv+HeVXC0YlBUL3mcMjqT7YfqaWhp737HqVdA9U44vCkygZkhLZwJogwY5fV8JFAe6D6q6rmvAJbhVFmZIeaNrYe59+9bOGdSLl86JwxTefuy9glISHe6hg4Si4pycCm8tb2HUvKUKyA6HtY+GZnAzJAWzgSxFigSkbEiEgfcAHStHH0R+LS7N9OpQJ2qHhSRZBFJBRCRZOACwL4SDTGrd1Zx27PvMzU/jV/feEp4u7R61Ox16ujn3gJxyeG/XojMHZ1Jbmo8r2w62P2Oydkw63r44A9wtCoywZkhK2wJwj09x5eBV4GtwPOqullElojIEvduy4FdQCnwOHCbe/swYKWIfACsAV5S1VfCFauJvLe2V/C5p9cyOiuJp25ZQGpCbGQuvOYxZ2nRBX6btQakqCjhgqnDeGtbJc1tnd3vfOptzvoW634TmeDMkBXIkqN9pqrLcZKA97alXo8VOGGtRFXdBcwKZ2ym/zz7773c88JmJg9P5bc3zycr3I3SHi31sP5pmHYVpHftLzHwXTx9BM/+ex9v76jkounD/e+YN8XpnbXmMTjjDoiJj1yQZkixkdQmYlwu5Ucvb+VbyzZxVlEOz//naeSFa54lXzb8HtoanG/Yg9DCcVlkJMX2XM0EzhrVRytg01/CH5gZsixBmIhobuvk9uc28Ojbu/jEwtE8/ul5JMeHtQB7vM4O+PdSGH06FMzpef8BKDY6ivOnDOONrRW0dvRQzTTuHMibCqsfsi6vps8sQZiw21t1lKse/hfLPzzI3RdP5gdXTicmOsJvvW3/gNp9zjfrQeySmSNoaO1gRU+9mUScn/XwJtj9dmSCM0OOJQgTVm9uO8xlD6zkYF0Lv715Pv+5eHz4R0n7svohyCyESRdH/tohtGhCDjkpcSx7/0DPO8+4DpLznJ/dmD6wBGHCoqPTxS9f28Fnn1rHyMwk/nH7mZw9KUxrSvdk/xooW+O0PURF908MIRITHcXlswp4c1sFdU09DJqLiYf5n3fWiajYFpkAzZBiCcKE3KYDdVz18Cruf6OEq+cU8NfbTmdUVj9NadHRCv/4KiTnwuyb+ieGELt6TgFtnS7+8WHXcac+zP8cxKfBP/7LmWLEmF6wBGFCpry2ma//eSOXP+hUKT140yn84rpZJMT247f2FT+Cwx/C5Q9CfGr/xRFC0/LTKMpL4a+BVDMl58DFP4V9q2DVA+EPzgwpEexGYoaq3UeO8vi7u/jz+jJQ+MzphXzl3ImkJ0Vo8Js/+96Df90Pcz4Nky7q31hCSES4ak4BP31lO6UVDUzI6yHxzboBtr8Eb/4AJpwLw2dEJlAz6FkJwvTZhn01fPGZ9XzsFyv48/oyrplTwJt3LuY7l03r/+TQ2gDL/hPSR8GFP+zfWMLg+nmjSIqL5v43SnveWQQuvd9ZVOiv/+lUuxkTACtBmF5xuZS3d1Sy9O2d/Ht3NWkJMdx29ng+c3oheakDaGW2V7/lzLt0y8tDpmrJW3ZKPDefXsgjb+/kS+eMZ/LwHpaJT86GKx6E//sPpyRxwfcjE6gZ1CxBmIBUNLTwp3Vl/HHtfvZVN5GfnsD/XDqV6+ePIiWSA94Csf1leP9pOOMrMOa0/o4mbG49axy/X72XX762g0c/FcCiixMvhLk3O20RRecP+LW4Tf8bYP/ZZiA52trB2zsqeaH4AG9sraDDpZw6Lov/vmAil8wYQWykB7sF4kiJU40yfCac883+jiasMpLi+OyZY7n/jRLe31fDnNGZPR90wf/CnpXwp1vg1hWQMaqnI8xJTHQIDcOfN2+erlu3rr/DGLTaO11sLKtl9c4qVu+qYu2eGto6XGQnx3Ht3JFcP38U43JT+jtM/1rq4PFzobnmpPnwa2zt4LxfvE1mchx///IZgY1Qr9wBT5zrDBz87KuDYlU9Ez4isl5VfRZBrQRxEmvt6GTTgXrW7K5m9a4q1u2ppsk9lfTk4al8cuEYLpg2jHljMiM/NUZvVe+C5z8NNbvh0y+eFMkBICU+hu9ePpUlz7zPb/+1hy+cNa7ng3InwtWPwx9ugN9fCdf+dlDObmvCzxLESaS2qY31e2tYt7eGdXuq+aCsjrYOFwBFeSlcO3ckp43LZuG47MhNwR0KW16EF77krPNwwx+g8Iz+jiiiLpw2nHMn53Hfazs4d0peYKW8SRfBtU/CC7fDo4vgmidg/MfCH6wZVKyKaQhq7eikrKaZksONbDtUz/ZDDWw71MDuI0cBiI0WpuWnM29MJvMKM5k7Jovc1EG4ZkBnO7z+XVj9IOTPgf94GjJG93dU/eJAbTOXP7CShNho/rTkNPIzEgM7sHKHU/Kq3AaLvw6LvzbopyMxvdNdFZMliEHI5VKONLayv6aJfdVN7K9uZl+153ETh+pbjs3wLAKF2clMHp7K9AInKcwaldG/o5tDoe4A/PkW2P9vZ3W4C35w0i+Ms+lAHTc+9h65afE8/5+nkZMS4O+j7Si89N/OMqXjzoarn4CU3HCGagYQSxCDTFNbB0ca2jhQ2+zcapo5UNt07HF5XcuxqiGP4WkJjMpKZFRWEqPdt3G5KUwclkJS3BCqSezsgK0vwPK7nAFfl/8apl/T31ENGGv3VPOpJ//NuJwU/nDrqaQnBjhgURXe/53ze03Kgo/fBxMvgqgB3vZkgmYJop+0d7qoa26nrrmd2qZ26t2PvW+1Te1UH22l6mgbVY1tVB1tpaXddcK5clPjKchIpCAzkZHu+1GZSYzKSmJkZuLgLxH05EgJfPhnZ1W4+gOQN82pUsop/fp6ZgAADpBJREFU6u/IBpwV2yv4wu/WMWtkBks/NTfwkgTAwY3wp5uheidkjnWmKZl+tdPjyQxJliACpKq0drhoauukqa2D5rZOmto6aW7vPPa4qa2DlnbP404aWzuO+8D3TgJNPSwunxQXTXpiLNkpcWQnx5OdHOc8TnEe52ckUpCRyIiMBOJjhngC8KWjDba84KwEd2AdIDBusVOlNPEiqyvvxvIPD3L7HzYQHSVcOTuf/zp/IiPSA2yX6GyHrS/Cmsdh32pn2+jT4dQlMOnjED2ESqTGEkRPTv/RG9Q2t9Pc3tnr1RkTY50P+YykWNISY0n3d0s6/nlaQixxMVZ8P44qHK2Eiq2wfbmznvLRSsieAHNvcb7JpuX3d5SDRmlFI7/9127+vL6MhNhofnT1DC6ZMaJ3J6nZA5v+Cut/66zIlzIcZlwLky+FYVMhIT0ssZvIsQTRg+/9fQsizjf6xLhokmKd+8S4GJJio49td16Lce7jokmIjSY6qh9WRxsKOtvh8GYofx/KNzgL2hzZ7gx2A4iOd6aGOOVTMOE8qwsPwu4jR/nKH4v5YH8tk4encsHUYcwrzGLKiLTAe6+5OmHHK7DhGWcBIleHsz1tpJMo8ty3YVMhZ+JJ32FgMOm3BCEiFwH3A9HAE6r64y6vi/v1S4Am4GZVfT+QY30ZaG0QJ6X2ZmiscG5HK51ZVdsaoLXReVy7F6pK4fAW6HTPKpqYCcOmO+0JOZOc+4K5kJjRvz/LENLe6eLZ9/ayfNMh1u2pxuX+t585Mp3r549i4dhs8jMSAuvQ0FQNZWudBF+xFSq2QOV2cLlXuJNop9Q3bCpkF0FStvM37npLSLfqqgGgXxKEiEQDO4DzgTJgLXCjqm7x2ucS4HacBLEQuF9VFwZyrC+DJkGogrqce/Sj557H3W7TLttcJ25zdTjf+Fwdzjd1V8dH23yd2/PY1QFtTc6HfLvn/qj73n3TTmd/l8v5QGiugaYq50OjqdpJBv5IlPONM2ussyZBwRxn/EJmodMf10REXVM7mw/WsbGsjr9tOMC2Qx/9zaIEokTIS42naFgqk4anUpSXQlZyHO2dLto6lfYOF7ExUeSlxjMsLYG81HiSYxSqdkLFZif5V2x1HtfsBbr5jIlPc3pNJWVDYpaTOGITnBJkTDxEx7ofx0F03PGPYxIgNsnZPzbJ3SYlzvvs/7d3/kFWVmUc/3zv3V1QwEUFERFkIcW0ceSHjIqapVPKKGg/DPpD+zGRlVNWTlnMNPinNeZklKbFqKXZFDkxWmo1WWOjKSIoCMoPcUQJTBIWgWV379Mf51x49+57l7uXe99Lu89n5p33vM855z3Pfd4fz3vOPT+knmHl4nFpWCnylPw9wvSzjES+GmFmFOzgHqi6ybpRU23MBDaY2aaoxEPAXCD5kp8L3G/BSz0jaaSkscDECvLWjsUzwwux3y9sUmQpL+yk7P8R5aFlWHhglQ8PonJhf1R8uEedFsLDR8OwE2D4mLCa2dBWaBkOQ4aHh9gdQcNpPbqZ8yeP4vzJo/jiRZN4eesu1m/bzZvv7mVfZzddBWPru3t5ddtunt70Tq8u1Wk0HWhqPQqYjjEdgDzdjGAPI9nN6KY9jMrv4fjcexybe49hhXaG729nRMcuWne002obGUk7Q9RJC920qJMWumimq37GyJhuE0bYCgQHU6Aog0JcoscqkB+MFzvVypmLVtRc33o6iHHAG4njLYRawqHSjKswLwCSFgALACZMqHIU7YRzw5d2j6+JRLjXl0QZWa/4ki+JPmWHOncleeI+1xS2fNznmuP+EF9IuaYwcVtzcTsq7PPN/mIfoEhhVP2ZJ6X/2dzVXeD1HXvYva+L5nyOlibRnM+xr7PA9vZ9bN/Vwfb2Dtr3dfa6RcRBQcGM/V0FOroK7O3qpr3baMqHc4Xz5mjKiaac6CyEtMWts6uL7s79NFknzRzcWmw/Q6yD5rjP000OkIwcwanpwMcZiGInFCOPkZMhIK/wms0JckQZhfB7en3whWPRMy534FUdz8XBV39O9IhTLEMWXvNgMRzOdcAtWGk4/qaU8mipz5on9XQQaW+U0k/ocmkqyRuEZncDd0NoYuqPggeYc0dV2RxnoNOUzzG5zNxOU04ceAsxOT2pp4PYAiSn1DwZeKvCNC0V5HUcx3HqSD37Dj4HnCqpTVILMA9YVpJmGXCtAucCO81sa4V5HcdxnDpStxqEmXVJugF4nNBVdYmZrZF0fYy/C/gjoQfTBkI318/2lbdeujqO4zi98YFyjuM4g5i+urn68FTHcRwnFXcQjuM4TiruIBzHcZxU3EE4juM4qQyoP6klvQ28XmX2UcB/aqhOrXC9+ofr1T9cr/4xEPU6xcxS15gdUA7icJC0vNw/+Y3E9eofrlf/cL36x2DTy5uYHMdxnFTcQTiO4zipuIM4yN2NVqAMrlf/cL36h+vVPwaVXv4fhOM4jpOK1yAcx3GcVNxBOI7jOKkMOgch6ZOS1kgqSJpREvcdSRskvSLpown5dEkvxbg7pPovrybpN5JWxm2zpJVRPlHS3kTcXfXWpUSvRZLeTJQ/OxGXar+M9PqBpHWSXpT0sKSRUd5oe10W7bFB0s1Zll2ix3hJf5O0Nt7/X4vystczQ902x+drpaTlUXacpD9LWh/3x2as05SETVZK2iXpxkbYS9ISSdslrU7Iytqnps+hmQ2qDXg/MAV4EpiRkJ8BrAKGAG3ARiAf454FziOsdPcn4PKMdb4N+F4MTwRWN9B+i4CbUuRl7ZeRXh8BmmL4VuDWRtuLMFX9RmASYRGsVcAZDdJlLDAthkcAr8Zrlno9M9ZtMzCqRPZ94OYYvrl4PRt4Hf8NnNIIewEXAdOS93E5+9T6ORx0NQgzW2tmr6REzQUeMrMOM3uNsEbFTEljgWPM7GkLV+B+4Kqs9I21lWuAX2dVZpWk2i+rws3sCTMrrm7/DGEVwkYzE9hgZpvMbD/wEMFOmWNmW81sRQy3A2sJa78fqcwF7ovh+8jwmUvhEmCjmVU7S8NhYWb/AHaUiMvZp6bP4aBzEH0wDngjcbwlysbFcKk8Ky4EtpnZ+oSsTdILkv4u6cIMdSlyQ2zKWZKo2pazXyP4HKGmV6RR9jqSbHIASROBqcC/oijtemaJAU9Iel7SgigbY2F1SeL+hAboVWQePT/QGm0vKG+fmt5zA9JBSPqLpNUpW19fb2n/K1gf8qz0nE/Pm3MrMMHMpgLfAB6UdEwt9KlQrzuBycDZUZfbitlSTlXTPtSV2EvSQqALeCCK6m6vvlROkTW0X7mk4cBS4EYz20X565kls8xsGnA58BVJFzVAh1QUljyeA/w2io4Ee/VFTe+5ui052kjM7NIqsm0BxieOTwbeivKTU+SHzaH0lNQEfAyYnsjTAXTE8POSNgKnATVbSq9S+0m6B3gkHpazX82owF7XAVcAl8TmwEzs1Qd1t0l/kNRMcA4PmNnvAcxsWyI+eT0zw8zeivvtkh4mNIlskzTWzLbGZt7tWesVuRxYUbTTkWCvSDn71PSeG5A1iCpZBsyTNERSG3Aq8GysvrVLOjf+H3At8IeMdLoUWGdmB5q4JI2WlI/hSVHPTRnpQ7wZi1wNFHtWpNovQ70uA74NzDGzPQl5I+31HHCqpLb4JTqPYKfMiffuL4C1ZvbDhLzc9cxKr2GSRhTDhM4Gqwl2ui4mu47snrlSetTgG22vBOXsU9vnsFE9Axq1ES7qFsJX5Tbg8UTcQsK//q+Q6KkEzCDcCBuBxcQR6Bnoei9wfYns48AaQk+FFcCVGdvvl8BLwIvxZhx7KPtlpNcGQtvryrjddYTYazahx9BGYGGWZZfocQGhqeHFhI1m93U9M9JrUrw2q+J1WhjlxwN/BdbH/XENsNnRwDtAa0KWub0IDmor0BnfXZ/vyz61fA59qg3HcRwnFW9ichzHcVJxB+E4juOk4g7CcRzHScUdhOM4jpOKOwjHcRwnFXcQzqBD0tWSTNLph3mez0ha3M88UyX9/HDK7ePcF0t6JIavkHRLPcpxBg/uIJzByHzgKcLAtaz5LvDjShMrUM1z+igwR9LRVeR1HMAdhDPIiHMRzSIMNpqXkF8s6UlJv1NYV+KBOPoYSbOj7CmF9UB6Ta8QR2wvlfRc3GalpBkBnGVmq+LxIkk3JeJXK6xfMVFh3YafEgb3jZd0p6TlCms53JLIc1lRN8K0LABYGOD0JGHqEcepCncQzmDjKuAxM3sV2CFpWiJuKnAjYU79ScAsSUOBnxFGpF4AjC5z3h8Bt5vZOYTR22nNSMUR+ZUwBbjfzKZamGZ6oZnNAM4CPijprKjbPcCVhFl/Tyw5x/Iod5yqcAfhDDbmE9ZlIO7nJ+KeNbMtZlYgTEUxETgd2GRhbn0ovy7HpcBihZX/lgHHFOcYSjAWeLtCPV83s2cSx9dIWgG8AJxJcGKnA6+Z2fpYY/hVyTm2AydVWJ7j9GJAzubqOGlIOh74MPABSUZYKcwkfSsm6Ugk7yY8H5UuL5sDzjOzvX2k2QsMTRx30fMjLRn3XkLvNuAm4Bwz+6+kexNp+5orZ2gs03GqwmsQzmDiE4Rmm1PMbKKZjQdeI0xkV451wCSFRXYAPlUm3RPADcUDSWenpFkLvC9xvJmwlCSxqautzLmPITiMnZLGEKagLurWJmlyPJ5fku80GjfbqDMAcAfhDCbmAw+XyJYCny6XIdYIvgw8Fv8I3gbsTEn6VWCGwkpjLwPXp5xrHdCaaHpaChwXm6W+RJj1NU2HVYSmpTXAEuCfUb4PWAA8GnUrXRLzQ4TeTI5TFT6bq+McAknDzWx37NX0E2C9md1e5bm+DrSbWV3GQiTKGQM8aGaX1LMcZ2DjNQjHOTRfiF/5a4BWQq+marmTnv911IsJwDczKMcZwHgNwnEcx0nFaxCO4zhOKu4gHMdxnFTcQTiO4zipuINwHMdxUnEH4TiO46TyP+wpiP4ukrKYAAAAAElFTkSuQmCC\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "tt = TakagiTaupin(xtal, scan)\n",
+    "\n",
+    "scan_vector, diffracted, transmission = tt.run()\n",
+    "tt.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Also in this case, the correspondence with _XCRYSTAL_ is practically perfect. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 11,
+   "metadata": {},
+   "outputs": [
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ref = np.loadtxt('reference_spectra/xop_Ge_400_laue_transmission.dat')\n",
+    "ref2 = np.loadtxt('reference_spectra/xop_Ge_400_laue_diffraction.dat')\n",
+    "\n",
+    "plt.plot(scan_vector,transmission)\n",
+    "plt.plot(scan_vector,diffracted)\n",
+    "plt.plot(ref[:,0],ref[:,1])\n",
+    "plt.plot(ref2[:,0],ref2[:,1])\n",
+    "plt.legend(['pyTTE transmission', 'pyTTE diffraction', 'XCRYSTAL transmission', 'XCRYSTAL diffraction'])\n",
+    "plt.ylabel('Reflectivity')\n",
+    "plt.xlabel('Angle (urad)')\n",
+    "plt.show()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Third example: bent crystals and energy scans\n",
+    "\n",
+    "Deformation can be introduced by passing the meridional and sagittal bending radii (`Rx` and `Ry`, respectively) to TTcrystal. In the case of spherical bending, a single keyword `R` can be used."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 12,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Solving the 1D Takagi-Taupin equation for Si(6,6,0) reflection\n",
+      "---------------------------------------------------------------\n",
+      "\n",
+      "Using automatically determined scan limits:\n",
+      "E min: -382.2324461218393 meV\n",
+      "E max: 413.26703657958467 meV\n",
+      "\n",
+      "The direction of diffraction out of the crystal -> Bragg case\n",
+      "Solving for pi-polarization\n",
+      "Asymmetry angle : 5.0 deg\n",
+      "Wavelength      : 0.1236412431724223 nm\n",
+      "Energy          : 10.027737494284125 keV\n",
+      "Bragg angle     : 75.0 deg\n",
+      "Incidence angle : 80.0 deg\n",
+      "Exit angle      : 70.0 deg\n",
+      "\n",
+      "Structure factors\n",
+      "F0   : (113.56318578240287+1.758716852254629j)\n",
+      "Fh   : (32.4906364543163+1.7587168522545933j)\n",
+      "Fb   : (32.4906364543163+1.758716852254665j)\n",
+      "\n",
+      "Susceptibilities\n",
+      "chi0 : (-9.722518519838743e-06+1.50569544605429e-07j)\n",
+      "chih : (-2.7816304418732393e-06+1.5056954460542595e-07j)\n",
+      "chib : (-2.7816304418732393e-06+1.5056954460543206e-07j)\n",
+      "\n",
+      "(Mean F and chi values for energy scan)\n",
+      "\n",
+      "Transmission in the Bragg case not implemented!\n",
+      "\n",
+      "Calculating the TT-curve using 4 cores.\n",
+      "Solving...0%\n",
+      "Done.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ttx = TTcrystal(crystal='Si', hkl=[6,6,0], thickness=Quantity(150,'um'), R = Quantity(100,'cm'), asymmetry = Quantity(5, 'deg'))\n",
+    "tts = TTscan(scan = 200, constant = Quantity(75, 'deg'), polarization = 'pi')\n",
+    "\n",
+    "tt = TakagiTaupin(ttx,tts)\n",
+    "\n",
+    "tt.run()\n",
+    "tt.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "By default _pyTTE_ attempts to calculate the toroidal/spherical/cylindrical bending using elastic constants from a built-in compliance matrix $S$ (Source: CRC Handbook of Chemistry and Physics, 82nd edition). \n",
+    "\n",
+    "For anisotropic crystals, _PyTTE_ has two different deformation models, selected with the TTcrystal keyword `fix_to_axis`. The default value is `'shape'` which assumes that the main axes of curvature are along the coordinate axes $x$ and $y$, and are given by `Rx` and `Ry`. This corresponds to the situation where the crystal is forced to a specific shape _e.g._ by the substrate. The other option is `torques` which assumes that the crystal is bent by two orthogonal torques acting about the aforemention coordinate axes. This applies, for example, when a free standing crystal slab is bent by its ends. In the general case these models are not equal due to non-diagonal elements of $S$. See TTcrystal.ipynb, help(TTcrystal) or the technical docs for more information.\n",
+    "\n",
+    "Built-in $S$:s are available only for a handful of crystals commonly encountered in X-ray optics. In other cases user needs to define $S$ manually with the keyword `S`. Alternatively, an isotropic deformation model can be used by giving Poisson's ratio $\\nu$ with `nu`. Also Young's modulus $E$ is required but its value is not important here as it is not used in by deformation model. `fix_to_axes` is neglected as the two anisotropic models reduce to the same isotropic model. "
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 13,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Solving the 1D Takagi-Taupin equation for Si(6,6,0) reflection\n",
+      "---------------------------------------------------------------\n",
+      "\n",
+      "Using automatically determined scan limits:\n",
+      "E min: -396.7773903713954 meV\n",
+      "E max: 427.8119808291406 meV\n",
+      "\n",
+      "The direction of diffraction out of the crystal -> Bragg case\n",
+      "Solving for pi-polarization\n",
+      "Asymmetry angle : 5.0 deg\n",
+      "Wavelength      : 0.1236412431724223 nm\n",
+      "Energy          : 10.027737494284125 keV\n",
+      "Bragg angle     : 75.0 deg\n",
+      "Incidence angle : 80.0 deg\n",
+      "Exit angle      : 70.0 deg\n",
+      "\n",
+      "Structure factors\n",
+      "F0   : (113.56318578247442+1.7587168524648462j)\n",
+      "Fh   : (32.49063645438787+1.7587168524648105j)\n",
+      "Fb   : (32.49063645438786+1.758716852464882j)\n",
+      "\n",
+      "Susceptibilities\n",
+      "chi0 : (-9.722518519844868e-06+1.5056954462342635e-07j)\n",
+      "chih : (-2.781630441879366e-06+1.5056954462342328e-07j)\n",
+      "chib : (-2.781630441879365e-06+1.5056954462342942e-07j)\n",
+      "\n",
+      "(Mean F and chi values for energy scan)\n",
+      "\n",
+      "Transmission in the Bragg case not implemented!\n",
+      "\n",
+      "Calculating the TT-curve using 4 cores.\n",
+      "Solving...0%\n",
+      "Done.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "ttx = TTcrystal(crystal='Si', hkl=[6,6,0], thickness=Quantity(150,'um'), R = Quantity(100,'cm'), asymmetry = Quantity(5, 'deg'), nu = 0.22, E = Quantity(150, 'GPa'))\n",
+    "tts = TTscan(scan = 200, constant = Quantity(75, 'deg'), polarization = 'pi')\n",
+    "\n",
+    "tt = TakagiTaupin(ttx,tts)\n",
+    "\n",
+    "tt.run()\n",
+    "tt.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Also custom deformation fields can be defined by providing the Jacobian of the displacement vector $\\mathbf{u}$ as a function of $x$ and $z$:\n",
+    "\n",
+    "$\\begin{equation}\n",
+    "J(x,z) = \\left[\\begin{matrix}\n",
+    "\\frac{\\partial u_x}{\\partial x}(x,z) & \\frac{\\partial u_x}{\\partial z}(x,z) \\\\\n",
+    "\\frac{\\partial u_z}{\\partial x}(x,z) & \\frac{\\partial u_z}{\\partial z}(x,z)\n",
+    "\\end{matrix}\\right]\n",
+    "\\end{equation}$\n",
+    "\n",
+    "For reference, we do this for the isotropic bending below. Note that the lengths are exceptionally required to be in micrometers."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 14,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "\n",
+      "Solving the 1D Takagi-Taupin equation for Si(6,6,0) reflection\n",
+      "---------------------------------------------------------------\n",
+      "\n",
+      "Using automatically determined scan limits:\n",
+      "E min: -396.7773903713954 meV\n",
+      "E max: 427.8119808291406 meV\n",
+      "\n",
+      "The direction of diffraction out of the crystal -> Bragg case\n",
+      "Solving for pi-polarization\n",
+      "Asymmetry angle : 5.0 deg\n",
+      "Wavelength      : 0.1236412431724223 nm\n",
+      "Energy          : 10.027737494284125 keV\n",
+      "Bragg angle     : 75.0 deg\n",
+      "Incidence angle : 80.0 deg\n",
+      "Exit angle      : 70.0 deg\n",
+      "\n",
+      "Structure factors\n",
+      "F0   : (113.56318578247442+1.7587168524648462j)\n",
+      "Fh   : (32.49063645438787+1.7587168524648105j)\n",
+      "Fb   : (32.49063645438786+1.758716852464882j)\n",
+      "\n",
+      "Susceptibilities\n",
+      "chi0 : (-9.722518519844868e-06+1.5056954462342635e-07j)\n",
+      "chih : (-2.781630441879366e-06+1.5056954462342328e-07j)\n",
+      "chib : (-2.781630441879365e-06+1.5056954462342942e-07j)\n",
+      "\n",
+      "(Mean F and chi values for energy scan)\n",
+      "\n",
+      "Transmission in the Bragg case not implemented!\n",
+      "\n",
+      "Calculating the TT-curve using 4 cores.\n",
+      "Solving...0%\n",
+      "Done.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "def jacobian(x,z):\n",
+    "    nu = 0.22\n",
+    "    R_bend_in_um = 1e6\n",
+    "    thickness_in_um = 150\n",
+    "\n",
+    "    ux_x = -(z+0.5*thickness_in_um)/R_bend_in_um \n",
+    "    ux_z = -x/R_bend_in_um \n",
+    "\n",
+    "    uz_x = x/R_bend_in_um \n",
+    "    uz_z = 2*nu/(1-nu)/R_bend_in_um*(z+0.5*thickness_in_um)\n",
+    "\n",
+    "    return [[ux_x,ux_z],[uz_x,uz_z]]\n",
+    "\n",
+    "ttx = TTcrystal(crystal='Si', hkl=[6,6,0], thickness=Quantity(150,'um'), asymmetry = Quantity(5, 'deg'))\n",
+    "tts = TTscan(scan = 200, constant = Quantity(75, 'deg'), polarization = 'pi')\n",
+    "\n",
+    "#The custom Jacobian is given to TTcrystal after the initialization\n",
+    "ttx.set_deformation(jacobian = jacobian)\n",
+    "\n",
+    "tt = TakagiTaupin(ttx,tts)\n",
+    "\n",
+    "tt.run()\n",
+    "tt.plot()"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "### Fourth example: Initialization from file\n",
+    "\n",
+    "Parameters can also be defined in two input files for `TTcrystal` and `TTscan` which can be passed directly to `TakagiTaupin`."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": 15,
+   "metadata": {},
+   "outputs": [
+    {
+     "name": "stdout",
+     "output_type": "stream",
+     "text": [
+      "CRYSTAL PARAMETERS\n",
+      "------------------\n",
+      "\n",
+      "Crystal: LiF\n",
+      "Crystallographic parameters:\n",
+      "    a = 0.402629 nm,  b = 0.402629 nm,  c = 0.402629 nm\n",
+      "    alpha = 90.0 deg,  beta = 90.0 nm,  gamma = 90.0 deg\n",
+      "Direct primitive vectors (before rotations, in nm):\n",
+      "    a1 = [0.4026 0.     0.    ]\n",
+      "    a2 = [0.     0.4026 0.    ]\n",
+      "    a3 = [0.     0.     0.4026]\n",
+      "Reciprocal primitive vectors (before rotations, in 1/nm):\n",
+      "    b1 = [15.6054 -0.     -0.    ]\n",
+      "    b2 = [ 0.     15.6054 -0.    ]\n",
+      "    b3 = [ 0.      0.     15.6054]\n",
+      "\n",
+      "Reflection: [2, 0, 0]\n",
+      "Asymmetry angle: 2.5 deg\n",
+      "In-plane rotation angle: 0 deg\n",
+      "Crystal directions parallel to the Cartesian axes (after rotations):\n",
+      "    x || [ 0.0437  0.     -1.    ]\n",
+      "    y || [0. 1. 0.]\n",
+      "    z || [ 1.     -0.      0.0437]\n",
+      "\n",
+      "Crystal thickness: 200.0 um\n",
+      "Debye-Waller factor: 1.0\n",
+      "\n",
+      "Deformation model: anisotropic toroidal, fixed shape (built-in)\n",
+      "Meridional bending radius: 1.0 m\n",
+      "Sagittal bending radius: inf m\n",
+      "Material elastic isotropy: anisotropic\n",
+      "Compliance matrix S (with rotations applied):\n",
+      "[[ 0.0116 -0.0034 -0.0034  0.     -0.0006 -0.    ]\n",
+      " [-0.0034  0.0116 -0.0034 -0.      0.      0.    ]\n",
+      " [-0.0034 -0.0034  0.0116  0.      0.0006  0.    ]\n",
+      " [ 0.     -0.      0.      0.0157  0.      0.    ]\n",
+      " [-0.0006 -0.      0.0006  0.      0.0158  0.    ]\n",
+      " [-0.      0.      0.     -0.      0.      0.0157]] GPa^-1\n",
+      "\n",
+      "SCAN PARAMETERS\n",
+      "---------------\n",
+      "\n",
+      "Scan type     : angle\n",
+      "Scan constant : 8.0 keV\n",
+      "Polarization  : sigma\n",
+      "Scan points   : 150\n",
+      "Scan range    : manual from -100.0 to 25.0 arcsec\n",
+      "\n",
+      "Output type                : photon flux\n",
+      "Integrator                 : zvode_bdf\n",
+      "(Minimum) integration step : 1.0 nm\n",
+      "Alternative starting depth : None\n",
+      "\n",
+      "\n",
+      "Solving the 1D Takagi-Taupin equation for LiF(2,0,0) reflection\n",
+      "----------------------------------------------------------------\n",
+      "\n",
+      "The direction of diffraction out of the crystal -> Bragg case\n",
+      "Solving for sigma-polarization\n",
+      "Asymmetry angle : 2.5 deg\n",
+      "Wavelength      : 0.15498024125 nm\n",
+      "Energy          : 8.0 keV\n",
+      "Bragg angle     : 22.63875705418331 deg\n",
+      "Incidence angle : 25.13875705418331 deg\n",
+      "Exit angle      : 20.13875705418331 deg\n",
+      "\n",
+      "Structure factors\n",
+      "F0   : (48.308801053928676+0.2252026682557719j)\n",
+      "Fh   : (30.32578967926102+0.22520266825576818j)\n",
+      "Fb   : (30.32578967926102+0.2252026682557756j)\n",
+      "\n",
+      "Susceptibilities\n",
+      "chi0 : (-1.5945657492171985e-05+7.433437667643659e-08j)\n",
+      "chih : (-1.0009866625862263e-05+7.433437667643537e-08j)\n",
+      "chib : (-1.0009866625862263e-05+7.433437667643781e-08j)\n",
+      "\n",
+      "(Mean F and chi values for energy scan)\n",
+      "\n",
+      "Transmission in the Bragg case not implemented!\n",
+      "\n",
+      "Calculating the TT-curve using 4 cores.\n",
+      "Solving...0%\n",
+      "Done.\n"
+     ]
+    },
+    {
+     "data": {
+      "image/png": "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\n",
+      "text/plain": [
+       "<Figure size 432x288 with 1 Axes>"
+      ]
+     },
+     "metadata": {
+      "needs_background": "light"
+     },
+     "output_type": "display_data"
+    }
+   ],
+   "source": [
+    "'''\n",
+    "Contents of TTcrystal_init.inp:\n",
+    "\n",
+    "crystal LiF\n",
+    "hkl 2 0 0\n",
+    "thickness 200 um\n",
+    "asymmetry 2.5 deg\n",
+    "Rx 1 m\n",
+    "\n",
+    "Contents of TTscan_init.inp:\n",
+    "\n",
+    "constant 8 keV\n",
+    "scan -100 25 150 arcsec\n",
+    "polarization sigma\n",
+    "solver zvode_bdf\n",
+    "integration_step 1 nm\n",
+    "'''\n",
+    "\n",
+    "tt = TakagiTaupin('TTcrystal_init.inp','TTscan_init.inp')\n",
+    "\n",
+    "print(tt)\n",
+    "\n",
+    "tt.run()\n",
+    "tt.plot()\n",
+    "plt.show()"
+   ]
+  }
+ ],
+ "metadata": {
+  "kernelspec": {
+   "display_name": "Python 3",
+   "language": "python",
+   "name": "python3"
+  },
+  "language_info": {
+   "codemirror_mode": {
+    "name": "ipython",
+    "version": 3
+   },
+   "file_extension": ".py",
+   "mimetype": "text/x-python",
+   "name": "python",
+   "nbconvert_exporter": "python",
+   "pygments_lexer": "ipython3",
+   "version": "3.6.10"
+  }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 4
+}
diff --git a/examples/reference_spectra/xop_Ge_400_laue_diffraction.dat b/examples/reference_spectra/xop_Ge_400_laue_diffraction.dat
new file mode 100644
index 0000000..098d1ad
--- /dev/null
+++ b/examples/reference_spectra/xop_Ge_400_laue_diffraction.dat
@@ -0,0 +1,154 @@
+#F C:\Users\aripekka\Documents\GitHub\pyTTE\examples\reference_spectra\xop_Ge_400_laue_diffraction.dat
+#S 1 File written by xplot on Tue Apr 21 18:43:54 2020
+#N 2
+#L    Th-ThB{in} [microrad]  s-polarized
+-100 6.77053E-005 
+-98.6577 6.93013E-005 
+-97.3154 8.15526E-005 
+-95.9732 0.000103448 
+-94.6309 0.000131363 
+-93.2886 0.000159731 
+-91.9463 0.000182368 
+-90.604 0.000194179 
+-89.2617 0.000192814 
+-87.9195 0.000179776 
+-86.5772 0.000160519 
+-85.2349 0.000143324 
+-83.8926 0.000137048 
+-82.5503 0.000148292 
+-81.2081 0.000178808 
+-79.8658 0.000224133 
+-78.5235 0.000274206 
+-77.1812 0.000316215 
+-75.8389 0.000339094 
+-74.4966 0.000338285 
+-73.1544 0.000318863 
+-71.8121 0.000295278 
+-70.4698 0.000286906 
+-69.1275 0.000310313 
+-67.7852 0.000370978 
+-66.443 0.000458422 
+-65.1007 0.00054829 
+-63.7584 0.000612418 
+-62.4161 0.00063381 
+-61.0738 0.000619384 
+-59.7315 0.000601919 
+-58.3893 0.000626179 
+-57.047 0.000722856 
+-55.7047 0.000884206 
+-54.3624 0.0010602 
+-53.0201 0.00118636 
+-51.6779 0.00123321 
+-50.3356 0.00124338 
+-48.9933 0.00131667 
+-47.651 0.00153453 
+-46.3087 0.00187465 
+-44.9664 0.00220557 
+-43.6242 0.00240685 
+-42.2819 0.00252716 
+-40.9396 0.00278852 
+-39.5973 0.00334946 
+-38.255 0.00406033 
+-36.9128 0.00460911 
+-35.5705 0.00502214 
+-34.2282 0.0057782 
+-32.8859 0.00708053 
+-31.5436 0.00838126 
+-30.2013 0.00942451 
+-28.8591 0.0110886 
+-27.5168 0.0136453 
+-26.1745 0.0159694 
+-24.8322 0.0186677 
+-23.4899 0.0230142 
+-22.1477 0.0272784 
+-20.8054 0.0325685 
+-19.4631 0.0399211 
+-18.1208 0.0471586 
+-16.7785 0.0576945 
+-15.4362 0.0682858 
+-14.094 0.0826394 
+-12.7517 0.0971025 
+-11.4094 0.115579 
+-10.0671 0.134296 
+-8.72483 0.154498 
+-7.38255 0.176579 
+-6.04027 0.197142 
+-4.69799 0.215327 
+-3.3557 0.230866 
+-2.01342 0.242458 
+-0.671141 0.248728 
+0.671141 0.24893 
+2.01342 0.24304 
+3.3557 0.231758 
+4.69799 0.21643 
+6.04027 0.198397 
+7.38255 0.177989 
+8.72483 0.155916 
+10.0671 0.135524 
+11.4094 0.116828 
+12.7517 0.0981851 
+14.094 0.0835494 
+15.4362 0.0691474 
+16.7785 0.058341 
+18.1208 0.0477585 
+19.4631 0.0404221 
+20.8054 0.0328998 
+22.1477 0.0277015 
+23.4899 0.0232177 
+24.8322 0.0188734 
+26.1745 0.0162361 
+27.5168 0.0137423 
+28.8591 0.0111634 
+30.2013 0.00959884 
+31.5436 0.00849259 
+32.8859 0.00708047 
+34.2282 0.00580999 
+35.5705 0.0051318 
+36.9128 0.00469232 
+38.255 0.00405642 
+39.5973 0.00332141 
+40.9396 0.00281473 
+42.2819 0.00260151 
+43.6242 0.00246404 
+44.9664 0.00220537 
+46.3087 0.00183873 
+47.651 0.00151358 
+48.9933 0.00133877 
+50.3356 0.00129446 
+51.6779 0.00127673 
+53.0201 0.00119587 
+54.3624 0.00103688 
+55.7047 0.000851156 
+57.047 0.000705979 
+58.3893 0.000637449 
+59.7315 0.000634631 
+61.0738 0.000655195 
+62.4161 0.000654779 
+63.7584 0.000610413 
+65.1007 0.00052756 
+66.443 0.000431618 
+67.7852 0.000351975 
+69.1275 0.000307798 
+70.4698 0.000301381 
+71.8121 0.000320041 
+73.1544 0.000343745 
+74.4966 0.000354115 
+75.8389 0.000341048 
+77.1812 0.000305009 
+78.5235 0.000255124 
+79.8658 0.000204615 
+81.2081 0.00016568 
+82.5503 0.000145607 
+83.8926 0.000145135 
+85.2349 0.00015913 
+86.5772 0.000178927 
+87.9195 0.000195353 
+89.2617 0.000201421 
+90.604 0.00019399 
+91.9463 0.000174128 
+93.2886 0.00014628 
+94.6309 0.000116668 
+95.9732 9.14618E-005 
+97.3154 7.52121E-005 
+98.6577 6.98985E-005 
+100 7.47322E-005 
diff --git a/examples/reference_spectra/xop_Ge_400_laue_transmission.dat b/examples/reference_spectra/xop_Ge_400_laue_transmission.dat
new file mode 100644
index 0000000..af71b04
--- /dev/null
+++ b/examples/reference_spectra/xop_Ge_400_laue_transmission.dat
@@ -0,0 +1,154 @@
+#F C:\Users\aripekka\Documents\GitHub\pyTTE\examples\reference_spectra\xop_Ge_400_laue_transmission.dat
+#S 1 File written by xplot on Tue Apr 21 18:44:50 2020
+#N 2
+#L    Th-ThB{in} [microrad]  s-polarized
+-100 0.00657606 
+-98.6577 0.0067082 
+-97.3154 0.00683604 
+-95.9732 0.00696159 
+-94.6309 0.00708937 
+-93.2886 0.00722562 
+-91.9463 0.00737685 
+-90.604 0.00754821 
+-89.2617 0.00774188 
+-87.9195 0.00795617 
+-86.5772 0.00818573 
+-85.2349 0.00842285 
+-83.8926 0.00865986 
+-82.5503 0.00889198 
+-81.2081 0.00911966 
+-79.8658 0.0093496 
+-78.5235 0.00959376 
+-77.1812 0.00986618 
+-75.8389 0.0101784 
+-74.4966 0.0105351 
+-73.1544 0.0109314 
+-71.8121 0.0113537 
+-70.4698 0.0117851 
+-69.1275 0.0122132 
+-67.7852 0.0126379 
+-66.443 0.0130751 
+-65.1007 0.0135539 
+-63.7584 0.0141051 
+-62.4161 0.0147473 
+-61.0738 0.0154747 
+-59.7315 0.0162578 
+-58.3893 0.0170592 
+-57.047 0.0178602 
+-55.7047 0.0186825 
+-54.3624 0.0195888 
+-53.0201 0.0206521 
+-51.6779 0.0219065 
+-50.3356 0.0233157 
+-48.9933 0.0247954 
+-47.651 0.026292 
+-46.3087 0.0278622 
+-44.9664 0.0296668 
+-43.6242 0.0318437 
+-42.2819 0.0343596 
+-40.9396 0.0370285 
+-39.5973 0.0397596 
+-38.255 0.0427793 
+-36.9128 0.0464508 
+-35.5705 0.0507821 
+-34.2282 0.0553743 
+-32.8859 0.0601727 
+-31.5436 0.0658592 
+-30.2013 0.0727568 
+-28.8591 0.0801162 
+-27.5168 0.0879284 
+-26.1745 0.0974997 
+-24.8322 0.108325 
+-23.4899 0.119461 
+-22.1477 0.1329 
+-20.8054 0.147607 
+-19.4631 0.162936 
+-18.1208 0.181083 
+-16.7785 0.198721 
+-15.4362 0.219035 
+-14.094 0.237932 
+-12.7517 0.258548 
+-11.4094 0.276042 
+-10.0671 0.292822 
+-8.72483 0.306125 
+-7.38255 0.313483 
+-6.04027 0.316221 
+-4.69799 0.313253 
+-3.3557 0.303202 
+-2.01342 0.286375 
+-0.671141 0.264022 
+0.671141 0.237699 
+2.01342 0.20908 
+3.3557 0.179727 
+4.69799 0.150837 
+6.04027 0.123544 
+7.38255 0.0996594 
+8.72483 0.0801799 
+10.0671 0.0628911 
+11.4094 0.0482316 
+12.7517 0.038109 
+14.094 0.0283738 
+15.4362 0.0223704 
+16.7785 0.0163903 
+18.1208 0.0131736 
+19.4631 0.00931716 
+20.8054 0.00778077 
+22.1477 0.00559763 
+23.4899 0.00420925 
+24.8322 0.00374345 
+26.1745 0.00248529 
+27.5168 0.001885 
+28.8591 0.00190338 
+30.2013 0.00135241 
+31.5436 0.000776291 
+32.8859 0.000815655 
+34.2282 0.000912478 
+35.5705 0.000609618 
+36.9128 0.000264558 
+38.255 0.000260123 
+39.5973 0.000438095 
+40.9396 0.000454188 
+42.2819 0.000256522 
+43.6242 6.46317E-005 
+44.9664 5.30502E-005 
+46.3087 0.000180884 
+47.651 0.000286169 
+48.9933 0.00026441 
+50.3356 0.000144059 
+51.6779 3.0088E-005 
+53.0201 3.78464E-006 
+54.3624 6.82784E-005 
+55.7047 0.000164231 
+57.047 0.000223275 
+58.3893 0.000213194 
+59.7315 0.000149431 
+61.0738 7.59637E-005 
+62.4161 3.50078E-005 
+63.7584 4.49839E-005 
+65.1007 9.58603E-005 
+66.443 0.000159553 
+67.7852 0.00020651 
+69.1275 0.00021931 
+70.4698 0.000198022 
+71.8121 0.000157049 
+73.1544 0.000116777 
+74.4966 9.45446E-005 
+75.8389 9.8554E-005 
+77.1812 0.00012633 
+78.5235 0.000167299 
+79.8658 0.000207708 
+81.2081 0.000235742 
+82.5503 0.000245098 
+83.8926 0.000236194 
+85.2349 0.000215072 
+86.5772 0.000190788 
+87.9195 0.000172316 
+89.2617 0.000165971 
+90.604 0.000173978 
+91.9463 0.000194376 
+93.2886 0.000222076 
+94.6309 0.000250586 
+95.9732 0.000273853 
+97.3154 0.000287751 
+98.6577 0.000290876 
+100 0.000284584 
diff --git a/examples/reference_spectra/xop_Si_111_bragg.dat b/examples/reference_spectra/xop_Si_111_bragg.dat
new file mode 100644
index 0000000..77a417b
--- /dev/null
+++ b/examples/reference_spectra/xop_Si_111_bragg.dat
@@ -0,0 +1,154 @@
+#F C:\Users\aripekka\Documents\GitHub\pyTTE\examples\reference_spectra\xop_Si_111_bragg.dat
+#S 1 File written by xplot on Tue Apr 21 18:04:27 2020
+#N 2
+#L    Th-ThB{in} [microrad]  s-polarized
+-50 0.0211421 
+-48.6577 0.0217195 
+-47.3154 0.0223211 
+-45.9732 0.0229486 
+-44.6309 0.0236032 
+-43.2886 0.0242868 
+-41.9463 0.025001 
+-40.604 0.0257478 
+-39.2617 0.0265292 
+-37.9195 0.0273473 
+-36.5772 0.0282047 
+-35.2349 0.0291038 
+-33.8926 0.0300475 
+-32.5503 0.0310389 
+-31.2081 0.0320813 
+-29.8658 0.0331783 
+-28.5235 0.0343339 
+-27.1812 0.0355525 
+-25.8389 0.0368389 
+-24.4966 0.0381982 
+-23.1544 0.0396363 
+-21.8121 0.0411596 
+-20.4698 0.0427751 
+-19.1275 0.0444907 
+-17.7852 0.046315 
+-16.443 0.0482577 
+-15.1007 0.0503298 
+-13.7584 0.0525434 
+-12.4161 0.0549122 
+-11.0738 0.0574515 
+-9.73154 0.0601789 
+-8.38926 0.0631144 
+-7.04698 0.0662805 
+-5.7047 0.0697034 
+-4.36242 0.073413 
+-3.02013 0.0774441 
+-1.67785 0.0818372 
+-0.33557 0.0866398 
+1.00671 0.0919077 
+2.34899 0.0977076 
+3.69128 0.104119 
+5.03356 0.111239 
+6.37584 0.119184 
+7.71812 0.1281 
+9.0604 0.138168 
+10.4027 0.149621 
+11.745 0.162756 
+13.0872 0.177968 
+14.4295 0.195788 
+15.7718 0.216959 
+17.1141 0.242551 
+18.4564 0.274188 
+19.7987 0.314491 
+21.1409 0.368072 
+22.4832 0.444092 
+23.8255 0.563223 
+25.1678 0.732451 
+26.5101 0.814464 
+27.8523 0.841706 
+29.1946 0.853608 
+30.5369 0.859399 
+31.8792 0.862109 
+33.2215 0.863028 
+34.5638 0.862797 
+35.906 0.861769 
+37.2483 0.860157 
+38.5906 0.85809 
+39.9329 0.855656 
+41.2752 0.852911 
+42.6175 0.849891 
+43.9597 0.846622 
+45.302 0.843117 
+46.6443 0.839386 
+47.9866 0.83543 
+49.3289 0.831247 
+50.6711 0.826829 
+52.0134 0.822168 
+53.3557 0.817248 
+54.698 0.812052 
+56.0403 0.806557 
+57.3825 0.800736 
+58.7248 0.794559 
+60.0671 0.787986 
+61.4094 0.780972 
+62.7517 0.773463 
+64.094 0.765393 
+65.4362 0.756685 
+66.7785 0.747243 
+68.1208 0.73695 
+69.4631 0.725662 
+70.8054 0.713199 
+72.1477 0.699333 
+73.4899 0.683778 
+74.8322 0.666165 
+76.1745 0.646025 
+77.5168 0.622763 
+78.8591 0.595663 
+80.2013 0.563949 
+81.5436 0.527024 
+82.8859 0.484998 
+84.2282 0.439385 
+85.5705 0.393169 
+86.9128 0.34959 
+88.255 0.310694 
+89.5973 0.277056 
+90.9396 0.248344 
+92.2819 0.223888 
+93.6242 0.202986 
+94.9664 0.185013 
+96.3087 0.169453 
+97.651 0.155889 
+98.9933 0.143986 
+100.336 0.133476 
+101.678 0.124141 
+103.02 0.115807 
+104.362 0.10833 
+105.705 0.101592 
+107.047 0.0954942 
+108.389 0.0899558 
+109.732 0.0849076 
+111.074 0.0802913 
+112.416 0.0760572 
+113.758 0.0721629 
+115.101 0.0685716 
+116.443 0.0652518 
+117.785 0.0621759 
+119.128 0.0593198 
+120.47 0.0566624 
+121.812 0.0541853 
+123.154 0.0518721 
+124.497 0.0497081 
+125.839 0.0476806 
+127.181 0.0457779 
+128.523 0.0439898 
+129.866 0.0423071 
+131.208 0.0407215 
+132.55 0.0392254 
+133.893 0.0378121 
+135.235 0.0364755 
+136.577 0.0352101 
+137.919 0.0340107 
+139.262 0.0328727 
+140.604 0.031792 
+141.946 0.0307647 
+143.289 0.0297873 
+144.631 0.0288566 
+145.973 0.0279695 
+147.315 0.0271234 
+148.658 0.0263157 
+150 0.0255442 
diff --git a/pyTTE/__init__.py b/pyTTE/__init__.py
index f511d67..9691af8 100755
--- a/pyTTE/__init__.py
+++ b/pyTTE/__init__.py
@@ -1,5 +1,8 @@
-from .pyTTE import takagitaupin
+from .pyTTE import TakagiTaupin, TTcrystal, TTscan
+from .legacy import takagitaupin 
+
 from . import deformation
 from . import elastic_tensors
+from .quantity import Quantity
 
-__all__=['takagitaupin','deformation','elastic_tensors']
+__all__ = ['TakagiTaupin', 'TTcrystal', 'TTscan', 'takagitaupin', 'deformation', 'elastic_tensors', 'Quantity']
diff --git a/pyTTE/crystal_vectors.py b/pyTTE/crystal_vectors.py
new file mode 100755
index 0000000..9b69731
--- /dev/null
+++ b/pyTTE/crystal_vectors.py
@@ -0,0 +1,55 @@
+from __future__ import division, print_function
+import numpy as np
+
+def crystal_vectors(xtal):
+    '''
+    Calculates the direct and reciprocal unit vectors for a given 
+    crystal data obtained from xraylib.Crystal_GetCrystal(). Assumes the direct 
+    vector a1 to be perpendicular to x-axis and a2 to lie in xy-plane.
+
+    Parameters
+    ----------
+    
+    xtal : dict
+        Representation of a crystal returned by xraylib.Crystal_GetCrystal()
+
+
+    Returns
+    ------- 
+    
+        a_matrix : 3x3 Numpy array 
+            Matrix containing the direct unit vectors as columns in 
+            angstroms.           
+            
+        b_matrix : 3x3 Numpy array 
+            Matrix containing the reciprocal unit vectors as columns in
+            inverse angstroms.
+            
+    '''
+
+    a = xtal['a']; b = xtal['b']; c = xtal['c']
+    alpha = np.radians(xtal['alpha'])
+    beta  = np.radians(xtal['beta'])
+    gamma = np.radians(xtal['gamma'])
+
+    #calculate the direct vectors
+    a1 = a*np.array([[1, 0, 0]])
+    a2 = b*np.array([[np.cos(gamma), np.sin(gamma), 0]])
+
+    aux1 = np.cos(beta) * np.sin(gamma)
+    aux2 = np.cos(alpha) - np.cos(beta) * np.cos(gamma)
+    aux3 = np.sqrt(  np.sin(gamma)**2 - np.cos(alpha)**2 - np.cos(beta)**2 
+                   - 2*np.cos(alpha)*np.cos(beta)*np.cos(gamma))
+    
+    a3 = c/np.sin(gamma)*np.array([[aux1,aux2,aux3]])
+
+    #calculate the reciprocal vectors
+    volume = np.dot(np.cross(a1, a2), a3.T)
+    b1 = 2*np.pi*np.cross(a2, a3)/volume
+    b2 = 2*np.pi*np.cross(a3, a1)/volume
+    b3 = 2*np.pi*np.cross(a1 ,a2)/volume
+
+    a_matrix = np.concatenate((a1, a2, a3)).T   
+    b_matrix = np.concatenate((b1, b2, b3)).T   
+
+    return a_matrix, b_matrix
\ No newline at end of file
diff --git a/pyTTE/deformation.py b/pyTTE/deformation.py
index 531c6d5..377c028 100755
--- a/pyTTE/deformation.py
+++ b/pyTTE/deformation.py
@@ -1,67 +1,295 @@
 from __future__ import division, print_function
-from numpy import inf
+from numpy import array, finfo, cos, sin, arctan2, isinf
+from .elastic_tensors import rotate_elastic_matrix
+from .rotation_matrix import inplane_rotation
 
-def isotropic_plate(Rx,Ry,nu,thickness):
+def isotropic_plate(R1,R2,nu,thickness):
     '''
-    Creates a function for computing the Jacobian of
-    the displacement field for an isotropic plate.
-    HINT: For cylindrical bending with anticlastic
-    curvature, set Ry = -Rx/nu
+    Creates a function for computing the Jacobian of the displacement field 
+    for an isotropic plate.
+
+    Parameters
+    ----------
+    
+    R1 : float, 'inf' or None
+        The meridional bending radius due to torques (in the same units as R1 
+        and thickness). Use 'inf' if the direction is not curved. None sets the 
+        corresponding torque to zero and R1 is calculated as an anticlastic
+        reaction to the other torque.
+        
+    R2 : float, 'inf' or None
+        The sagittal bending radius due to torques (in the same units as R1 
+        and thickness). Use 'inf' if the direction is not curved. None sets the 
+        corresponding torque to zero and R1 is calculated as an anticlastic
+        reaction to the other torque.
+        
+    nu : float
+        Poisson's ratio of the material.
+        
+    thickness : float
+        The thickness of the crystal (in the same units as R1 and R2)
+
+
+    Returns
+    -------    
+        
+    jacobian : function
+        Returns the partial derivatives of the displacement vector u as a 
+        function of coordinates (x,z). The length scale is determined by the
+        units of R1, R2 and thickness.
+
+    R1 : float
+        The meridional bending radius due to torques (in the units defined by 
+        the input). Calculated by the function if due to anticlastic bending.
+    
+    R2 : float
+        The sagittal bending radius due to torques (in the units defined by the
+        input). Calculated by the function if due to anticlastic bending.
     '''
 
-    if Rx == 'inf' or Rx == 'Inf' or Rx == inf:
-        invRx = 0
-    else:
-        invRx = 1/Rx
+    if R1 is None:
+        if R2 is None or isinf(float(R2)):
+            invR1 = 0
+            invR2 = 0        
+
+            R1 = 'inf'
+            R2 = 'inf'
+        else:
+            R1 = -R2/nu #anticlastic bending
+            invR1 = 1.0/R1
+
+    elif R2 is None:
+        if isinf(float(R1)):
+            invR1 = 0
+            invR2 = 0
+
+            R1 = 'inf'
+            R2 = 'inf'
+        else:
+            R2 = -R1/nu #anticlastic bending
+            invR2 = 1.0/R2
 
-    if Ry == 'inf' or Ry == 'Inf' or Ry == inf:
-        invRy = 0
     else:
-        invRy = 1/Ry
+        if isinf(float(R1)):
+            invR1 = 0
+            R1 = 'inf'
+        else:
+            invR1 = 1/R1
+    
+        if isinf(float(R2)):
+            invR2 = 0
+            R2 = 'inf'
+        else:
+            invR2 = 1/R2
 
     def jacobian(x,z):
-        ux_x = -(z+0.5*thickness)*invRx
-        ux_z = -x*invRx
+        ux_x = -(z+0.5*thickness)*invR1
+        ux_z = -x*invR1
 
-        uz_x = x*invRx
-        uz_z = nu/(1-nu)*(invRx+invRy)*(z+0.5*thickness)
+        uz_x = x*invR1
+        uz_z = nu/(1-nu)*(invR1+invR2)*(z+0.5*thickness)
 
         return [[ux_x,ux_z],[uz_x,uz_z]]
 
-    return jacobian
+    return jacobian, R1, R2
 
-def anisotropic_plate(Rx,Ry,S,thickness):
+def anisotropic_plate_fixed_torques(R1,R2,S,thickness):
     '''
-    Creates a function for computing the Jacobian of
-    the displacement field for an isotropic plate.
-    HINT: For cylindrical bending with anticlastic
-    curvature, set Ry = S_11/S_12*Rx
+    Creates a function for computing the Jacobian of the displacement field 
+    for an anisotropic plate with fixed torques.
+    
+    Parameters
+    ----------
+    
+    R1 : float, 'inf' or None
+        The meridional bending radius due to torques (in the same units as R1 
+        and thickness). Use 'inf' if the direction is not curved. None sets the 
+        corresponding torque to zero and R1 is calculated as an anticlastic
+        reaction to the other torque.
+        
+    R2 : float, 'inf' or None
+        The sagittal bending radius due to torques (in the same units as R1 
+        and thickness). Use 'inf' if the direction is not curved. None sets the 
+        corresponding torque to zero and R1 is calculated as an anticlastic
+        reaction to the other torque.
+        
+    S : 6x6 Numpy array of floats
+        The compliance matrix in the Voigt notation. Units are not important.
+        
+    thickness : float
+        The thickness of the crystal (in the same units as R1 and R2)
+
+
+    Returns
+    -------    
+        
+    jacobian : function
+        Returns the partial derivatives of the displacement vector u as a 
+        function of coordinates (x,z). The length scale is determined by the
+        units of R1, R2 and thickness.
+
+    R1 : float
+        The meridional bending radius due to torques (in the units defined by 
+        the input). Calculated by the function if due to anticlastic bending.
+    
+    R2 : float
+        The sagittal bending radius due to torques (in the units defined by the
+        input). Calculated by the function if due to anticlastic bending.      
     '''
-    if Rx == 'inf' or Rx == 'Inf' or Rx == inf:
-        invRx = 0
-    else:
-        invRx = 1/Rx
 
-    if Ry == 'inf' or Ry == 'Inf' or Ry == inf:
-        invRy = 0
-    else:
-        invRy = 1/Ry
+    S = array(S)
 
-    #Precomputed coefficients
-    mx = (S[0][1]*invRy-S[1][1]*invRx)/(S[0][0]*S[1][1]-S[0][1]*S[1][0])
-    my = (S[1][0]*invRx-S[0][0]*invRy)/(S[0][0]*S[1][1]-S[0][1]*S[1][0])
+    if R1 is None:             
+        m1 = 0 #no torque about y-axis
+        
+        if R2 is None or isinf(float(R2)):
+            #If both bending radii are set to None, or R2 = inf when m1 = 0, it
+            #it implies that there no torques acting on the wafer  
+            m2 = 0
+            R1 = 'inf'
+            R2 = 'inf'
+        else:
+            m2 = -1.0/(S[1,1] * R2)            
+            R1 = -1.0/(S[0,1] * m2) #anticlastic reaction
+            
+    elif R2 is None:        
+        m2 = 0 #no torque about x-axis     
+        if isinf(float(R1)):
+            m1 = 0
+            R1 = 'inf'
+            R2 = 'inf'
+        else:   
+            m1 = -1.0/(S[0,0] * R1) 
+            R2 = -1.0/(S[1,0] * m1) #anticlastic reaction
+    else:
+        if isinf(float(R1)):
+            R1 = 'inf' #for output
+            invR1 = 0
+        else:
+            invR1 = 1/R1
 
-    coef1 = S[0][0]*mx + S[0][1]*my
-    coef2 = S[4][0]*mx + S[4][1]*my
-    coef3 = S[2][0]*mx + S[2][1]*my
+        if isinf(float(R2)):
+            R2 = 'inf' #for output
+            invR2 = 0
+        else:
+            invR2 = 1/R2
 
+        m_divider = S[1,1]*S[0,0] - S[0,1]*S[0,1]
+        m1 = (S[0,1]*invR2 - S[1,1]*invR1)/m_divider
+        m2 = (S[0,1]*invR1 - S[0,0]*invR2)/m_divider
+    
+    #Coefficients for the Jacobian
+    coef1 = S[0,0]*m1 + S[0,1]*m2
+    coef2 = S[4,0]*m1 + S[4,1]*m2
+    coef3 = S[2,0]*m1 + S[2,1]*m2
+    
     def jacobian(x,z):
         ux_x = coef1*(z+0.5*thickness)
-        ux_z = coef1*x+coef2*(z+0.5*thickness)
+        ux_z = coef1*x + coef2*(z+0.5*thickness)
 
         uz_x = -coef1*x
         uz_z = coef3*(z+0.5*thickness)
 
         return [[ux_x,ux_z],[uz_x,uz_z]]
 
-    return jacobian
+    return jacobian, R1, R2
+
+
+def anisotropic_plate_fixed_shape(R1,R2,S,thickness):
+    '''
+    Creates a function for computing the Jacobian of the displacement field 
+    for an anisotropic plate with fixed shape.
+    
+    Parameters
+    ----------
+    
+    R1 : float or 'inf'
+        The meridional bending radius (in the same units as R2 and thickness).
+        Use 'inf' if the direction is not curved.
+        
+    R2 : float or 'inf'
+        The sagittal bending radius (in the same units as R1 and thickness)
+        Use 'inf' if the direction is not curved.
+        
+    S : 6x6 Numpy array of floats
+        The compliance matrix in the Voigt notation. Units are not important.
+        
+    thickness : float
+        The thickness of the crystal (in the same units as R1 and R2)
+
+
+    Returns
+    -------    
+    
+    jacobian : function
+        Returns the partial derivatives of the displacement vector u as a 
+        function of coordinates (x,z). The length scale is determined by the
+        units of R1, R2 and thickness.
+
+    R1 : float
+        The meridional bending radius due to torques (in the units defined by 
+        the input). Returned for the output compatibility.
+    
+    R2 : float
+        The sagittal bending radius due to torques (in the units defined by the
+        input). Returned for the output compatibility.            
+    '''
+    
+    #Convert the bending radii to their inverses:    
+    if isinf(float(R1)):
+        invR1 = 0
+        R1 = 'inf'
+    else:
+        invR1 = 1.0/R1
+
+    if isinf(float(R2)):
+        invR2 = 0
+        R2 = 'inf'
+    else:
+        invR2 = 1.0/R2
+
+    #Calculate the rotation angle alpha
+    S = array(S)
+    meps = finfo(type(S[0][0])).eps #machine epsilon
+    
+    if abs(S[5,0]) < meps and abs(S[5,1]) < meps and abs(S[1,1] - S[0,0]) < meps\
+    and abs(S[0,0] + S[1,1] - 2*S[0,1] - S[5,5]) < meps:
+        alpha = 0  
+    else:
+        Aa = S[5,5]*(S[0,0] + S[1,1] + 2*S[0,1]) - (S[5,0] + S[5,1])**2
+        Ba = 2*(S[5,1]*(S[0,1] + S[0,0]) - S[5,0]*(S[0,1] + S[1,1])) 
+        Ca = S[5,5]*(S[1,1]-S[0,0]) + S[5,0]**2 - S[5,1]**2
+        Da = 2*(S[5,1]*(S[0,1] - S[0,0]) + S[5,0]*(S[0,1] - S[1,1]))
+
+        alpha = 0.5*arctan2(Da*(invR2+invR1) - Ba*(invR2-invR1), 
+                            Aa*(invR2-invR1) - Ca*(invR2+invR1))
+
+    #rotate S by alpha
+    Sp = rotate_elastic_matrix(S, 'S', inplane_rotation(alpha))
+
+    #Compute torques
+    m_divider = 2*(Sp[0,0]*Sp[1,1] - Sp[0,1]*Sp[0,1])
+    
+    mx = ((Sp[0,1]-Sp[1,1])*(invR2 + invR1)
+         +(Sp[0,1]+Sp[1,1])*(invR2 - invR1)*cos(2*alpha))
+    mx = mx / m_divider
+
+    my = ((Sp[0,1]-Sp[0,0])*(invR2 + invR1)
+         -(Sp[0,1]+Sp[0,0])*(invR2 - invR1)*cos(2*alpha))
+    my = my / m_divider  
+
+    #Coefficients for the Jacobian
+    coef1 = Sp[2,0]*mx + Sp[2,1]*my
+    coef2 = ((Sp[4,0]*mx + Sp[4,1]*my)*cos(alpha) 
+            -(Sp[3,0]*mx + Sp[3,1]*my)*sin(alpha))
+
+    def jacobian(x,z):
+        ux_x = -invR1*(z+0.5*thickness)
+        ux_z = -invR1*x + coef2*(z+0.5*thickness)
+
+        uz_x = invR1*x
+        uz_z = coef1*(z+0.5*thickness)
+
+        return [[ux_x,ux_z],[uz_x,uz_z]]
+
+    return jacobian, R1, R2
diff --git a/pyTTE/elastic_tensors.py b/pyTTE/elastic_tensors.py
index 7f766d6..2ca0b21 100755
--- a/pyTTE/elastic_tensors.py
+++ b/pyTTE/elastic_tensors.py
@@ -3,39 +3,72 @@
 
 #Elastic constants for single crystals in units 10^11 Pa
 #Source: CRC Handbook of Chemistry and Physics, 82nd edition
+#
+#Contains only (some) crystals available in xraylib
+
 CRYSTALS = {
-            'Si' : {'system' : 'cubic', 'C11' : 1.6578, 'C12' : 0.6394, 'C44' : 0.7962},
-            'Ge' : {'system' : 'cubic', 'C11' : 1.2835, 'C12' : 0.4823, 'C44' : 0.6666},
-            'CaMoO4' : {'system' : 'tetragonal', 'C11' : 1.447, 'C12' : 0.664,\
-                        'C13' : 0.455, 'C16' : 0.134, 'C33':1.265,'C44':0.369,'C66':0.451},
-            'CaCO3'  : {'system' : 'orthorhombic', 'C11' : 1.5958, 'C12' : 0.3663, 'C13' : 0.0197,\
-                        'C22' : 0.8697,'C23':0.1597, 'C33':0.8503,'C44' : 0.4132,'C55':0.2564,'C66':0.4274},
-            'aegirine' : {'system' : 'monoclinic', 'C11' : 1.858, 'C12' : 0.685, 'C13' : 0.707, 'C15':0.098,'C22':1.813,\
-                         'C23':0.626, 'C25':0.094,'C33':2.344,'C35':0.214,'C44':0.629,'C46':0.077,'C55':0.510,'C66':0.474},
-            'Be' : {'system' : 'hexagonal', 'C11': 2.923, 'C12':0.267, 'C13':0.140, 'C33':3.364,'C55':1.625},
-            'quartz' : {'system': 'trigonal', 'C11': 0.8670, 'C12':0.0704, 'C13':0.1191, 'C14':-0.1804,'C33':1.0575,'C44':0.5820},
-
-            'test_cubic' : {'system' : 'cubic', 'C11' : 11, 'C12' : 12, 'C44' : 44},
-            'test_tetragonal' : {'system' : 'tetragonal', 'C11' : 11, 'C12' : 12,'C13' : 13, 'C16' : 16, 'C33':33,'C44':44,'C66':66},
-            'test_orthorhombic'  : {'system' : 'orthorhombic', 'C11':11,'C12':12,'C13':13,'C22':22,'C23':23,'C33':33,'C44' : 44,'C55':55,'C66':66},
-            'test_monoclinic' : {'system' : 'monoclinic', 'C11':11,'C12' :12,'C13':13,'C15':15,'C22':22,'C23':23,'C25':25,'C33':33,'C35':35,'C44':44,'C46':46,'C55':55,'C66':66},
-            'test_hexagonal' : {'system' : 'hexagonal', 'C11':11, 'C12':12, 'C13':13, 'C33':33,'C55':55},
-            'test_trigonal' : {'system': 'trigonal', 'C11':11,'C12':12,'C13':13,'C14':14,'C33':33,'C44':44},
-            'test_triclinic': {'system':'triclinic', 'C11':11,'C12':12,'C13':13,'C14':14,'C15':15,'C16':16,\
-                                                     'C22':22,'C23':23,'C24':24,'C25':25,'C26':26,\
-                                                     'C33':33,'C34':34,'C35':35,'C36':36,\
-                                                     'C44':44,'C45':45,'C46':46,\
-                                                     'C55':55,'C56':56,\
-                                                     'C66':66}
+            'AlphaQuartz' : {'system' :  'trigonal', 'C11' : 0.8670, 'C12' : 0.0704, 'C13' : 0.1191, 'C14' : -0.1804, 'C33' : 1.0575, 'C44' : 0.5820},
+            'Be'          : {'system' : 'hexagonal', 'C11' :  2.923, 'C12' :  0.267, 'C13' :  0.140, 'C33' :   3.364, 'C55' :  1.625},
+            'Beryl'       : {'system' : 'hexagonal', 'C11' :  2.800, 'C12' :  0.990, 'C13' :  0.670, 'C33' :   2.480, 'C55' :  0.658},
+            'Copper'      : {'system' :     'cubic', 'C11' :  1.683, 'C12' :  1.221, 'C44' :  0.757},
+
+            'GaAs'        : {'system' :     'cubic', 'C11' : 1.1877, 'C12' : 0.5372, 'C44' : 0.5944},
+            'Ge'          : {'system' :     'cubic', 'C11' : 1.2835, 'C12' : 0.4823, 'C44' : 0.6666},
+            'LiF'         : {'system' :     'cubic', 'C11' : 1.1397, 'C12' : 0.4767, 'C44' : 0.6364},
+            'Sapphire'    : {'system' :  'trigonal', 'C11' : 4.9735, 'C12' : 1.6397, 'C13' : 1.1220, 'C14' : -0.2358, 'C33' : 4.9911, 'C44' : 1.4739},
+            'Si'          : {'system' :     'cubic', 'C11' : 1.6578, 'C12' : 0.6394, 'C44' : 0.7962},
+
+
+            'prototype_cubic'        : {'system' :        'cubic', 'C11' : 11, 'C12' : 12, 'C44' : 44},
+            'prototype_tetragonal'   : {'system' :   'tetragonal', 'C11' : 11, 'C12' : 12, 'C13' : 13, 'C16' : 16, 'C33' : 33, 'C44' : 44, 'C66' : 66},
+            'prototype_orthorhombic' : {'system' : 'orthorhombic', 'C11' : 11, 'C12' : 12, 'C13' : 13, 'C22' : 22, 'C23' : 23, 'C33' : 33, 'C44' : 44, 'C55' : 55, 'C66' : 66},
+            'prototype_monoclinic'   : {'system' :   'monoclinic', 'C11' : 11, 'C12' : 12, 'C13' : 13, 'C15' : 15, 'C22' : 22, 'C23' : 23, 'C25' : 25, 
+                                                                   'C33' : 33, 'C35' : 35, 'C44' : 44, 'C46' : 46, 'C55' : 55, 'C66' : 66},
+            'prototype_hexagonal'    : {'system' :    'hexagonal', 'C11' : 11, 'C12' : 12, 'C13' : 13, 'C33' : 33, 'C55' : 55},
+            'prototype_trigonal'     : {'system' :     'trigonal', 'C11' : 11, 'C12' : 12, 'C13' : 13, 'C14' : 14, 'C33' : 33, 'C44' : 44},
+            'prototype_triclinic'    : {'system' :    'triclinic', 'C11' : 11, 'C12' : 12, 'C13' : 13, 'C14' : 14, 'C15' : 15, 'C16' : 16,
+                                                                   'C22' : 22, 'C23' : 23, 'C24' : 24, 'C25' : 25, 'C26' : 26,
+                                                                   'C33' : 33, 'C34' : 34, 'C35' : 35, 'C36' : 36,
+                                                                   'C44' : 44, 'C45' : 45, 'C46' : 46,
+                                                                   'C55' : 55, 'C56' : 56,
+                                                                   'C66' : 66}
            }
 
+CRYSTALS['Si2'] = CRYSTALS['Si']
+CRYSTALS['Si_NIST'] = CRYSTALS['Si']
+
+def list_crystals(remove_prototypes = True):
+    '''
+    Returns the list of crystals with elastic data available.
+
+    Input:
+        remove_prototypes = boolean, whether omit prototypes for crystal data entries from the 
+                            list (default: True)
+    Output:
+        xtal_str_list = list of available crystal strings to be used with crystal_vectors()
+                        or elastic_matrices(). When the crystallographic data is available 
+                        in xraylib, the strings are congruent.
+    '''
+
+    xtal_str_list = list(CRYSTALS.keys())
+
+    if remove_prototypes:
+        for i in range(len(xtal_str_list)-1,-1,-1):
+            if xtal_str_list[i][:10] == 'prototype_':
+                xtal_str_list.pop(i) 
+
+    return xtal_str_list
+
 def matrix2tensor(matrix,mtype):
     '''
     Converts the elastic matrices using Voigt notation to elastic tensors.
 
     Input:
-    matrix = 6x6 matrix in Voigt notation
-    mtype = 'C' or 'S' for stiffness or compliance matrix, respectively
+        matrix = 6x6 matrix in Voigt notation
+        mtype = 'C' or 'S' for stiffness or compliance matrix, respectively
+
+    Output:
+        T = 3x3x3x3 stiffness or compliance tensor
     '''
 
     T = np.zeros((3,3,3,3))
@@ -107,18 +140,21 @@ def matrix2tensor(matrix,mtype):
 
     return T
 
-def tensor2matrix(tensor, mtype):
+def tensor2matrix(tensor, ttype):
     '''
     Converts the elastic tensors to matrices using Voigt notation.
 
     Input:
-    matrix = 3x3x3x3 elastic tensor
-    mtype = 'C' or 'S' for stiffness or compliance matrix, respectively
+        tensor = 3x3x3x3 elastic tensor
+        mtype = 'C' or 'S' for stiffness or compliance tensor, respectively
+
+    Output:
+        matrix = 6x6 stiffness or compliance matrix
     '''
 
     T = tensor
 
-    if mtype == 'C':
+    if ttype == 'C':
         #stiffness matrix
         matrix = np.array([
             [T[0,0,0,0], T[0,0,1,1], T[0,0,2,2], T[0,0,1,2], T[0,0,0,2], T[0,0,0,1]],
@@ -128,7 +164,7 @@ def tensor2matrix(tensor, mtype):
             [T[2,0,0,0], T[2,0,1,1], T[2,0,2,2], T[2,0,1,2], T[0,2,0,2], T[2,0,0,1]],
             [T[1,0,0,0], T[1,0,1,1], T[1,0,2,2], T[1,0,1,2], T[1,0,0,2], T[0,1,0,1]]])
 
-    elif mtype == 'S':
+    elif ttype == 'S':
         #compliance matrix
         matrix = np.array([
             [  T[0,0,0,0],   T[0,0,1,1],   T[0,0,2,2], 2*T[0,0,1,2], 2*T[0,0,0,2], 2*T[0,0,0,1]],
@@ -138,138 +174,61 @@ def tensor2matrix(tensor, mtype):
             [2*T[2,0,0,0], 2*T[2,0,1,1], 2*T[2,0,2,2], 4*T[2,0,1,2], 4*T[0,2,0,2], 4*T[2,0,0,1]],
             [2*T[1,0,0,0], 2*T[1,0,1,1], 2*T[1,0,2,2], 4*T[1,0,1,2], 4*T[1,0,0,2], 4*T[0,1,0,1]]])
     else:
-        raise Exception('Invalid elastic matrix type!')
+        raise Exception('Invalid elastic tensor type!')
    
     return matrix
-    
-def rotation_matrix(hkl,system='cubic'):
-    '''
-        Computes the rotation matrix which aligns the given hkl along z-axis.
-        NOTE: works currently only for the cubic systems
-        TODO: figure out how to generalize to other systems, preferably by
-        obtaining the crystal directions from the elastic tensors (if possible)
-    '''
-    if not system == 'cubic':
-        raise NotImplementedError('Rotation of non-cubic systems not implemented!')
-
-    if hkl[0] or hkl[1]:
-        #rotation axis
-        u = np.array([hkl[1],-hkl[0]])/np.sqrt(hkl[0]**2+hkl[1]**2)
-        #rotation angle
-        th = np.arccos(hkl[2]/np.sqrt(hkl[0]**2+hkl[1]**2+hkl[2]**2))
-    else:
-        if hkl[2] > 0:
-            #zero deg rotation about -y
-            u = np.array([0,-1])
-            th = 0
-        else:
-            #180 deg rotation about -y
-            u = np.array([0,-1])
-            th = np.pi
-
-    #rotation matrix
-    R=np.array([[ np.cos(th) + u[0]**2*(1-np.cos(th)),          u[0]*u[1]*(1-np.cos(th)),  u[1]*np.sin(th)],
-                [            u[0]*u[1]*(1-np.cos(th)), np.cos(th)+u[1]**2*(1-np.cos(th)), -u[0]*np.sin(th)],
-                [                    -u[1]*np.sin(th),                   u[0]*np.sin(th),       np.cos(th)]])
-
-    return R
-
-def rotation_matrix_axis_angle(u,theta):
-    '''
-        Computes a matrix which performs a rotation of theta degrees counterclockwise about axis u.
-    '''    
-    #normalize
-    u = np.array(u)
-    u = u/np.sqrt(u[0]**2+u[1]**2+u[2]**2)
-    #rotation angle
-    th = np.radians(theta)
-
-    #rotation matrix
-    R=np.array([[        np.cos(th) + u[0]**2*(1-np.cos(th)), u[0]*u[1]*(1-np.cos(th)) - u[2]*np.sin(th), u[0]*u[2]*(1-np.cos(th)) + u[1]*np.sin(th)],
-                [ u[0]*u[1]*(1-np.cos(th)) + u[2]*np.sin(th),        np.cos(th) + u[1]**2*(1-np.cos(th)), u[1]*u[2]*(1-np.cos(th)) - u[0]*np.sin(th)],
-                [ u[0]*u[2]*(1-np.cos(th)) - u[1]*np.sin(th), u[1]*u[2]*(1-np.cos(th)) + u[0]*np.sin(th),        np.cos(th) + u[2]**2*(1-np.cos(th))]])
-
-    return R
-
-def compute_elastic_matrices(zdir, xtal):
+   
+def elastic_matrices(xtal_str):
     '''
-        Computes the compliance and stiffness matrices S and C a given z-direction.
-        The x- and y-directions are determined automatically
-        returns: S, C, x_dir, y_dir
+    Returns the stiffness and compliance matrices for a given crystal.
+
+    Input:
+        xtal_str = crystal string e.g. 'Si', 'Ge', 'AlphaQuartz'
+    Output:
+        C_matrix = stiffness matrix in units 10^{11} Pa
+        S_matrix = compliance matrix in units 10^{-11} Pa^-1
     '''
 
     try:
-        xtal_data=CRYSTALS[xtal]
+        xtal_data=CRYSTALS[xtal_str]
     except KeyError:
-        raise KeyError("Elastic parameters for '"+str(xtal)+"' not found!")
+        raise KeyError("Elastic parameters for '"+str(xtal_str)+"' not found!")
+
+    C11, C12, C13, C14, C15, C16  = 0, 0, 0, 0, 0, 0
+    C22, C23, C24, C25, C26 = 0, 0, 0, 0, 0
+    C33, C34, C35, C36 = 0, 0, 0, 0
+    C44, C45, C46 = 0, 0, 0
+    C55, C56 = 0, 0
+    C66 = 0
        
     if xtal_data['system'] == 'cubic':
         C11, C12, C44 = xtal_data['C11'], xtal_data['C12'], xtal_data['C44']
-        C13, C14, C15, C16 = C12, 0, 0, 0
-        C22, C23, C24, C25, C26 = C11, C12, 0, 0, 0
-        C33, C34, C35, C36 = C11, 0, 0, 0
-        C45, C46 = 0, 0
-        C55, C56 = C44, 0
-        C66 = C44
+        C22, C13, C23, C33, C55, C66 = C11, C12, C12, C11, C44, C44
     elif xtal_data['system'] == 'tetragonal':
-        C11, C12, C13 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13']
-        C16 = xtal_data['C16']
-        C33  = xtal_data['C33']
-        C44 = xtal_data['C44']
-        C66 = xtal_data['C66']
-        C14, C15 = 0, 0
-        C22, C23, C24, C25, C26 = C11, C13, 0, 0, -C16
-        C34, C35, C36 = 0, 0, 0
-        C45, C46 = 0, 0
-        C55, C56 = C44, 0
+        C11, C12, C13, C16 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13'], xtal_data['C16']
+        C33, C44, C66  = xtal_data['C33'], xtal_data['C44'], xtal_data['C66']
+        C22, C23, C26, C55 = C11, C13, -C16, C44
     elif xtal_data['system'] == 'orthorhombic':
-        C11, C12, C13 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13']
-        C22, C23 = xtal_data['C22'], xtal_data['C23']
-        C33  = xtal_data['C33']
-        C44 = xtal_data['C44']
-        C55 = xtal_data['C55']
-        C66 = xtal_data['C66']
-        C14, C15, C16 = 0,0,0
-        C24, C25, C26 = 0,0,0
-        C34, C35, C36 = 0,0,0
-        C45, C46 = 0,0
-        C56 = 0
+        C11, C12, C13, C22, C23 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13'], xtal_data['C22'], xtal_data['C23']
+        C33, C44, C55, C66  = xtal_data['C33'], xtal_data['C44'], xtal_data['C55'], xtal_data['C66']
     elif xtal_data['system'] == 'monoclinic':
-        C11, C12, C13 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13']
-        C15 = xtal_data['C15']
-        C22, C23, C25 = xtal_data['C22'], xtal_data['C23'], xtal_data['C25']
-        C33, C35 = xtal_data['C33'], xtal_data['C35']
-        C44, C46 = xtal_data['C44'], xtal_data['C46']
-        C55 = xtal_data['C55']
-        C66 = xtal_data['C66']
-        C14, C16, C24, C26, C34, C36, C45, C56 = 0,0,0,0,0,0,0,0
+        C11, C12, C13, C15 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13'], xtal_data['C15']
+        C22, C23, C25, C33, C35 = xtal_data['C22'], xtal_data['C23'], xtal_data['C25'], xtal_data['C33'], xtal_data['C35']
+        C44, C46, C55, C66 = xtal_data['C44'], xtal_data['C46'], xtal_data['C55'], xtal_data['C66']
     elif xtal_data['system'] == 'hexagonal':
         C11, C12, C13 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13']
-        C33  = xtal_data['C33']
-        C55 = xtal_data['C55']
-        C14, C15, C16 = 0, 0, 0
-        C22, C23, C24, C25, C26 = C11, C13, 0, 0, 0
-        C34, C35, C36 = 0, 0, 0
-        C44, C45, C46 = C55, 0, 0
-        C56 =  0
+        C33, C55  = xtal_data['C33'], xtal_data['C55']
+        C22, C23, C44 = C11, C13, C55
         C66 = (C11-C12)/2
     elif xtal_data['system'] == 'trigonal':
         C11, C12, C13, C14 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13'], xtal_data['C14']
-        C33  = xtal_data['C33']
-        C44 = xtal_data['C44']
-        C15, C16 = 0, 0
-        C22, C23, C24, C25, C26 = C11, C13, -C14, 0, 0
-        C34, C35, C36 = 0, 0, 0
-        C45, C46 =  0, 0
-        C55, C56 =  C44, C14
+        C33, C44 = xtal_data['C33'], xtal_data['C44']
+        C22, C23, C24, C55, C56 = C11, C13, -C14, C44, C14
         C66 = (C11-C12)/2
     elif xtal_data['system'] == 'triclinic':
-        C11, C12, C13 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13']
-        C14, C15, C16 = xtal_data['C14'], xtal_data['C15'], xtal_data['C16']
-        C22, C23, C24 = xtal_data['C22'], xtal_data['C23'], xtal_data['C24']
-        C25, C26 = xtal_data['C25'], xtal_data['C26']
-        C33, C34, C35 = xtal_data['C33'], xtal_data['C34'], xtal_data['C35']
-        C36 =  xtal_data['C36']
+        C11, C12, C13, C14, C15, C16 = xtal_data['C11'], xtal_data['C12'], xtal_data['C13'], xtal_data['C14'], xtal_data['C15'], xtal_data['C16']
+        C22, C23, C24, C25, C26 = xtal_data['C22'], xtal_data['C23'], xtal_data['C24'], xtal_data['C25'], xtal_data['C26']
+        C33, C34, C35, C36 = xtal_data['C33'], xtal_data['C34'], xtal_data['C35'], xtal_data['C36']
         C44, C45, C46 = xtal_data['C44'], xtal_data['C45'], xtal_data['C46']
         C55, C56 = xtal_data['C55'], xtal_data['C56']
         C66 = xtal_data['C66']
@@ -277,135 +236,47 @@ def compute_elastic_matrices(zdir, xtal):
         ValueError('Not a valid crystal system!')
 
     #Elastic matrices of the non-rotated coordinate system
-    Cmatrix = np.array([[C11, C12, C13, C14, C15, C16],
-                        [C12, C22, C23, C24, C25, C26],
-                        [C13, C23, C33, C34, C35, C36],
-                        [C14, C24, C34, C44, C45, C46],
-                        [C15, C25, C35, C45, C55, C56],
-                        [C16, C26, C36, C46, C56, C66]])
+    C_matrix = np.array([[C11, C12, C13, C14, C15, C16],
+                         [C12, C22, C23, C24, C25, C26],
+                         [C13, C23, C33, C34, C35, C36],
+                         [C14, C24, C34, C44, C45, C46],
+                         [C15, C25, C35, C45, C55, C56],
+                         [C16, C26, C36, C46, C56, C66]])
 
-    Smatrix = np.linalg.inv(Cmatrix)
+    S_matrix = np.linalg.inv(C_matrix)
 
-    #convert matrices to tensors
-    Crot = matrix2tensor(Cmatrix,'C')
-    Srot = matrix2tensor(Smatrix,'S')
+    return C_matrix, S_matrix
 
-    Q = rotation_matrix(zdir,xtal_data['system'])
-
-    #Rotate the tensors
-    for i in range(4):
-        Crot = np.tensordot(Q,Crot,axes=((1,),(i,)))
-        Srot = np.tensordot(Q,Srot,axes=((1,),(i,)))
-
-    #Assemble the elastic matrices
-    C = tensor2matrix(Crot,'C')
-    S = tensor2matrix(Srot,'S')
-
-    C=C*1e11 #in pascal
-    S=S*1e-11 #in 1/pascal
-
-    #calculate x and y directions
-    #TODO generalize to non-cubic systems
-    x_dir = np.dot(Q.T,np.array([[1,0,0]]).T)
-    y_dir = np.dot(Q.T,np.array([[0,1,0]]).T)
-    z_dir = np.dot(Q.T,np.array([[0,0,1]]).T)
-
-    return S, C, x_dir, y_dir
-
-def rotate_inplane(tensor, phi, x_dir = np.array([[1,0,0]]).T, y_dir = np.array([[0,1,0]]).T):
-    '''
-        Rotates the given tensor around the z-axis by phi degrees counterclockwise.
-        x_dir and y_dir are the crystal directions (normalized hkl) along the x- and 
-        y-axes.
+def rotate_elastic_tensor(tensor, rotation_matrix):
     '''
+    Performs the rotation described by rotation_matrix to the given elastic tensor.
 
-    #In-plane rotation
-    Q = rotation_matrix_axis_angle([0,0,1],phi)
-    for i in range(4):
-        tensor = np.tensordot(Q,tensor,axes=((1,),(i,)))
-
-    #calculate the crystal directions along the in-plane axes  
-
-    #this computes what were the directions of post-rotation x- and y axes 
-    #in terms of the pre-rotated x- and y- coordinates
-    prerot_x_coor = np.dot(Q.T, np.array([[1,0,0]]).T)
-    prerot_y_coor = np.dot(Q.T, np.array([[0,1,0]]).T)
-    
-    #prerotated x(y)-axis aligns with the crystal direction x(y)_dir
-    #and assuming that they are properly normalized, they form an orthonormal basis.
-    #Thus the postrotation x_dir and y_dir are linear combinations of
-    #prerot x_dir and y_dir based on the calculated coordinate transform:
-    new_x_dir = prerot_x_coor[0]*x_dir + prerot_x_coor[1]*y_dir
-    new_y_dir = prerot_y_coor[0]*x_dir + prerot_y_coor[1]*y_dir
-
-    return tensor, new_x_dir, new_y_dir
-
-def apply_asymmetry(tensor, phi, x_dir = np.array([[1,0,0]]).T, y_dir = np.array([[0,1,0]]).T):
-    '''
-        Rotates the given tensor around the y-axis by phi degrees counterclockwise.
-        This corresponds to the definition of clockwise-positive asymmetry angle in
-        xz-plane as defined in the documentation. x_dir and y_dir are the crystal 
-        directions (normalized hkl) along the x- and y-axes.
+    Input:
+        tensor = 3x3x3x3 elastic tensor
+        rotation_matrix = 3x3 rotation matrix
+    Output:
+        tensor_rot = rotated tensor
     '''
-
-    #Asymmetric rotation (note that in pyTTE documentation
-    #rotation angle is positive in clockwise direction in
-    #right-handed xz-plane = counterclockwise rotation around y-axis)
-    Q = rotation_matrix_axis_angle([0,1,0],phi)
+    tensor_rot = tensor
     for i in range(4):
-        tensor = np.tensordot(Q,tensor,axes=((1,),(i,)))
-
-    #calculate the crystal directions along the in-plane axes  
-
-    #this computes what were the directions of post-rotation x- and y axes 
-    #in terms of the pre-rotated x- and y- coordinates
-    prerot_x_coor = np.dot(Q.T, np.array([[1,0,0]]).T)
-    prerot_y_coor = np.dot(Q.T, np.array([[0,1,0]]).T)
-    
-    #prerotated x(y)-axis aligns with the crystal direction x(y)_dir
-    #and assuming that they are properly normalized, they form an orthonormal basis.
-    #Thus the postrotation x_dir and y_dir are linear combinations of
-    #prerot x_dir and y_dir based on the calculated coordinate transform:
-    new_x_dir = prerot_x_coor[0]*x_dir + prerot_x_coor[1]*y_dir
-    new_y_dir = prerot_y_coor[0]*x_dir + prerot_y_coor[1]*y_dir
-
-    return tensor, new_x_dir, new_y_dir
-    
-if __name__=='__main__':
-    #print('Cubic:\n',np.array2string(compute_elastic_matrices([1,0,0],'test_cubic')[1]/1e11,precision=4,suppress_small=True))
-
-    print('Cubic:\n',np.array2string(compute_elastic_matrices([1,0,0],'Si')[0]/1e-11,precision=4))
-    print('Cubic:\n',np.array2string(compute_elastic_matrices([1,0,0],'Si')[1]/1e11,precision=4))
-
-    S,C,x_dir,y_dir = compute_elastic_matrices([1,1,0],'Si')
-
-    tensor, x_dir, y_dir = rotate_inplane(matrix2tensor(S/1e-11,'S'), 45, x_dir,y_dir)
-    S = tensor2matrix(tensor,'S')
+        tensor_rot = np.tensordot(rotation_matrix,tensor_rot,axes=((1,),(i,)))
 
-    S36 = S[2,5]
-    S32 = S[2,1]
-    S31 = S[2,0]
+    return tensor_rot
 
-    max_grad_angle = np.degrees((np.arctan2(S36,S32-S31) + np.pi)/2)
-    print('Angle of steepest gradient: ', max_grad_angle,' deg')
-    max_grad_angle = np.degrees((np.arctan2(S36,S32-S31) - np.pi)/2)
-    print('Angle of steepest gradient: ', max_grad_angle,' deg')
-
-    print('In-plane rotation:')
-    print('Crystal direction along x: ',x_dir.T)
-    print('Crystal direction along y: ',y_dir.T)
-
-    #C,x,y = rotate_inplane_and_apply_asymmetry(matrix2tensor(compute_elastic_matrices([1,1,1],'test_cubic')[1]/1e11),0,90)
-
-    #print(np.array2string(tensor2matrix(C),precision=4,suppress_small=True))
-    #print('x',x)
-    #print('y',y)
-       
+def rotate_elastic_matrix(matrix, mtype, rotation_matrix):
     '''
-    print('Tetragonal:\n',np.array2string(compute_elastic_matrices([0,0,1],'test_tetragonal')[1]/1e11,precision=4,suppress_small=True))
-    print('Orthorhombic:\n',np.array2string(compute_elastic_matrices([0,0,1],'test_orthorhombic')[1]/1e11,precision=4,suppress_small=True))
-    print('Monoclinic:\n',np.array2string(compute_elastic_matrices([0,0,1],'test_monoclinic')[1]/1e11,precision=4,suppress_small=True))
-    print('Hexagonal:\n',np.array2string(compute_elastic_matrices([0,0,1],'test_hexagonal')[1]/1e11,precision=4,suppress_small=True))
-    print('Trigonal:\n',np.array2string(compute_elastic_matrices([0,0,1],'test_trigonal')[1]/1e11,precision=4,suppress_small=True))
-    print('Triclinic:\n',np.array2string(compute_elastic_matrices([0,0,1],'test_triclinic')[1]/1e11,precision=4,suppress_small=True))
+    Performs the rotation described by rotation_matrix to the given elastic matrix.
+
+    Input:
+        matrix = 6x6 elastic matrix
+        mtype = 'C' if the matrix to be rotated is the stiffness matrix 
+                or 'S' if the compliance matrix
+        rotation_matrix = 3x3 rotation matrix
+    Output:
+        matrix_rot = rotated matrix
     '''
+    tensor = matrix2tensor(matrix,mtype)
+    tensor_rot = rotate_elastic_tensor(tensor, rotation_matrix)
+    matrix_rot = tensor2matrix(tensor_rot,mtype)
+
+    return matrix_rot
diff --git a/pyTTE/examples/__init__.py b/pyTTE/examples/__init__.py
deleted file mode 100755
index 64972ec..0000000
--- a/pyTTE/examples/__init__.py
+++ /dev/null
@@ -1,54 +0,0 @@
-from .examples import *
-import matplotlib.pyplot as plt
-import time
-
-__all__ = ['run']
-
-def run():
-    print('Running all examples.')
-    t0 = time.time()
-    res = bragg_reflectivity_sigma()
-    res2 = bragg_reflectivity_pi_asymmetric()
-    res3 = laue_symmetric()
-    res4 = bragg_bent_symmetric()
-    print('Total running time: ' + str(time.time()-t0) + ' seconds.')
-
-    plt.figure()
-    plt.plot(res[0],res[1],linewidth = 2,label='pyTT')
-    plt.plot(res[2],res[3],linewidth = 2,label='XINPRO 1.2\n(T=25 K)')
-
-    plt.title('Unbent GaAs (004) in Bragg geometry')
-    plt.xlabel('$\\theta-\\theta_B$ (arc sec)')
-    plt.ylabel('Reflectivity')
-    plt.legend()
-
-    plt.figure()
-    plt.plot(res2[0],res2[1],linewidth = 2,label='pyTT')
-    plt.plot(res2[2],res2[3],linewidth = 2,label='XINPRO 1.2\n(T=75 K)')
-
-    plt.title('Unbent LiF (220) with 10 deg asymmetry in Bragg geometry')
-    plt.xlabel('$\\theta-\\theta_B$ (arc sec)')
-    plt.ylabel('Reflectivity')
-    plt.legend()
-
-    plt.figure()
-    plt.plot(res3[0],res3[1],linewidth = 2,label='pyTT (reflected)')
-    plt.plot(res3[0],res3[2],linewidth = 2,label='pyTT (transmitted)')
-    plt.plot(res3[3],res3[4],linewidth = 2,label='XINPRO 1.2\n(reflected, T=50 K)')
-    plt.plot(res3[3],res3[5],linewidth = 2,label='XINPRO 1.2\n(transmitted, T=50 K)')
-
-    plt.title('Unbent Ge (111) in Laue geometry')
-    plt.xlabel('$\\theta-\\theta_B$ (arc sec)')
-    plt.ylabel('Reflectivity')
-    plt.legend()
-
-    plt.figure()
-    plt.plot(res4[0],res4[1],linewidth = 2,label='pyTT')
-
-    plt.title('Cylindrically bent (R_b = 1 m) Si (660) in Bragg geometry at 88 deg')
-    plt.xlabel('$\Delta E$ (meV)')
-    plt.ylabel('Reflectivity')
-    plt.legend()
-
-
-    plt.show()
diff --git a/pyTTE/examples/examples.py b/pyTTE/examples/examples.py
deleted file mode 100755
index 64bbc7c..0000000
--- a/pyTTE/examples/examples.py
+++ /dev/null
@@ -1,88 +0,0 @@
-import numpy as np
-import time
-import os
-
-from .. import takagitaupin
-from .. import deformation
-
-def bragg_reflectivity_sigma():
-    print ('Computing Bragg reflectivity for 300 um thick, non-bent GaAS(400)')
-    print ('for sigma polarized beam at 6 keV in angle domain.')
-
-    th = np.linspace(-10,30,150)
-
-    t0 = time.time()
-    R,T=takagitaupin('angle',th,6,'sigma','GaAs',[4,0,0],0,300,None,1,1e-10)
-    print('It took ' + str(time.time()-t0) + ' seconds to solve ' + \
-          str(th.size) + ' points.\n')
-
-
-    A=np.loadtxt(os.path.dirname(__file__)+'/reference_curves/GaAs400_6keV_300micron_unbent_sigma.dat')
-
-    th_ref = A[:,0]
-    R_ref = A[:,1]
-
-
-    return th, R, th_ref, R_ref
-
-def bragg_reflectivity_pi_asymmetric():
-    print ('Computing Bragg reflectivity for 20 um thick, non-bent Li(220) with')
-    print ('asymmetry of 10 deg for pi polarized beam at 8 keV in angle domain.')
-
-    th = np.linspace(-2,8,150)
-
-    t0 = time.time()
-    R,T=takagitaupin('angle',th,8,'pi','LiF',[2,2,0],10,20,None,1,1e-10)
-    print('It took ' + str(time.time()-t0) + ' seconds to solve ' + \
-          str(th.size) + ' points.\n')
-
-    A=np.loadtxt(os.path.dirname(__file__)+'/reference_curves/LiF220_8keV_20micron_unbent_pi_asymm_10.dat')
-
-    th_ref = A[:,0]
-    R_ref = A[:,1]
-
-    return th, R, th_ref, R_ref
-
-def laue_symmetric():
-    print ('Computing Laue reflectivity and transmission for 100 um thick')
-    print ('non-bent Ge(111) for sigma polarized beam at 6 keV in angle domain.')
-
-    th = np.linspace(-40,20,150)
-
-    t0 = time.time()
-    R,T=takagitaupin('angle',th,6,'sigma','Ge',[1,1,1],90,100,None,1,1e-11)
-    print('It took ' + str(time.time()-t0) + ' seconds to solve ' + \
-          str(th.size) + ' points.\n')
-
-    A=np.loadtxt(os.path.dirname(__file__)+'/reference_curves/Ge111_6keV_100micron_unbent_laue_refl.dat')
-    B=np.loadtxt(os.path.dirname(__file__)+'/reference_curves/Ge111_6keV_100micron_unbent_laue_trans.dat')
-
-    th_ref = A[:,0]
-    R_ref = A[:,1]
-    T_ref = B[:,1]
-
-    return th, R, T, th_ref, R_ref, T_ref
-
-
-def bragg_bent_symmetric():
-    print ('Computing Bragg reflectivity for 300 um thick, cylindrically bent')
-    print ('Si(660) (1m bending radius) for sigma polarized at 88 deg in energy domain.')
-
-    e = np.linspace(-450,250,150)
-
-    thickness=300
-    R_bend = 1
-    nu = 0.27
-
-    #Define Jacobian for cylindrical bending
-    ujac= deformation.isotropic_plate(R_bend,-R_bend/nu,nu,thickness*1e-6)
-
-    t0 = time.time()
-    R,T=takagitaupin('energy',e,88,'sigma','Si',[6,6,0],0,thickness,ujac,1,1e-10)
-    print('It took ' + str(time.time()-t0) + ' seconds to solve ' + \
-          str(e.size) + ' points.\n')
-
-    #TODO: ADD REFERENCE FOR BENT (multilamellar?)
-
-    return e, R
-
diff --git a/pyTTE/examples/reference_curves/GaAs400_6keV_300micron_unbent_sigma.dat b/pyTTE/examples/reference_curves/GaAs400_6keV_300micron_unbent_sigma.dat
deleted file mode 100755
index a60335b..0000000
--- a/pyTTE/examples/reference_curves/GaAs400_6keV_300micron_unbent_sigma.dat
+++ /dev/null
@@ -1,150 +0,0 @@
--16.2738 0.0161231 
--15.9068 0.0165795 
--15.5398 0.0170558 
--15.1728 0.0175531 
--14.8058 0.0180728 
--14.4388 0.0186162 
--14.0719 0.0191848 
--13.7049 0.0197802 
--13.3379 0.0204042 
--12.9709 0.0210586 
--12.6039 0.0217455 
--12.2369 0.022467 
--11.87 0.0232257 
--11.503 0.0240241 
--11.136 0.0248651 
--10.769 0.0257518 
--10.402 0.0266877 
--10.035 0.0276766 
--9.66805 0.0287226 
--9.30107 0.0298302 
--8.93409 0.0310046 
--8.5671 0.0322514 
--8.20012 0.0335766 
--7.83313 0.0349874 
--7.46615 0.0364912 
--7.09917 0.0380968 
--6.73218 0.0398137 
--6.3652 0.0416529 
--5.99822 0.0436265 
--5.63123 0.0457485 
--5.26425 0.0480346 
--4.89726 0.0505028 
--4.53028 0.0531736 
--4.1633 0.0560708 
--3.79631 0.0592219 
--3.42933 0.0626587 
--3.06235 0.0664185 
--2.69536 0.0705453 
--2.32838 0.075091 
--1.96139 0.0801177 
--1.59441 0.0857001 
--1.22743 0.0919289 
--0.860444 0.0989156 
--0.49346 0.106798 
--0.126476 0.115751 
-0.240508 0.125996 
-0.607491 0.137821 
-0.974475 0.151609 
-1.34146 0.167882 
-1.70844 0.18737 
-2.07543 0.211136 
-2.44241 0.240807 
-2.80939 0.27905 
-3.17638 0.330669 
-3.54336 0.405926 
-3.91034 0.532816 
-4.27733 0.963326 
-4.64431 0.966374 
-5.0113 0.958248 
-5.37828 0.950963 
-5.74526 0.94429 
-6.11225 0.938026 
-6.47923 0.932039 
-6.84621 0.926238 
-7.2132 0.920555 
-7.58018 0.914938 
-7.94717 0.909344 
-8.31415 0.903737 
-8.68113 0.898082 
-9.04812 0.89235 
-9.4151 0.886508 
-9.78208 0.880526 
-10.1491 0.874372 
-10.5161 0.868009 
-10.883 0.861401 
-11.25 0.854503 
-11.617 0.847268 
-11.984 0.839639 
-12.351 0.831547 
-12.718 0.822915 
-13.0849 0.813645 
-13.4519 0.803617 
-13.8189 0.792684 
-14.1859 0.780654 
-14.5529 0.767282 
-14.9199 0.752244 
-15.2868 0.735103 
-15.6538 0.715258 
-16.0208 0.691865 
-16.3878 0.663738 
-16.7548 0.629233 
-17.1218 0.586313 
-17.4887 0.53337 
-17.8557 0.471743 
-18.2227 0.407972 
-18.5897 0.350008 
-18.9567 0.301494 
-19.3237 0.262109 
-19.6906 0.230197 
-20.0576 0.204101 
-20.4246 0.182497 
-20.7916 0.164387 
-21.1586 0.149031 
-21.5256 0.135874 
-21.8925 0.124496 
-22.2595 0.114577 
-22.6265 0.105866 
-22.9935 0.0981661 
-23.3605 0.0913196 
-23.7275 0.0851999 
-24.0944 0.0797036 
-24.4614 0.0747455 
-24.8284 0.0702551 
-25.1954 0.0661733 
-25.5624 0.0624502 
-25.9294 0.0590438 
-26.2964 0.055918 
-26.6633 0.0530418 
-27.0303 0.0503887 
-27.3973 0.0479356 
-27.7643 0.0456623 
-28.1313 0.0435512 
-28.4983 0.0415869 
-28.8652 0.0397558 
-29.2322 0.0380458 
-29.5992 0.0364463 
-29.9662 0.0349477 
-30.3332 0.0335416 
-30.7002 0.0322203 
-31.0671 0.0309771 
-31.4341 0.0298058 
-31.8011 0.0287009 
-32.1681 0.0276574 
-32.5351 0.0266707 
-32.9021 0.0257367 
-33.269 0.0248516 
-33.636 0.0240122 
-34.003 0.0232152 
-34.37 0.0224577 
-34.737 0.0217373 
-35.104 0.0210514 
-35.4709 0.0203979 
-35.8379 0.0197747 
-36.2049 0.01918 
-36.5719 0.0186121 
-36.9389 0.0180692 
-37.3059 0.0175501 
-37.6728 0.0170532 
-38.0398 0.0165774 
-38.4068 0.0161214 
diff --git a/pyTTE/examples/reference_curves/Ge111_6keV_100micron_unbent_laue_refl.dat b/pyTTE/examples/reference_curves/Ge111_6keV_100micron_unbent_laue_refl.dat
deleted file mode 100755
index 4a6f633..0000000
--- a/pyTTE/examples/reference_curves/Ge111_6keV_100micron_unbent_laue_refl.dat
+++ /dev/null
@@ -1,150 +0,0 @@
--44.5536 1.89977E-05 
--43.9555 2.64266E-05 
--43.3575 2.91152E-05 
--42.7594 2.53793E-05 
--42.1614 1.82019E-05 
--41.5634 1.34248E-05 
--40.9653 1.5594E-05 
--40.3673 2.43609E-05 
--39.7693 3.42864E-05 
--39.1712 3.86122E-05 
--38.5732 3.45038E-05 
--37.9752 2.57429E-05 
--37.3771 2.03437E-05 
--36.7791 2.43814E-05 
--36.1811 3.66819E-05 
--35.583 4.90137E-05 
--34.985 5.24165E-05 
--34.387 4.50229E-05 
--33.7889 3.46112E-05 
--33.1909 3.27328E-05 
--32.5929 4.44835E-05 
--31.9948 6.28517E-05 
--31.3968 7.38777E-05 
--30.7988 6.94777E-05 
--30.2007 5.64555E-05 
--29.6027 5.17227E-05 
--29.0047 6.60614E-05 
--28.4066 9.16022E-05 
--27.8086 0.000107613 
--27.2106 0.000101975 
--26.6125 8.68413E-05 
--26.0145 8.84095E-05 
--25.4165 0.000117281 
--24.8184 0.000152284 
--24.2204 0.000162359 
--23.6224 0.000146848 
--23.0243 0.000142786 
--22.4263 0.000179425 
--21.8283 0.000233093 
--21.2302 0.000252961 
--20.6322 0.000237765 
--20.0341 0.000250136 
--19.4361 0.000322822 
--18.8381 0.00039265 
--18.24 0.00039884 
--17.642 0.00040695 
--17.044 0.000506763 
--16.4459 0.000624588 
--15.8479 0.000652775 
--15.2499 0.000705449 
--14.6518 0.000895185 
--14.0538 0.00103994 
--13.4558 0.00110361 
--12.8577 0.0013535 
--12.2597 0.00162932 
--11.6617 0.00177688 
--11.0636 0.00219411 
--10.4656 0.00258046 
--9.86757 0.00294593 
--9.26953 0.00365548 
--8.6715 0.00413779 
--8.07346 0.00509387 
--7.47543 0.00584043 
--6.87739 0.00709969 
--6.27936 0.00812822 
--5.68133 0.00975519 
--5.08329 0.0111536 
--4.48526 0.0128539 
--3.88722 0.0148336 
--3.28919 0.0165084 
--2.69115 0.0181345 
--2.09312 0.0198046 
--1.49509 0.021249 
--0.897051 0.022261 
--0.299017 0.0227736 
-0.299017 0.0227736 
-0.897051 0.022261 
-1.49509 0.021249 
-2.09312 0.0198047 
-2.69115 0.0181346 
-3.28919 0.0165085 
-3.88722 0.0148337 
-4.48526 0.012854 
-5.08329 0.0111537 
-5.68133 0.00975533 
-6.27936 0.00812836 
-6.87739 0.00709983 
-7.47543 0.00584061 
-8.07346 0.00509399 
-8.6715 0.00413795 
-9.26953 0.00365563 
-9.86757 0.00294602 
-10.4656 0.00258067 
-11.0636 0.00219414 
-11.6617 0.00177703 
-12.2597 0.00162948 
-12.8577 0.00135347 
-13.4558 0.00110374 
-14.0538 0.00104012 
-14.6518 0.000895136 
-15.2499 0.00070547 
-15.8479 0.000652986 
-16.4459 0.000624647 
-17.044 0.00050665 
-17.642 0.000407004 
-18.24 0.000399056 
-18.8381 0.000392702 
-19.4361 0.000322679 
-20.0341 0.000250107 
-20.6322 0.00023796 
-21.2302 0.000253121 
-21.8283 0.000233013 
-22.4263 0.000179258 
-23.0243 0.000142806 
-23.6224 0.000147063 
-24.2204 0.000162513 
-24.8184 0.000152201 
-25.4165 0.000117085 
-26.0145 8.83599E-05 
-26.6125 8.70177E-05 
-27.2106 0.000102195 
-27.8086 0.000107646 
-28.4066 9.14261E-05 
-29.0047 6.58751E-05 
-29.6027 5.17325E-05 
-30.2007 5.66648E-05 
-30.7988 6.9691E-05 
-31.3968 7.38977E-05 
-31.9948 6.26678E-05 
-32.5929 4.42751E-05 
-33.1909 3.26988E-05 
-33.7889 3.47908E-05 
-34.387 4.52655E-05 
-34.985 5.25186E-05 
-35.583 4.8894E-05 
-36.1811 3.64463E-05 
-36.7791 2.42302E-05 
-37.3771 2.04059E-05 
-37.9752 2.5974E-05 
-38.5732 3.47258E-05 
-39.1712 3.86559E-05 
-39.7693 3.41219E-05 
-40.3673 2.41175E-05 
-40.9653 1.5459E-05 
-41.5634 1.35028E-05 
-42.1614 1.84392E-05 
-42.7594 2.56065E-05 
-43.3575 2.91716E-05 
-43.9555 2.62747E-05 
-44.5536 1.87478E-05 
diff --git a/pyTTE/examples/reference_curves/Ge111_6keV_100micron_unbent_laue_trans.dat b/pyTTE/examples/reference_curves/Ge111_6keV_100micron_unbent_laue_trans.dat
deleted file mode 100755
index 6e2325c..0000000
--- a/pyTTE/examples/reference_curves/Ge111_6keV_100micron_unbent_laue_trans.dat
+++ /dev/null
@@ -1,150 +0,0 @@
--44.5536 0.00115 
--43.9555 0.00116342 
--43.3575 0.00118287 
--42.7594 0.00120952 
--42.1614 0.00123997 
--41.5634 0.00126837 
--40.9653 0.00129071 
--40.3673 0.0013081 
--39.7693 0.00132644 
--39.1712 0.00135232 
--38.5732 0.00138794 
--37.9752 0.00142894 
--37.3771 0.00146733 
--36.7791 0.00149781 
--36.1811 0.00152262 
--35.583 0.00155056 
--34.985 0.00159025 
--34.387 0.00164262 
--33.7889 0.00169932 
--33.1909 0.00174928 
--32.5929 0.00178883 
--31.9948 0.00182635 
--31.3968 0.00187602 
--30.7988 0.00194486 
--30.2007 0.00202498 
--29.6027 0.00209976 
--29.0047 0.00216039 
--28.4066 0.00221699 
--27.8086 0.00229087 
--27.2106 0.00239271 
--26.6125 0.00250895 
--26.0145 0.00261445 
--25.4165 0.00270214 
--24.8184 0.00279621 
--24.2204 0.00292739 
--23.6224 0.00309389 
--23.0243 0.00325872 
--22.4263 0.00339754 
--21.8283 0.00353969 
--21.2302 0.00373646 
--20.6322 0.00398569 
--20.0341 0.00422606 
--19.4361 0.0044341 
--18.8381 0.00468049 
--18.24 0.00502348 
--17.642 0.00539524 
--17.044 0.00571792 
--16.4459 0.00607989 
--15.8479 0.00658676 
--15.2499 0.00712241 
--14.6518 0.00759649 
--14.0538 0.00820781 
--13.4558 0.00898359 
--12.8577 0.00967426 
--12.2597 0.0104743 
--11.6617 0.0115274 
--11.0636 0.0124566 
--10.4656 0.0136021 
--9.86757 0.014932 
--9.26953 0.0161294 
--8.6715 0.0177592 
--8.07346 0.0191238 
--7.47543 0.0209165 
--6.87739 0.0223754 
--6.27936 0.0242274 
--5.68133 0.0255745 
--5.08329 0.0271509 
--4.48526 0.0283394 
--3.88722 0.0289934 
--3.28919 0.029554 
--2.69115 0.0296125 
--2.09312 0.0289169 
--1.49509 0.0276191 
--0.897051 0.0258664 
--0.299017 0.0237319 
-0.299017 0.0213045 
-0.897051 0.0187224 
-1.49509 0.0161551 
-2.09312 0.01374 
-2.69115 0.0114714 
-3.28919 0.00924906 
-3.88722 0.00728921 
-4.48526 0.0059464 
-5.08329 0.00470002 
-5.68133 0.00351195 
-6.27936 0.00292738 
-6.87739 0.00208734 
-7.47543 0.00177293 
-8.07346 0.00122424 
-8.6715 0.00110015 
-9.26953 0.000699635 
-9.86757 0.000686743 
-10.4656 0.000448009 
-11.0636 0.000356996 
-11.6617 0.000365308 
-12.2597 0.00018185 
-12.8577 0.000193699 
-13.4558 0.000210711 
-14.0538 8.58855E-05 
-14.6518 8.27972E-05 
-15.2499 0.000139196 
-15.8479 7.69024E-05 
-16.4459 1.7816E-05 
-17.044 6.20518E-05 
-17.642 9.1317E-05 
-18.24 3.97955E-05 
-18.8381 1.99564E-06 
-19.4361 3.45021E-05 
-20.0341 6.92721E-05 
-20.6322 4.72006E-05 
-21.2302 6.68519E-06 
-21.8283 7.79961E-06 
-22.4263 4.27374E-05 
-23.0243 5.91408E-05 
-23.6224 3.74411E-05 
-24.2204 9.94114E-06 
-24.8184 1.16646E-05 
-25.4165 3.77952E-05 
-26.0145 5.5922E-05 
-26.6125 4.72367E-05 
-27.2106 2.50771E-05 
-27.8086 1.55973E-05 
-28.4066 2.84369E-05 
-29.0047 4.9308E-05 
-29.6027 5.76962E-05 
-30.2007 4.77425E-05 
-30.7988 3.18155E-05 
-31.3968 2.64972E-05 
-31.9948 3.68315E-05 
-32.5929 5.32613E-05 
-33.1909 6.18801E-05 
-33.7889 5.70117E-05 
-34.387 4.50643E-05 
-34.985 3.77533E-05 
-35.583 4.18351E-05 
-36.1811 5.41695E-05 
-36.7791 6.53049E-05 
-37.3771 6.76025E-05 
-37.9752 6.09905E-05 
-38.5732 5.22499E-05 
-39.1712 4.91927E-05 
-39.7693 5.4712E-05 
-40.3673 6.51092E-05 
-40.9653 7.3413E-05 
-41.5634 7.47193E-05 
-42.1614 6.95156E-05 
-42.7594 6.28625E-05 
-43.3575 6.04526E-05 
-43.9555 6.46043E-05 
-44.5536 7.29455E-05 
diff --git a/pyTTE/examples/reference_curves/LiF220_8keV_20micron_unbent_pi_asymm_10.dat b/pyTTE/examples/reference_curves/LiF220_8keV_20micron_unbent_pi_asymm_10.dat
deleted file mode 100755
index f233045..0000000
--- a/pyTTE/examples/reference_curves/LiF220_8keV_20micron_unbent_pi_asymm_10.dat
+++ /dev/null
@@ -1,150 +0,0 @@
--2.33778 0.00865027 
--2.26768 0.00897834 
--2.19759 0.00753327 
--2.12749 0.00484917 
--2.05739 0.00200489 
--1.98729 0.00022855 
--1.9172 0.000392162 
--1.8471 0.00260846 
--1.777 0.00613612 
--1.7069 0.00965728 
--1.63681 0.0118011 
--1.56671 0.0116874 
--1.49661 0.00929167 
--1.42651 0.00551389 
--1.35641 0.00190474 
--1.28632 8.91501E-05 
--1.21622 0.0010705 
--1.14612 0.00473119 
--1.07602 0.00981127 
--1.00593 0.0143997 
--0.935829 0.0166971 
--0.865732 0.0157249 
--0.795634 0.0117469 
--0.725537 0.00628348 
--0.655439 0.00165406 
--0.585341 9.28164E-05 
--0.515244 0.00272894 
--0.445146 0.00895116 
--0.375049 0.0165669 
--0.304951 0.0226913 
--0.234854 0.0248953 
--0.164756 0.0221471 
--0.0946584 0.0153072 
--0.0245608 0.0070593 
-0.0455368 0.00112543 
-0.115634 0.000770844 
-0.185732 0.00713871 
-0.25583 0.0184312 
-0.325927 0.030573 
-0.396025 0.0389329 
-0.466122 0.0401161 
-0.53622 0.0332266 
-0.606317 0.0205173 
-0.676415 0.00726714 
-0.746513 0.000301805 
-0.81661 0.0048838 
-0.886708 0.0213958 
-0.956805 0.0444954 
-1.0269 0.0656101 
-1.097 0.0766467 
-1.1671 0.0727055 
-1.2372 0.0537703 
-1.30729 0.0263204 
-1.37739 0.00409223 
-1.44749 0.00405858 
-1.51759 0.0353173 
-1.58768 0.089761 
-1.65778 0.146571 
-1.72788 0.184607 
-1.79798 0.18878 
-1.86807 0.150245 
-1.93817 0.0727786 
-2.00827 0.00426714 
-2.07837 0.0636599 
-2.14846 0.290846 
-2.21856 0.535603 
-2.28866 0.70112 
-2.35876 0.796884 
-2.42885 0.851138 
-2.49895 0.882516 
-2.56905 0.901053 
-2.63915 0.911996 
-2.70925 0.918122 
-2.77934 0.92091 
-2.84944 0.921115 
-2.91954 0.919033 
-2.98964 0.914605 
-3.05973 0.907421 
-3.12983 0.896601 
-3.19993 0.880531 
-3.27003 0.856318 
-3.34012 0.818715 
-3.41022 0.758142 
-3.48032 0.657841 
-3.55042 0.494738 
-3.62051 0.266255 
-3.69061 0.060465 
-3.76071 0.00614148 
-3.83081 0.0701761 
-3.9009 0.144415 
-3.971 0.181757 
-4.0411 0.177742 
-4.1112 0.141042 
-4.18129 0.0864423 
-4.25139 0.034222 
-4.32149 0.00418873 
-4.39159 0.0042037 
-4.46168 0.0257456 
-4.53178 0.0524734 
-4.60188 0.0709545 
-4.67198 0.0748013 
-4.74208 0.0640314 
-4.81217 0.0434511 
-4.88227 0.0209472 
-4.95237 0.00484935 
-5.02247 0.00037086 
-5.09256 0.00718078 
-5.16266 0.0201676 
-5.23276 0.0326427 
-5.30286 0.0394091 
-5.37295 0.0382477 
-5.44305 0.0300429 
-5.51315 0.0181296 
-5.58325 0.00704705 
-5.65334 0.000791466 
-5.72344 0.00113679 
-5.79354 0.00697413 
-5.86364 0.0150981 
-5.93373 0.02184 
-6.00383 0.0245502 
-6.07393 0.0223794 
-6.14403 0.0163462 
-6.21412 0.00884306 
-6.28422 0.00270999 
-6.35432 0.000108364 
-6.42442 0.00164628 
-6.49451 0.00621569 
-6.56461 0.0116127 
-6.63471 0.0155446 
-6.70481 0.016507 
-6.77491 0.0142389 
-6.845 0.0097073 
-6.9151 0.00468852 
-6.9852 0.00106972 
-7.0553 9.72235E-05 
-7.12539 0.00189073 
-7.19549 0.00546083 
-7.26559 0.0092003 
-7.33569 0.0115733 
-7.40578 0.0116878 
-7.47588 0.00956771 
-7.54598 0.00608367 
-7.61608 0.00259158 
-7.68617 0.000395688 
-7.75627 0.000231323 
-7.82637 0.00198919 
-7.89647 0.00480707 
-7.96656 0.00746807 
-8.03666 0.00890215 
-8.10676 0.00857907 
diff --git a/pyTTE/legacy.py b/pyTTE/legacy.py
new file mode 100755
index 0000000..7f8458a
--- /dev/null
+++ b/pyTTE/legacy.py
@@ -0,0 +1,293 @@
+from __future__ import division, print_function
+import sys
+
+import numpy as np
+
+from scipy.integrate import ode
+from scipy.constants.codata import physical_constants
+
+import xraylib
+
+def takagitaupin(scantype,scan,constant,polarization,crystal_str,hkl,asymmetry,thickness,displacement_jacobian = None,debyeWaller=1.0,min_int_step=1e-10):
+    '''
+    1D TT-solver function. Deprecated
+    
+    Input:
+    scantype = 'energy' or 'angle'
+    scan =  relative to the Bragg's energy in meV (energy scan) OR relative to the Bragg's angle in arcsec (angle scan). 
+            scan is an numpy array containing these values OR an integer N generating automatic scan with N points. 
+    constant = incidence angle respect to the diffracting planes in degrees (energy scan) OR photon energy in keV (angle scan) 
+    polarization = 'sigma' or 'pi'
+    crystal_str = supports crystals included in xraylib, e.g. 'Si', 'Ge', 'LiF'
+    hkl = [h,k,l] (Miller indices)
+    asymmetry = asymmetry angle (in deg, positive to clockwise direction)
+    thickness = crystal thickness in microns
+    displacement_jacobian = a function giving the jacobian of the displacement field as function of position (x,y). 
+                            Note: y points upwards the crystal 
+    debyeWaller = Debye-Waller factor
+    min_int_step = minumum integration step
+    '''
+
+    if scantype == 'energy':
+        is_escan = True
+        scantype = 'energy'
+    elif scantype == 'angle':
+        is_escan = False
+        scantype = 'angle'
+
+
+    if scantype == 'energy':
+        print('Computing elastic line for ' + str(hkl) + ' reflection of ' \
+              + crystal_str + ' crystal in energy domain.' )
+        is_escan = True
+    elif scantype == 'angle':
+        print('Computing elastic line for ' + str(hkl) + ' reflection of ' \
+              + crystal_str + ' crystal in angle domain.' )
+        is_escan = False
+
+    #type conversions
+    if type(scan) is int:
+        print('AUTOMATIC LIMITS NOT IMPLEMENTED YET!')
+        print('Function terminated.')
+        return None
+
+    scan=np.array(scan)
+    
+    #Unit conversions
+    thickness = thickness*1e-6 #wafer thickness in meters
+
+    #constants
+    crystal = xraylib.Crystal_GetCrystal(crystal_str)
+
+    hc = physical_constants['Planck constant in eV s'][0]*physical_constants['speed of light in vacuum'][0]*1e3 #in meV*m
+    d = xraylib.Crystal_dSpacing(crystal,*hkl)*1e-10 #in m
+    V = crystal['volume']*1e-30 # volume of unit cell in m^3
+    r_e = physical_constants['classical electron radius'][0]
+    h = 2*np.pi/d
+
+    print('')
+    print('Crystal     : ', crystal_str)
+    print('Reflection  : ', hkl)
+    print('d_hkl       : ', d, ' m')
+    print('Cell volume : ', V, ' m^3')
+    print('')
+
+
+    #asymmetry angle
+    phi=np.radians(asymmetry)
+
+    #Setup scan variables and constants
+    if is_escan:
+        escan=scan
+
+        th0=np.radians(constant)
+        th=th0
+
+        #Conversion of incident photon energy to wavelength
+        E0 = hc/(2*d*np.sin(th)) #in meV
+
+        wavelength = hc/(E0+escan) #in m
+        k = 2*np.pi/wavelength #in 1/m
+
+    else:
+        E0 = constant*1e6 #in meV
+
+        wavelength = hc/E0 #in m
+        k = 2*np.pi/wavelength #in 1/m
+
+        if not hc/(2*d*E0) > 1:
+            th0 = np.arcsin(hc/(2*d*E0))
+        else:
+            print('Given energy below the backscattering energy!')
+            print('Setting theta to 90 deg.')
+            th0 = np.pi/2
+
+        ascan = scan*np.pi/648000 #from arcsec to rad
+        th = th0+ascan
+
+    #Incidence and exit angles
+    alpha0 = th+phi
+    alphah = th-phi
+    
+    #Direction parameters
+    gamma0 = np.ones(scan.shape)/np.sin(alpha0)
+    gammah = np.ones(scan.shape)/np.sin(alphah)
+
+    if np.mean(gammah) < 0:
+        print('The direction of diffraction in to the crystal -> Laue case')
+        geometry = 'laue'
+    else:
+        print('The direction of diffraction out of the crystal -> Bragg case')
+        geometry = 'bragg'
+
+    #Polarization
+    if polarization == 'sigma':
+        C = 1;
+        print('Solving for sigma-polarization')
+    else:
+        C = np.cos(2*th);
+        print('Solving for pi-polarization')
+
+    print('Asymmetry angle : ', phi,' rad, ', np.degrees(phi), ' deg')
+    print('Wavelength      : ', hc/E0*1e10, ' Angstrom ')
+    print('Energy          : ', E0*1e-6, ' keV ')
+    
+    print('Bragg angle     : ', th0,' rad, ', np.degrees(th0), ' deg')
+    print('Incidence angle : ', th0+phi,' rad ', np.degrees(th0+phi), ' deg')
+    print('Exit angle      : ', th0-phi,' rad ', np.degrees(th0-phi), ' deg')
+    print('')
+
+    #Compute susceptibilities
+    if is_escan:
+        F0 = np.zeros(escan.shape,dtype=np.complex)
+        Fh = np.zeros(escan.shape,dtype=np.complex)
+        Fb = np.zeros(escan.shape,dtype=np.complex)
+
+        for ii in range(escan.size):    
+            F0[ii] = xraylib.Crystal_F_H_StructureFactor(crystal, (E0+escan[ii])*1e-6, 0, 0, 0, 1.0, 1.0)
+            Fh[ii] = xraylib.Crystal_F_H_StructureFactor(crystal, (E0+escan[ii])*1e-6, hkl[0], hkl[1], hkl[2], debyeWaller, 1.0)
+            Fb[ii] = xraylib.Crystal_F_H_StructureFactor(crystal, (E0+escan[ii])*1e-6, -hkl[0], -hkl[1], -hkl[2], debyeWaller, 1.0)
+    else:
+        F0 = xraylib.Crystal_F_H_StructureFactor(crystal, E0*1e-6, 0, 0, 0, 1.0, 1.0)
+        Fh = xraylib.Crystal_F_H_StructureFactor(crystal, E0*1e-6, hkl[0], hkl[1], hkl[2], debyeWaller, 1.0)
+        Fb = xraylib.Crystal_F_H_StructureFactor(crystal, E0*1e-6, -hkl[0], -hkl[1], -hkl[2], debyeWaller, 1.0)
+
+    cte = - r_e * wavelength*wavelength/(np.pi * V)
+    chi0 = np.conj(cte*F0)
+    chih = np.conj(cte*Fh)
+    chib = np.conj(cte*Fb)
+
+    print('F0   : ',np.mean(F0))
+    print('Fh   : ',np.mean(Fh))
+    print('Fb   : ',np.mean(Fb))
+    print('')
+    print('chi0 : ',np.mean(chi0))
+    print('chih : ',np.mean(chih))
+    print('chib : ',np.mean(chib))
+    print('')
+    print('(Mean F and chi values for energy scan)')
+    print('')
+
+    ######################
+    #COEFFICIENTS FOR TTE#
+    ######################
+
+    #For solving ksi = Dh/D0 
+    c0 = k*chi0/2*(gamma0+gammah)*np.ones(scan.shape)
+    ch = k*C*chih*gammah/2*np.ones(scan.shape)
+    cb = k*C*chib*gamma0/2*np.ones(scan.shape)
+
+    #For solving Y = D0 
+    g0 = k*chi0/2*gamma0*np.ones(scan.shape)
+    gb = k*C*chib/2*gamma0*np.ones(scan.shape)
+
+    #deviation from the kinematical Bragg condition for unstrained crystal
+    beta = h*gammah*(np.sin(th)-wavelength/(2*d))
+
+    #For deformation, the strain term function defined later stepwise 
+    if displacement_jacobian == None:
+        def strain_term(z): 
+            return 0
+
+    #INTEGRATION
+
+    #Define ODEs and their Jacobians
+    if geometry == 'bragg':
+        print('Transmission in the Bragg case not implemented!')
+        reflectivity = np.zeros(scan.shape)
+        transmission = -np.ones(scan.shape)
+    else:
+        forward_diffraction = np.zeros(scan.shape)
+        diffraction = np.zeros(scan.shape)
+
+    #Solve the equation
+    sys.stdout.write('Solving...0%')
+    sys.stdout.flush()
+    
+    for step in range(len(scan)):
+        #local variables for speedup
+        c0_step   = c0[step]
+        cb_step   = cb[step]
+        ch_step   = ch[step]
+        beta_step = beta[step]
+        g0_step   = g0[step]
+        gb_step   = gb[step]
+        gammah_step = gammah[step]
+
+        #Define deformation term for bent crystal
+        if not displacement_jacobian == None:
+            #Precomputed sines and cosines
+            sin_phi = np.sin(phi)
+            cos_phi = np.cos(phi)
+
+            if is_escan:
+                cot_alpha0 = np.cos(alpha0)/np.sin(alpha0)
+                sin_alphah = np.sin(alphah)
+                cos_alphah = np.cos(alphah)
+
+                def strain_term(z):
+                    x = -z*cot_alpha0
+                    u_jac = displacement_jacobian(x,z)
+                    duh_dsh = h*(sin_phi*cos_alphah*u_jac[0][0] 
+                                +sin_phi*sin_alphah*u_jac[0][1]
+                                +cos_phi*cos_alphah*u_jac[1][0]
+                                +cos_phi*sin_alphah*u_jac[1][1]
+                                )
+                    return gammah_step*duh_dsh
+            else:
+                cot_alpha0 = np.cos(alpha0[step])/np.sin(alpha0[step])
+                sin_alphah = np.sin(alphah[step])
+                cos_alphah = np.cos(alphah[step])
+
+                def strain_term(z):
+                    x = -z*cot_alpha0
+                    u_jac = displacement_jacobian(x,z)
+                    duh_dsh = h*(sin_phi*cos_alphah*u_jac[0][0]
+                                +sin_phi*sin_alphah*u_jac[0][1]
+                                +cos_phi*cos_alphah*u_jac[1][0] 
+                                +cos_phi*sin_alphah*u_jac[1][1]
+                                )
+                    return gammah_step*duh_dsh
+        
+        if geometry == 'bragg':
+            def ksiprime(z,ksi):
+                return 1j*(cb_step*ksi*ksi+(c0_step+beta_step+strain_term(z))*ksi+ch_step)
+
+            def ksiprime_jac(z,ksi):
+                return 2j*cb_step*ksi+1j*(c0_step+beta_step+strain_term(z))
+
+            r=ode(ksiprime,ksiprime_jac)
+        else:
+            def TTE(z,Y):
+                return [1j*(cb_step*Y[0]*Y[0]+(c0_step+beta_step+strain_term(z))*Y[0]+ch_step),\
+                        -1j*(g0_step+gb_step*Y[0])*Y[1]]
+
+            def TTE_jac(z,Y):
+                return [[2j*cb_step*Y[0]+1j*(c0_step+beta_step+strain_term(z)), 0],\
+                        [-1j*gb_step*Y[1],-1j*(g0_step+gb_step*Y[0])]]
+
+            r=ode(TTE,TTE_jac)
+
+        r.set_integrator('zvode',method='bdf',with_jacobian=True, min_step=min_int_step,max_step=1e-4,nsteps=50000)
+
+        if geometry == 'bragg':
+            r.set_initial_value(0,-thickness)
+            res=r.integrate(0)     
+            reflectivity[step]=np.abs(res[0])**2*gamma0[step]/gammah[step] #gamma-part takes into account beam footprints 
+        else:
+            r.set_initial_value([0,1],0)
+            res=r.integrate(-thickness)
+            diffraction[step] = np.abs(res[0]*res[1])**2
+            forward_diffraction[step] = np.abs(res[1])**2
+
+        sys.stdout.write('\rSolving...%0.1f%%' % (100*(step+1)/len(scan),))  
+        sys.stdout.flush()
+
+    sys.stdout.write('\r\nDone.\n')
+    sys.stdout.flush()
+
+    if geometry == 'bragg':    
+        return reflectivity, transmission
+    else:    
+        return diffraction, forward_diffraction
+
diff --git a/pyTTE/pyTTE.py b/pyTTE/pyTTE.py
index 50d6994..ed92d20 100755
--- a/pyTTE/pyTTE.py
+++ b/pyTTE/pyTTE.py
@@ -1,244 +1,550 @@
+# -*- coding: utf-8 -*-
 from __future__ import division, print_function
+from scipy.integrate import ode
+from .ttcrystal import TTcrystal
+from .quantity import Quantity
+from .ttscan import TTscan
+import matplotlib.pyplot as plt
+import multiprocess
+import numpy as np
+import xraylib
 import sys
-import os
 
-import numpy as np
+class TakagiTaupin:
 
-from scipy.integrate import ode
-from scipy.constants.codata import physical_constants
+    '''
+    The main class of the pyTTE package to calculate the 1D Takagi-Taupin curves
+    of bent crystals.
 
-import xraylib
+    Parameters
+    ----------
+        TTcrystal_object : TTcrystal or str
+            An existing TTcrystal instance for crystal parameters or a path to 
+            a file where they are defined. For any other types the crystal 
+            parameters are not set.
 
-def takagitaupin(scantype,scan,constant,polarization,crystal_str,hkl,asymmetry,thickness,displacement_jacobian = None,debyeWaller=1.0,min_int_step=1e-10):
-    '''
-    1D TT-solver.
-    
-    Input:
-    scantype = 'energy' or 'angle'
-    scan =  relative to the Bragg's energy in meV (energy scan) OR relative to the Bragg's angle in arcsec (angle scan). 
-            scan is an numpy array containing these values OR an integer N generating automatic scan with N points. 
-    constant = incidence angle respect to the diffracting planes in degrees (energy scan) OR photon energy in keV (angle scan) 
-    polarization = 'sigma' or 'pi'
-    crystal_str = supports crystals included in xraylib, e.g. 'Si', 'Ge', 'LiF'
-    hkl = [h,k,l] (Miller indices)
-    asymmetry = asymmetry angle (in deg, positive to clockwise direction)
-    thickness = crystal thickness in microns
-    displacement_jacobian = a function giving the jacobian of the displacement field as function of position (x,y). 
-                            Note: y points upwards the crystal 
-    debyeWaller = Debye-Waller factor
-    min_int_step = minumum integration step
-    '''
+        TTscan_object : TTscan or str 
+            An existing TTscan instance for scan parameters or a path to a file 
+            where they are defined. For any other types the scan parameters are 
+            not set.
 
-    if scantype == 'energy':
-        is_escan = True
-        scantype = 'energy'
-    elif scantype == 'angle':
-        is_escan = False
-        scantype = 'angle'
-
-
-    if scantype == 'energy':
-        print('Computing elastic line for ' + str(hkl) + ' reflection of ' \
-              + crystal_str + ' crystal in energy domain.' )
-        is_escan = True
-    elif scantype == 'angle':
-        print('Computing elastic line for ' + str(hkl) + ' reflection of ' \
-              + crystal_str + ' crystal in angle domain.' )
-        is_escan = False
-
-    #type conversions
-    if type(scan) is int:
-        print('AUTOMATIC LIMITS NOT IMPLEMENTED YET!')
-        print('Function terminated.')
-        return None
-
-    scan=np.array(scan)
-    
-    #Unit conversions
-    thickness = thickness*1e-6 #wafer thickness in meters
+    Attributes
+    ----------
+        crystal_object : TTcrystal
+            Contains the crystal and deformation parameters
+
+        scan_object : TTscan
+            Contains the scan parameters and the solver settings
+
+        solution : dict
+            Stores the result of the TakagiTaupin.run(). Has the following keys:
+
+                scan : Quantity of type energy or angle  
+                    The scanned energy or angle points.
 
-    #constants
-    crystal = xraylib.Crystal_GetCrystal(crystal_str)
+                beta : Numpy array
+                    The scanned points given in terms of deviation from the
+                    kinematical Bragg condition i.e. 
+                        beta = h*(sin theta - lambda/2*d_h)
 
-    hc = physical_constants['Planck constant in eV s'][0]*physical_constants['speed of light in vacuum'][0]*1e3 #in meV*m
-    d = xraylib.Crystal_dSpacing(crystal,*hkl)*1e-10 #in m
-    V = crystal['volume']*1e-30 # volume of unit cell in m^3
-    r_e = physical_constants['classical electron radius'][0]
-    h = 2*np.pi/d
+                bragg_energy : Quantity of type energy
+                    Energy of incident photons at beta = 0
+                
+                bragg_angle : Quantity of type angle
+                    Angle between the incident beam and the diffraction planes
+                    at beta = 0
+                
+                geometry : str
+                    Either 'bragg' for reflection geometry or 'laue' for 
+                    transmission geometry
+                
+                reflectivity : Numpy array (present if geometry == 'bragg')
+                    The reflectivity of the crystal for each scan point.
 
-    print('')
-    print('Crystal     : ', crystal_str)
-    print('Reflection  : ', hkl)
-    print('d_hkl       : ', d, ' m')
-    print('Cell volume : ', V, ' m^3')
-    print('')
+                transmission : Numpy array (present if geometry == 'bragg')
+                    The transmission though the crystal for each scan point
 
+                diffraction : Numpy array (present if geometry == 'laue')
+                    The diffracted beam for each scan point
 
-    #asymmetry angle
-    phi=np.radians(asymmetry)
+                forward_diffraction : Numpy array (present if geometry == 'laue')
+                    The forward diffracted (transmitted beam) for each scan point.
 
-    #Setup scan variables and constants
-    if is_escan:
-        escan=scan
+                output_type : str
+                    'intensity' if output reflectivity/diffractivity/transmission 
+                    are given in terms of wave intensities or 'photon_flux' if 
+                    in terms of photon fluxes. 
 
-        th0=np.radians(constant)
-        th=th0
+                crystal_parameters : str
+                    String representation of self.crystal_object
 
-        #Conversion of incident photon energy to wavelength
-        E0 = hc/(2*d*np.sin(th)) #in meV
+                scan_parameters : str
+                    String representation of self.scan_object
+                    
+                solver_output_log : str
+                    Logged stdout output of self.run().
 
-        wavelength = hc/(E0+escan) #in m
-        k = 2*np.pi/wavelength #in 1/m
+    '''    
 
-    else:
-        E0 = constant*1e6 #in meV
 
-        wavelength = hc/E0 #in m
-        k = 2*np.pi/wavelength #in 1/m
+    ##############################
+    # Methods for initialization #
+    ##############################    
 
-        if not hc/(2*d*E0) > 1:
-            th0 = np.arcsin(hc/(2*d*E0))
+    def __init__(self, TTcrystal_object = None, TTscan_object = None):
+
+        self.crystal_object = None
+        self.scan_object    = None
+        self.solution       = None
+
+        self.set_crystal(TTcrystal_object)
+        self.set_scan(TTscan_object)
+
+
+    def set_crystal(self, TTcrystal_object):
+        '''
+        Sets the crystal parameters for the scan instance. Any existing solutions
+        are cleared.
+
+        Parameters
+        ----------
+        
+        TTcrystal_object : TTcrystal or str
+            An existing TTcrystal instance for crystal parameters or a path to 
+            a file where they are defined. For any other types the crystal 
+            parameters are not set and the solution is not cleared.
+        '''
+
+        if isinstance(TTcrystal_object, TTcrystal): 
+            self.crystal_object = TTcrystal_object
+            self.solution       = None
+        elif type(TTcrystal_object) == str:
+            try:
+                self.crystal_object = TTcrystal(TTcrystal_object)
+                self.solution       = None
+            except Exception as e:
+                print(e)
+                print('Error initializing TTcrystal from file! Crystal not set.')
+        else:
+            print('ERROR! Not an instance of TTcrystal or None! Crystal not set.')
+
+
+
+    def set_scan(self, TTscan_object):
+        '''
+        Sets the crystal parameters for the scan instance. Any existing solutions
+        are cleared.
+
+        Parameters
+        ----------
+        
+        TTscan_object : TTscan or str
+            An existing TTscan instance for scan parameters or a path to a file 
+            where they are defined. For any other types the scan parameters are 
+            not set and the solution is not cleared.
+        '''
+
+        if isinstance(TTscan_object, TTscan):
+            self.scan_object = TTscan_object
+            self.solution    = None
+        elif type(TTscan_object) == str:
+            try:
+                self.scan_object = TTscan(TTscan_object)
+                self.solution    = None
+            except Exception as e:
+                print(e)
+                print('Error initializing TTscan from file! Scan not set.')
         else:
-            print('Given energy below the backscattering energy!')
-            print('Setting theta to 90 deg.')
-            th0 = np.pi/2
+            print('ERROR! Not an instance of TTscan or None! Scan not set.')
+
+
+    ####################################
+    # Auxiliary methods for TT solving #
+    ####################################    
 
-        ascan = scan*np.pi/648000 #from arcsec to rad
-        th = th0+ascan
+    @staticmethod
+    def calculate_structure_factors(crystal, hkl, energy, debye_waller):
+        '''
+        Calculates the structure factors F_0 F_h and F_bar{h}.
+        
+        Parameters
+        ----------
+        
+        crystal : dict
+            Dictionary returned by xraylib's Crystal_GetCrystal()
+
+        hkl : list of ints
+            3 element list containing the Miller indeces of the reflection
+            
+        energy : Quantity instance of type energy.
+            Energy of photons. energy.values be a single number or an array
+
+        debye_waller : float
+            The Debye-Waller factor
+        '''
+
+        energy_in_keV = energy.in_units('keV')
+        
+        #preserve the original shape and reshape energy to 1d array
+        orig_shape = energy_in_keV.shape
+        energy_in_keV = energy_in_keV.reshape(-1)
+
+        F0 = np.zeros(energy_in_keV.shape, dtype=np.complex)
+        Fh = np.zeros(energy_in_keV.shape, dtype=np.complex)
+        Fb = np.zeros(energy_in_keV.shape, dtype=np.complex)        
+
+        for i in range(energy_in_keV.size):    
+            F0[i] = xraylib.Crystal_F_H_StructureFactor(crystal, energy_in_keV[i], 0, 0, 0, 1.0, 1.0)
+            Fh[i] = xraylib.Crystal_F_H_StructureFactor(crystal, energy_in_keV[i],  hkl[0],  hkl[1],  hkl[2], debye_waller, 1.0)
+            Fb[i] = xraylib.Crystal_F_H_StructureFactor(crystal, energy_in_keV[i], -hkl[0], -hkl[1], -hkl[2], debye_waller, 1.0)
+
+        return F0.reshape(orig_shape), Fh.reshape(orig_shape), Fb.reshape(orig_shape)
+
+
+    def run(self):
+        '''
+        Calculates the 1D Takagi-Taupin curve for given TTcrystal and TTscan
+        given to the instance. Stores the result and metadata in self.solution.
+
+        Returns
+        -------
+
+        #In the Bragg (reflection) geometry#
+
+        scan.value : 1D Numpy array
+                    
+        reflectivity : 1D Numpy array
+            
+        transmission : 1D Numpy array
+        
+        
+        #In the Laue (transmission) geometry#
+
+        scan.value : 1D Numpy array
+            
+        diffraction : 1D Numpy array
+        
+        forward_diffraction : 1D Numpy array
 
-    #Incidence and exit angles
-    alpha0 = th+phi
-    alphah = th-phi
+        '''
+        
+
+        #Check that the required scan parameters are in place
+        if self.crystal_object is None:
+            print('ERROR! No crystal data found, TTcrystal object needed.')
+            return
+        if self.scan_object is None:
+            print('ERROR! No scan data found, TTscan object needed.')
+            return
+
+        #define a function for logging the input
+        def print_and_log(printable, log_string):
+            '''
+            Prints the input in stdout and appends it to log_string.
     
-    #Direction parameters
-    gamma0 = np.ones(scan.shape)/np.sin(alpha0)
-    gammah = np.ones(scan.shape)/np.sin(alphah)
-
-    if np.mean(gammah) < 0:
-        print('The direction of diffraction in to the crystal -> Laue case')
-        geometry = 'laue'
-    else:
-        print('The direction of diffraction out of the crystal -> Bragg case')
-        geometry = 'bragg'
-
-    #Polarization
-    if polarization == 'sigma':
-        C = 1;
-        print('Solving for sigma-polarization')
-    else:
-        C = np.cos(2*th);
-        print('Solving for pi-polarization')
-
-    print('Asymmetry angle : ', phi,' rad, ', np.degrees(phi), ' deg')
-    print('Wavelength      : ', hc/E0*1e10, ' Angstrom ')
-    print('Energy          : ', E0*1e-6, ' keV ')
+            Parameters
+            ----------
+            printable
+                Object to be printed
+            log_string
+                String to append the stdout to.                
     
-    print('Bragg angle     : ', th0,' rad, ', np.degrees(th0), ' deg')
-    print('Incidence angle : ', th0+phi,' rad ', np.degrees(th0+phi), ' deg')
-    print('Exit angle      : ', th0-phi,' rad ', np.degrees(th0-phi), ' deg')
-    print('')
-
-    #Compute susceptibilities
-    if is_escan:
-        F0 = np.zeros(escan.shape,dtype=np.complex)
-        Fh = np.zeros(escan.shape,dtype=np.complex)
-        Fb = np.zeros(escan.shape,dtype=np.complex)
-
-        for ii in range(escan.size):    
-            F0[ii] = xraylib.Crystal_F_H_StructureFactor(crystal, (E0+escan[ii])*1e-6, 0, 0, 0, debyeWaller, 1.0)
-            Fh[ii] = xraylib.Crystal_F_H_StructureFactor(crystal, (E0+escan[ii])*1e-6, hkl[0], hkl[1], hkl[2], debyeWaller, 1.0)
-            Fb[ii] = xraylib.Crystal_F_H_StructureFactor(crystal, (E0+escan[ii])*1e-6, -hkl[0], -hkl[1], -hkl[2], debyeWaller, 1.0)
-    else:
-        F0 = xraylib.Crystal_F_H_StructureFactor(crystal, E0*1e-6, 0, 0, 0, debyeWaller, 1.0)
-        Fh = xraylib.Crystal_F_H_StructureFactor(crystal, E0*1e-6, hkl[0], hkl[1], hkl[2], debyeWaller, 1.0)
-        Fb = xraylib.Crystal_F_H_StructureFactor(crystal, E0*1e-6, -hkl[0], -hkl[1], -hkl[2], debyeWaller, 1.0)
-
-    cte = - r_e * wavelength*wavelength/(np.pi * V)
-    chi0 = np.conj(cte*F0)
-    chih = np.conj(cte*Fh)
-    chib = np.conj(cte*Fb)
-
-    print('F0   : ',np.mean(F0))
-    print('Fh   : ',np.mean(Fh))
-    print('Fb   : ',np.mean(Fb))
-    print('')
-    print('chi0 : ',np.mean(chi0))
-    print('chih : ',np.mean(chih))
-    print('chib : ',np.mean(chib))
-    print('')
-    print('(Mean F and chi values for energy scan)')
-    print('')
-
-    ######################
-    #COEFFICIENTS FOR TTE#
-    ######################
-
-    #For solving ksi = Dh/D0 
-    c0 = k*chi0/2*(gamma0+gammah)*np.ones(scan.shape)
-    ch = k*C*chih*gammah/2*np.ones(scan.shape)
-    cb = k*C*chib*gamma0/2*np.ones(scan.shape)
-
-    #For solving Y = D0 
-    g0 = k*chi0/2*gamma0*np.ones(scan.shape)
-    gb = k*C*chib/2*gamma0*np.ones(scan.shape)
-
-    #deviation from the kinematical Bragg condition for unstrained crystal
-    beta = h*gammah*(np.sin(th)-wavelength/(2*d))
-
-    #For deformation, the strain term function defined later stepwise 
-    if displacement_jacobian == None:
-        def strain_term(z): 
-            return 0
-
-    #INTEGRATION
-
-    #Define ODEs and their Jacobians
-    if geometry == 'bragg':
-        print('Transmission in the Bragg case not implemented!')
-        reflectivity = np.zeros(scan.shape)
-        transmission = -np.ones(scan.shape)
-    else:
-        forward_diffraction = np.zeros(scan.shape)
-        diffraction = np.zeros(scan.shape)
-
-    #Solve the equation
-    sys.stdout.write('Solving...0%')
-    sys.stdout.flush()
+            Returns
+            -------
+            new_log_string
+                String that was printed on the screen appended to log_string
     
-    for step in range(len(scan)):
-        #local variables for speedup
-        c0_step   = c0[step]
-        cb_step   = cb[step]
-        ch_step   = ch[step]
-        beta_step = beta[step]
-        g0_step   = g0[step]
-        gb_step   = gb[step]
-        gammah_step = gammah[step]
-
-        #Define deformation term for bent crystal
-        if not displacement_jacobian == None:
-            #Precomputed sines and cosines
-            sin_phi = np.sin(phi)
-            cos_phi = np.cos(phi)
-
-            if is_escan:
-                cot_alpha0 = np.cos(alpha0)/np.sin(alpha0)
-                sin_alphah = np.sin(alphah)
-                cos_alphah = np.cos(alphah)
+            '''
+            print_str = str(printable)
+            print(print_str)
+            return log_string + print_str + '\n'            
+
+        output_log = ''
+                
+        startmsg = '\nSolving the 1D Takagi-Taupin equation for '\
+                 + self.crystal_object.crystal_data['name']\
+                 + '(' + str(self.crystal_object.hkl[0]) + ','\
+                 + str(self.crystal_object.hkl[1]) + ','\
+                 + str(self.crystal_object.hkl[2]) + ')'\
+                 + ' reflection'
+
+        output_log = print_and_log(startmsg,output_log)
+        output_log = print_and_log('-' * len(startmsg) + '\n',output_log)
+        
+        ################################################
+        #Calculate the constants needed by TT-equations#
+        ################################################
+
+        #Introduction of shorthands
+        crystal   = self.crystal_object.crystal_data
+        hkl       = self.crystal_object.hkl
+        phi       = self.crystal_object.asymmetry
+        thickness = self.crystal_object.thickness
+
+        debye_waller          = self.crystal_object.debye_waller
+        displacement_jacobian = self.crystal_object.displacement_jacobian
+
+        scan_type     = self.scan_object.scantype
+        scan_constant = self.scan_object.constant
+        scan_points   = self.scan_object.scan
+        polarization  = self.scan_object.polarization
+
+        hc  = Quantity(1.23984193,'eV um')                         #Planck's constant * speed of light
+        d   = Quantity(xraylib.Crystal_dSpacing(crystal,*hkl),'A') #spacing of Bragg planes
+        V   = Quantity(crystal['volume'],'A^3')                    #volume of unit cell
+        r_e = Quantity(2.81794033e-15,'m')                         #classical electron radius
+        h   = 2*np.pi/d                                            #length of reciprocal lattice vector
+
+        #Energies and angles corresponding to the constant parameter and its counterpart given by Bragg's law
+        if scan_type == 'energy':
+            theta_bragg = scan_constant
+            energy_bragg = hc/(2*d*np.sin(theta_bragg.in_units('rad')))
+        else:
+            energy_bragg = scan_constant
+            if not (hc/(2*d*energy_bragg)).in_units('1') > 1:
+                theta_bragg = Quantity(np.arcsin((hc/(2*d*energy_bragg)).in_units('1')), 'rad')
+            else:
+                output_log = print_and_log('Given energy below the backscattering energy!',output_log)
+                output_log = print_and_log('Setting theta to 90 deg.',output_log)
+                
+                theta_bragg = Quantity(90, 'deg')
+
+
+        if scan_points[0] == 'automatic':
+            
+            ################################################
+            #Estimate the optimal scan limits automatically#
+            ################################################
+            
+            F0, Fh, Fb = TakagiTaupin.calculate_structure_factors(crystal, 
+                                                                  hkl, 
+                                                                  energy_bragg, 
+                                                                  debye_waller)
+
+            #conversion factor from crystal structure factor to susceptibility
+            cte = -(r_e * (hc/energy_bragg)**2/(np.pi * V)).in_units('1') 
+
+            chi0 = np.conj(cte*F0)
+            chih = np.conj(cte*Fh)
+            chib = np.conj(cte*Fb)
+
+            gamma0 = 1/np.sin((theta_bragg+phi).in_units('rad'))
+            gammah = 1/np.sin((theta_bragg-phi).in_units('rad'))
+
+            #Find the (rough) maximum and minimum of the deformation term
+            if displacement_jacobian is not None:
+                z = np.linspace(0,-thickness.in_units('um'),1000)
+                x = -z*np.cos((theta_bragg+phi).in_units('rad'))/np.sin((theta_bragg+phi).in_units('rad'))
+
+                sin_phi = np.sin(phi.in_units('rad'))
+                cos_phi = np.cos(phi.in_units('rad'))
+                sin_alphah = np.sin((theta_bragg-phi).in_units('rad'))
+                cos_alphah = np.cos((theta_bragg-phi).in_units('rad'))
+
+                u_jac = displacement_jacobian(x[0],z[0])
+                h_um = h.in_units('um^-1')
+
+                def_min = h_um*(  sin_phi*cos_alphah*u_jac[0][0]
+                                + sin_phi*sin_alphah*u_jac[0][1]
+                                + cos_phi*cos_alphah*u_jac[1][0] 
+                                + cos_phi*sin_alphah*u_jac[1][1])            
+                def_max = def_min
+
+                for i in range(1,z.size):
+                    u_jac = displacement_jacobian(x[i],z[i])
+
+                    deform = h_um*(  sin_phi*cos_alphah*u_jac[0][0]
+                                   + sin_phi*sin_alphah*u_jac[0][1]
+                                   + cos_phi*cos_alphah*u_jac[1][0] 
+                                   + cos_phi*sin_alphah*u_jac[1][1])            
+                    if deform < def_min:
+                        def_min = deform
+                    if deform > def_max:
+                        def_max = deform
+            else:
+                def_min = 0.0
+                def_max = 0.0
 
-                def strain_term(z):
-                    x = -z*cot_alpha0
-                    u_jac = displacement_jacobian(x,z)
-                    duh_dsh = h*(sin_phi*cos_alphah*u_jac[0][0] 
-                                +sin_phi*sin_alphah*u_jac[0][1]
-                                +cos_phi*cos_alphah*u_jac[1][0]
-                                +cos_phi*sin_alphah*u_jac[1][1]
-                                )
-                    return gammah_step*duh_dsh
+            #expand the range by the backscatter Darwin width
+            if np.sin(2*theta_bragg.in_units('rad') > np.sqrt(2*np.sqrt(np.abs(chih*chib)))):
+                darwin_width_term = 2*np.sqrt(np.abs(chih*chib))/np.sin(2*theta_bragg.in_units('rad'))*h*np.cos(theta_bragg.in_units('rad'))
+            else:
+                darwin_width_term = np.sqrt(2*np.sqrt(np.abs(chih*chib)))*h*np.cos(theta_bragg.in_units('rad'))
+
+            k_bragg = 2*np.pi*energy_bragg/hc 
+            b_const_term = -0.5*k_bragg*(1 + gamma0/gammah)*np.real(chi0)
+
+            beta_min = b_const_term - Quantity(def_max,'um^-1') - 2*darwin_width_term
+            beta_max = b_const_term - Quantity(def_min,'um^-1') + 2*darwin_width_term
+
+            #convert beta limits to scan vectors
+            if scan_type == 'energy':
+                energy_min = beta_min*energy_bragg/(h*np.sin(theta_bragg.in_units('rad')))
+                energy_max = beta_max*energy_bragg/(h*np.sin(theta_bragg.in_units('rad')))
+
+                output_log = print_and_log('Using automatically determined scan limits:',output_log)
+                output_log = print_and_log('E min: ' + str(energy_min.in_units('meV')) + ' meV',output_log)                
+                output_log = print_and_log('E max: ' + str(energy_max.in_units('meV')) + ' meV\n',output_log)
+
+                scan = Quantity(np.linspace(energy_min.in_units('meV'),energy_max.in_units('meV'),scan_points[1]),'meV')
+                scan_steps = scan.value.size
+                scan_shape = scan.value.shape
             else:
-                cot_alpha0 = np.cos(alpha0[step])/np.sin(alpha0[step])
-                sin_alphah = np.sin(alphah[step])
-                cos_alphah = np.cos(alphah[step])
+                sin_th_min = np.sin(theta_bragg.in_units('rad'))+(beta_min/h).in_units('1')
+                sin_th_max = np.sin(theta_bragg.in_units('rad'))+(beta_max/h).in_units('1')
+
+                theta_min = Quantity(np.arcsin(sin_th_min),'rad')-theta_bragg
+
+                #This avoids taking arcsin of values over 1
+                if sin_th_max > 1:
+                    #Mirror the theta range w.t.r. 90 deg
+                    theta_max = Quantity(np.pi-np.arcsin(sin_th_min),'rad')-theta_bragg
+                else:
+                    theta_max = Quantity(np.arcsin(sin_th_max),'rad')-theta_bragg
+
+                output_log = print_and_log('Using automatically determined scan limits:',output_log)
+                output_log = print_and_log('Theta min: ' + str(theta_min.in_units('urad')) + ' urad',output_log)                
+                output_log = print_and_log('Theta max: ' + str(theta_max.in_units('urad')) + ' urad\n',output_log)
+
+                scan = Quantity(np.linspace(theta_min.in_units('urad'),theta_max.in_units('urad'),scan_points[1]),'urad')
+                scan_steps = scan.value.size
+                scan_shape = scan.value.shape
+        else:            
+            #Use the scan limits given by the user            
+            scan = scan_points[1]
+            scan_steps = scan.value.size
+            scan_shape = scan.value.shape
+
+        #Convert relative scans to absolute energies or incidence angles
+        if scan_type == 'energy':
+            theta  = theta_bragg
+            energy  = energy_bragg + scan
+        else:
+            energy = energy_bragg
+            theta = theta_bragg + scan
+
+        #Wavelength and wavenumber
+        wavelength = hc/energy
+        k = 2*np.pi/wavelength
+
+        #Incidence and exit angles
+        alpha0 = theta+phi
+        alphah = theta-phi
+        
+        #Direction parameters
+        gamma0 = np.ones(scan_shape)/np.sin(alpha0.in_units('rad'))
+        gammah = np.ones(scan_shape)/np.sin(alphah.in_units('rad'))
+
+        if np.mean(gammah) < 0:
+            output_log = print_and_log('The direction of diffraction in to the crystal -> Laue case',output_log)
+            geometry = 'laue'
+        else:
+            output_log = print_and_log('The direction of diffraction out of the crystal -> Bragg case',output_log)
+            geometry = 'bragg'
+
+        #Polarization factor
+        if polarization == 'sigma':
+            C = 1
+            output_log = print_and_log('Solving for sigma-polarization',output_log)
+        else:
+            C = np.cos(2*theta.in_units('rad'))
+            output_log = print_and_log('Solving for pi-polarization',output_log)
+
+        output_log = print_and_log('Asymmetry angle : ' + str(phi.in_units('deg')) + ' deg',output_log)
+        output_log = print_and_log('Wavelength      : ' + str((hc/energy_bragg).in_units('nm')) + ' nm',output_log)
+        output_log = print_and_log('Energy          : ' + str(energy_bragg.in_units('keV')) + ' keV',output_log)
+        output_log = print_and_log('Bragg angle     : ' + str(theta_bragg.in_units('deg')) + ' deg',output_log)
+        output_log = print_and_log('Incidence angle : ' + str((theta_bragg+phi).in_units('deg')) + ' deg',output_log)
+        output_log = print_and_log('Exit angle      : ' + str((theta_bragg-phi).in_units('deg')) + ' deg\n',output_log)    
+
+        #Compute susceptibilities       
+        F0, Fh, Fb = TakagiTaupin.calculate_structure_factors(crystal, 
+                                                              hkl, 
+                                                              energy, 
+                                                              debye_waller)
+
+        #conversion factor from crystal structure factor to susceptibility
+        cte = -(r_e * (hc/energy_bragg)**2/(np.pi * V)).in_units('1') 
+
+        chi0 = np.conj(cte*F0)
+        chih = np.conj(cte*Fh)
+        chib = np.conj(cte*Fb)
+        
+        output_log = print_and_log('Structure factors',output_log) 
+        output_log = print_and_log('F0   : '+ str(np.mean(F0)),output_log)         
+        output_log = print_and_log('Fh   : '+ str(np.mean(Fh)),output_log)         
+        output_log = print_and_log('Fb   : '+ str(np.mean(Fb))+'\n',output_log)         
+        output_log = print_and_log('Susceptibilities',output_log) 
+        output_log = print_and_log('chi0 : '+ str(np.mean(chi0)),output_log)         
+        output_log = print_and_log('chih : '+ str(np.mean(chih)),output_log)         
+        output_log = print_and_log('chib : '+ str(np.mean(chib))+'\n',output_log)         
+        output_log = print_and_log('(Mean F and chi values for energy scan)\n',output_log)                 
+
+        ######################
+        #COEFFICIENTS FOR TTE#
+        ######################
+
+        #For solving ksi = Dh/D0 
+        c0 = 0.5*k*chi0*(gamma0+gammah)*np.ones(scan_shape)
+        ch = 0.5*k*C*chih*gammah*np.ones(scan_shape)
+        cb = 0.5*k*C*chib*gamma0*np.ones(scan_shape)
+
+        #For solving Y = D0 
+        g0 = 0.5*k*chi0*gamma0*np.ones(scan_shape)
+        gb = 0.5*k*C*chib*gamma0*np.ones(scan_shape)
+
+        #Deviation from the kinematical Bragg condition for unstrained crystal
+        #To avoid catastrophic cancellation, the terms in the subtraction are
+        #explicitly casted to 64 bit floats.
+        beta_term1 = np.sin(theta.in_units('rad')).astype(np.float64)
+        beta_term2 = wavelength.in_units('nm').astype(np.float64)
+        beta_term3 = (2*d.in_units('nm')).astype(np.float64)
+        
+        beta = h*gammah*(beta_term1 - beta_term2/beta_term3).astype(np.float)
+
+        #############
+        #INTEGRATION#
+        #############
+
+        #Define ODEs and their Jacobians
+        if geometry == 'bragg':
+            output_log = print_and_log('Transmission in the Bragg case not implemented!',output_log) 
+            reflectivity = np.zeros(scan_shape)
+            transmission = -np.ones(scan_shape)
+        else:
+            forward_diffraction = np.zeros(scan_shape)
+            diffraction = np.zeros(scan_shape)
+
+        #Fix the length scale to microns for solving
+        c0   =   c0.in_units('um^-1'); ch = ch.in_units('um^-1'); cb = cb.in_units('um^-1')
+        g0   =   g0.in_units('um^-1'); gb = gb.in_units('um^-1')
+        beta = beta.in_units('um^-1'); h  =  h.in_units('um^-1')
+        thickness = thickness.in_units('um')
+
+        def integrate_single_scan_step(step):
+            #local variables for speedup
+            c0_step   = c0[step]
+            cb_step   = cb[step]
+            ch_step   = ch[step]
+            beta_step = beta[step]
+            g0_step   = g0[step]
+            gb_step   = gb[step]
+            gammah_step = gammah[step]
+
+            #Define deformation term for bent crystal
+            if displacement_jacobian is not None:
+                #Precomputed sines and cosines
+                sin_phi = np.sin(phi.in_units('rad'))
+                cos_phi = np.cos(phi.in_units('rad'))
+
+                if scan_type == 'energy':
+                    cot_alpha0 = np.cos(alpha0.in_units('rad'))/np.sin(alpha0.in_units('rad'))
+                    sin_alphah = np.sin(alphah.in_units('rad'))
+                    cos_alphah = np.cos(alphah.in_units('rad'))
+                else:
+                    cot_alpha0 = np.cos(alpha0.in_units('rad')[step])/np.sin(alpha0.in_units('rad')[step])
+                    sin_alphah = np.sin(alphah.in_units('rad')[step])
+                    cos_alphah = np.cos(alphah.in_units('rad')[step])
 
                 def strain_term(z):
                     x = -z*cot_alpha0
@@ -249,46 +555,233 @@ def strain_term(z):
                                 +cos_phi*sin_alphah*u_jac[1][1]
                                 )
                     return gammah_step*duh_dsh
+            else:
+                #Non-bent crystal 
+                def strain_term(z): 
+                    return 0
+            
+            if geometry == 'bragg':
+                def ksiprime(z,ksi):
+                    return 1j*(cb_step*ksi*ksi+(c0_step+beta_step+strain_term(z))*ksi+ch_step)
+
+                def ksiprime_jac(z,ksi):
+                    return 2j*cb_step*ksi+1j*(c0_step+beta_step+strain_term(z))
+
+                r=ode(ksiprime,ksiprime_jac)
+            else:
+                def TTE(z,Y):
+                    return [1j*(cb_step*Y[0]*Y[0]+(c0_step+beta_step+strain_term(z))*Y[0]+ch_step),\
+                            -1j*(g0_step+gb_step*Y[0])*Y[1]]
+
+                def TTE_jac(z,Y):
+                    return [[2j*cb_step*Y[0]+1j*(c0_step+beta_step+strain_term(z)), 0],\
+                            [-1j*gb_step*Y[1],-1j*(g0_step+gb_step*Y[0])]]
+
+                r=ode(TTE,TTE_jac)
+
+            r.set_integrator('zvode',method='bdf',with_jacobian=True, 
+                             min_step=self.scan_object.integration_step.in_units('um'),
+                             max_step=thickness,nsteps=50000)
         
-        if geometry == 'bragg':
-            def ksiprime(z,ksi):
-                return 1j*(cb_step*ksi*ksi+(c0_step+beta_step+strain_term(z))*ksi+ch_step)
+            #Update the solving process
+            lock.acquire()
+            steps_calculated.value = steps_calculated.value + 1
+            sys.stdout.write('\rSolving...%0.1f%%' % (100*(steps_calculated.value)/scan_steps,))  
+            sys.stdout.flush()
+            lock.release()            
+
+            if geometry == 'bragg':
+                if self.scan_object.start_depth is not None:
+                    start_depth = self.scan_object.start_depth.in_units('um')
+                    if start_depth > 0 or start_depth < -thickness:
+                        output_log = print_and_log('Warning! The given starting depth ' + str(start_depth)\
+                                                   + 'um is outside the crystal!', output_log) 
+                    r.set_initial_value(0,start_depth)
+                else:
+                    r.set_initial_value(0,-thickness)
+
+                res=r.integrate(0)
+                
+                if self.scan_object.output_type == 'photon_flux':
+                    reflectivity = np.abs(res[0])**2*gamma0[step]/gammah[step]
+                else:
+                    reflectivity = np.abs(res[0])**2
+
+                transmission = -1 #Not implemented yet
+                    
+                return reflectivity, transmission
+            else:
+                if self.scan_object.start_depth is not None:
+                    output_log = print_and_log('Warning! The alternative start depth is negleted in the Laue case.', output_log) 
+                r.set_initial_value([0,1],0)
+                res=r.integrate(-thickness)
+                if self.scan_object.output_type == 'photon_flux':
+                    diffraction = np.abs(res[0]*res[1])**2*gamma0[step]/np.abs(gammah[step])
+                else:                    
+                    diffraction = np.abs(res[0]*res[1])**2
+                    
+                forward_diffraction = np.abs(res[1])**2
+
+                return diffraction, forward_diffraction
+
+        n_cores = multiprocess.cpu_count()
+
+        output_log = print_and_log('\nCalculating the TT-curve using ' + str(n_cores) + ' cores.', output_log)     
+
+        #Solve the equation
+        sys.stdout.write('Solving...0%')
+        sys.stdout.flush()
+       
+        def mp_init(l,v):
+            global lock
+            global steps_calculated
+            lock = l
+            steps_calculated = v
+
+        pool = multiprocess.Pool(n_cores,initializer=mp_init, initargs=(multiprocess.Lock(), multiprocess.Value('i', 0)))
+        output = np.array(pool.map(integrate_single_scan_step,range(scan_steps)))
+        pool.close()
+        pool.join()
+
+        sys.stdout.write('\r\nDone.\n')
+        sys.stdout.flush()
+
+        if geometry == 'bragg':    
+            reflectivity = output[:,0]
+            transmission = output[:,1]
+
+            self.solution = {'scan' : scan,
+                             'beta' : beta,
+                             'bragg_energy' : energy_bragg,
+                             'bragg_angle'  : theta_bragg,                             
+                             'geometry' : 'bragg', 
+                             'reflectivity' : reflectivity, 
+                             'transmission': transmission,
+                             'output_type' : self.scan_object.output_type,
+                             'crystal_parameters' : str(self.crystal_object),
+                             'scan_parameters' : str(self.scan_object),
+                             'solver_output_log' : output_log
+                            }
+
+            return scan.value, reflectivity, transmission
+        else:    
+            diffraction = output[:,0]
+            forward_diffraction = output[:,1]      
+
+            self.solution = {'scan' : scan, 
+                             'beta' : beta,
+                             'bragg_energy' : energy_bragg,
+                             'bragg_angle'  : theta_bragg,
+                             'geometry' : 'laue', 
+                             'diffraction' : diffraction, 
+                             'forward_diffraction': forward_diffraction,
+                             'output_type' : self.scan_object.output_type,
+                             'crystal_parameters' : str(self.crystal_object),
+                             'scan_parameters' : str(self.scan_object),
+                             'solver_output_log' : output_log
+                            }
+
+            return scan.value, diffraction, forward_diffraction
+
+    def plot(self):
+        '''
+        Plots the calculated solution
+        '''
+
+        if self.solution is None:
+            print('No calculated Takagi-Taupin curves found! Call run() first!')
+            return
+
+        if self.solution['geometry'] == 'bragg':
+            plt.plot(self.solution['scan'].value, self.solution['reflectivity'])
+            if Quantity._type2str(self.solution['scan'].unit) == 'energy':
+                plt.xlabel('Energy (' + self.solution['scan'].units() + ')')
+            else:
+                plt.xlabel('Angle (' + self.solution['scan'].units() + ')')
 
-            def ksiprime_jac(z,ksi):
-                return 2j*cb_step*ksi+1j*(c0_step+beta_step+strain_term(z))
+            if self.solution['output_type'] == 'photon_flux':
+                plt.ylabel('Reflectivity in terms of photon flux')
+            else:
+                plt.ylabel('Reflectivity in terms of wave intensity')                
 
-            r=ode(ksiprime,ksiprime_jac)
+            plt.title('Takagi-Taupin solution in the Bragg case')
         else:
-            def TTE(z,Y):
-                return [1j*(cb_step*Y[0]*Y[0]+(c0_step+beta_step+strain_term(z))*Y[0]+ch_step),\
-                        -1j*(g0_step+gb_step*Y[0])*Y[1]]
+            plt.plot(self.solution['scan'].value, self.solution['forward_diffraction'],label = 'Forward-diffraction')
+            plt.plot(self.solution['scan'].value, self.solution['diffraction'],label = 'Diffraction')
 
-            def TTE_jac(z,Y):
-                return [[2j*cb_step*Y[0]+1j*(c0_step+beta_step+strain_term(z)), 0],\
-                        [-1j*gb_step*Y[1],-1j*(g0_step+gb_step*Y[0])]]
+            if Quantity._type2str(self.solution['scan'].unit) == 'energy':
+                plt.xlabel('Energy (' + self.solution['scan'].units() + ')')
+            else:
+                plt.xlabel('Angle (' + self.solution['scan'].units() + ')')
 
-            r=ode(TTE,TTE_jac)
+            if self.solution['output_type'] == 'photon_flux':
+                plt.ylabel('Photon flux w.r.t incident')
+            else:
+                plt.ylabel('Intensity w.r.t incident')         
 
-        r.set_integrator('zvode',method='bdf',with_jacobian=True, min_step=min_int_step,max_step=1e-4,nsteps=50000)
+            plt.legend()
+            plt.title('Takagi-Taupin solution in the Laue case')
+            
+        plt.show()
 
-        if geometry == 'bragg':
-            r.set_initial_value(0,-thickness)
-            res=r.integrate(0)     
-            reflectivity[step]=np.abs(res[0])**2*gamma0[step]/gammah[step] #gamma-part takes into account beam footprints 
+    def save(self, path, include_header = True):
+        '''
+        Saves the solution to a file.
+        
+        Parameters
+        ----------
+        
+        path : str
+            Path of the save file
+            
+        include_header : bool, optional
+            Determines if the metadata is included in the header. The default 
+            is True.
+
+        Returns
+        -------
+        
+        None.
+
+        '''
+
+        if self.solution is None:
+            print('No calculated Takagi-Taupin curves found! Call run() first!')
+            return
+
+
+        #Build the data matrix
+        data = []
+        data.append(self.solution['scan'].value.reshape(-1))
+        
+        if self.solution['geometry'] == 'bragg':
+            data.append(self.solution['reflectivity'].reshape(-1))
         else:
-            r.set_initial_value([0,1],0)
-            res=r.integrate(-thickness)
-            diffraction[step] = np.abs(res[0]*res[1])**2
-            forward_diffraction[step] = np.abs(res[1])**2
+            data.append(self.solution['diffraction'].reshape(-1))
+            data.append(self.solution['forward_diffraction'].reshape(-1))
 
-        sys.stdout.write('\rSolving...%0.1f%%' % (100*(step+1)/len(scan),))  
-        sys.stdout.flush()
+        data = np.array(data).T
+
+        if include_header:
+            header = str(self) + '\n' + 'SOLVER OUTPUT LOG\n'\
+                     + '-----------------\n' + self.solution['solver_output_log'] + '\n'
 
-    sys.stdout.write('\r\nDone.\n')
-    sys.stdout.flush()
+            header = header + 'SOLUTION\n' + '--------\n' 
+            header = header + 'Scan (' + self.solution['scan'].units() + ') '
+
+            if self.solution['geometry'] == 'bragg':
+                header =  header + 'Reflectivity'                
+            else:
+                header =  header + 'Diffraction Forward-diffraction'                
+        else:
+            header = ''
 
-    if geometry == 'bragg':    
-        return reflectivity, transmission
-    else:    
-        return diffraction, forward_diffraction
+        np.savetxt(path, data, header=header)
 
+    def __str__(self):
+        return   'CRYSTAL PARAMETERS\n'\
+               + '------------------\n\n'\
+               + str(self.crystal_object) + '\n\n'\
+               + 'SCAN PARAMETERS\n'\
+               + '---------------\n\n'\
+               + str(self.scan_object)
diff --git a/pyTTE/quantity.py b/pyTTE/quantity.py
new file mode 100755
index 0000000..74a620f
--- /dev/null
+++ b/pyTTE/quantity.py
@@ -0,0 +1,330 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import division, print_function
+import numpy as np
+
+UNITS = {'1'   : ('unitless', 1e0),
+        
+         'm'   : ('length', 1e0),
+         'cm'  : ('length', 1e-2),
+         'mm'  : ('length', 1e-3),
+         'µm'  : ('length', 1e-6),
+         'um'  : ('length', 1e-6),
+         'nm'  : ('length', 1e-9),
+         'Å'   : ('length', 1e-10),
+         'A'   : ('length', 1e-10),
+         'AA'  : ('length', 1e-10),
+
+         'J'   : ('energy', 1e0),
+         'MeV' : ('energy', 1.602176634e-13),
+         'keV' : ('energy', 1.602176634e-16),
+         'eV'  : ('energy', 1.602176634e-19),
+         'meV' : ('energy', 1.602176634e-22),
+         'µeV' : ('energy', 1.602176634e-25),
+         'ueV' : ('energy', 1.602176634e-25),
+         'neV' : ('energy', 1.602176634e-28),
+
+         'rad'     : ('angle', 1e0),
+         'mrad'    : ('angle', 1e-3),
+         'urad'    : ('angle', 1e-6),
+         'µrad'    : ('angle', 1e-6),
+         'nrad'    : ('angle', 1e-9),
+         'deg'     : ('angle', np.pi/180),
+         'arcmin'  : ('angle', np.pi/10800),
+         'arcsec'  : ('angle', np.pi/648000),
+
+         's'       : ('time', 1e0),
+         'sec'     : ('time', 1e0),
+         'ms'      : ('time', 1e-3),
+         'msec'    : ('time', 1e-3),
+         'us'      : ('time', 1e-6),
+         'usec'    : ('time', 1e-6),
+         'µs'      : ('time', 1e-6),
+         'µsec'    : ('time', 1e-6),
+         'ns'      : ('time', 1e-9),
+         'nsec'    : ('time', 1e-9),
+         'min'     : ('time', 60e0),
+         'h'       : ('time', 3600e0),
+
+         'Pa'      : ('pressure', 1e0),
+         'kPa'     : ('pressure', 1e3),
+         'MPa'     : ('pressure', 1e6),
+         'GPa'     : ('pressure', 1e9),
+}
+
+
+class Quantity:
+    '''
+    A class used to deal with various different physical units used in the diffraction calculations.
+    '''
+
+    #The available units in the class. The unit is given as a key to the dictionary whose values are
+    #tuples whose first field is the type of unit and the second one is the conversion factor to the
+    #base unit (often in SI)
+
+    def __init__(self,value,unit):
+        '''
+        Intitialize a Quantity instance.
+
+        Input:
+            value = numeric data (literal, list, numpy array)
+            unit  = string of the unit e.g. mm, deg, eV. Can also be a compound unit such as 'm s^-1'
+                    or 'eV s'. Note the proper formatting (e.g. m/s or eV*s are not valid).
+                    
+        '''
+
+        value = np.array(value)
+        try:
+            value + 1.0; value * 1.0    #Check if the input is of numeric type 
+            self.value = value
+        except:
+            raise ValueError('Value(s) of the quantity has to be numerical!') 
+
+        if type(unit) == type(''):
+            self.unit = Quantity._parse_units(unit)
+        else:
+            raise ValueError('Unit of the quantity has to be of str type.') 
+
+
+    ##########################
+    #Overload unary operators#
+    ##########################
+
+    def __pos__(self):
+        return Quantity(self.value, Quantity._unit2str(self.unit))
+
+    def __neg__(self):
+        return Quantity(-self.value, Quantity._unit2str(self.unit))
+
+    ###########################
+    #Overload binary operators#
+    ###########################
+
+    def __add__(self,other):        
+        return Quantity(self.value + other.in_units(Quantity._unit2str(self.unit)), Quantity._unit2str(self.unit))
+
+    def __sub__(self,other):        
+        return Quantity(self.value - other.in_units(Quantity._unit2str(self.unit)), Quantity._unit2str(self.unit))
+
+    def __mul__(self,other):        
+        if isinstance(other, Quantity):
+            return Quantity(self.value * other.value, Quantity._unit2str(self.unit) + ' ' + Quantity._unit2str(other.unit))
+        else:
+            #scalar multiplication
+            return Quantity(self.value * other, Quantity._unit2str(self.unit))
+
+    def __rmul__(self,other):        
+        return self * other
+
+    def __truediv__(self,other):
+        if isinstance(other, Quantity):
+            #invert the unit of denominator
+            denom_invunit = {}
+            for k in other.unit:
+                denom_invunit[k] = -other.unit[k]
+            
+            return Quantity(self.value / other.value, Quantity._unit2str(self.unit) + ' ' + Quantity._unit2str(denom_invunit))
+        else:
+            #scalar division
+            return Quantity(self.value / other, Quantity._unit2str(self.unit))
+
+    def __rtruediv__(self,other):
+        #invert the unit of denominator
+        denom_invunit = {}
+        for k in self.unit:
+            denom_invunit[k] = -self.unit[k]           
+
+        if isinstance(other, Quantity):
+            return Quantity(other.value / self.value, Quantity._unit2str(other.unit) + ' ' + Quantity._unit2str(denom_invunit))
+        else:
+            #scalar division by quantity
+            return Quantity(other / self.value, Quantity._unit2str(denom_invunit))
+
+    def __pow__(self,other):
+        if other < 0:
+            return 1/Quantity(self.value ** -other, (Quantity._unit2str(self.unit)+' ')*(-other))
+        else:
+            return Quantity(self.value ** other, (Quantity._unit2str(self.unit)+' ')*other)
+
+
+    def in_units(self,unit):
+        '''
+        Converts the quantity to given unit. If the conversion is not valid, will raise a ValueError.
+
+        Input:
+            unit = str of the unit to be converted to. '1' for unitless quantities.
+        Output:
+            value = converted value in the units required
+        '''
+
+        unit_parsed = Quantity._parse_units(unit)
+
+        unit_p_type = {}
+        unit_self_type = {}
+
+        #calculate the unit dimensions
+        for k in unit_parsed:
+            utype = UNITS[k][0]
+
+            #first encounter, add unit in the dictionary
+            if not utype in unit_p_type:
+                unit_p_type[utype] = unit_parsed[k]
+            else:
+                unit_p_type[utype] = unit_p_type[utype] + unit_parsed[k]
+
+        for k in self.unit:
+            utype = UNITS[k][0]
+
+            #first encounter, add unit in the dictionary
+            if not utype in unit_self_type:
+                unit_self_type[utype] = self.unit[k]
+            else:
+                unit_self_type[utype] = unit_self_type[utype] + self.unit[k]
+
+        #compare unit dimensions
+        for k1 in unit_p_type:
+            if k1 == 'unitless' or unit_p_type[k1] == 0:
+                continue
+            else:
+                match_found = False
+                for k2 in unit_self_type:
+                    if k1 == k2 and unit_p_type[k1] == unit_self_type[k2]:
+                        match_found = True                       
+                if not match_found:
+                    raise ValueError('Can not convert '+ Quantity._unit2str(unit_self_type) + ' to '+ Quantity._unit2str(unit_p_type) +'.')
+        for k1 in unit_self_type:
+            if k1 == 'unitless' or unit_self_type[k1] == 0:
+                continue
+            else:
+                match_found = False
+                for k2 in unit_p_type:
+                    if k1 == k2 and unit_self_type[k1] == unit_p_type[k2]:
+                        match_found = True                       
+                if not match_found:
+                    raise ValueError('Can not convert '+ Quantity._unit2str(unit_self_type) + ' to '+ Quantity._unit2str(unit_p_type) +'.')
+
+        #calculate the conversion factor
+        convf = 1
+        for k in self.unit:
+            convf = convf*UNITS[k][1]**self.unit[k]
+        for k in unit_parsed:
+            convf = convf/UNITS[k][1]**unit_parsed[k]
+
+        value = self.value*convf
+        return value
+
+    def units(self):
+        '''
+        Returns the string presentation of units
+        '''
+        return Quantity._unit2str(self.unit)
+
+    def type(self):
+        '''
+        Returns the str of the type of the quantity. 
+        '''
+        return Quantity._type2str(self.unit)
+
+    def copy(self):
+        '''
+        Returns the copy of the instance
+        '''
+        return Quantity(self.value.copy(), Quantity._unit2str(self.unit))
+
+    @staticmethod
+
+    def _parse_units(unit_string):
+        '''
+        Parses the compounded unit string into basic units.
+        '''
+        
+        unit_str_split = unit_string.split()
+
+        #parse units exponents
+        units = {}
+        for u in unit_str_split:
+            u2 = u.split('^')
+
+            if not u2[0] in UNITS.keys():
+                raise ValueError(str(u2[0]) + ' not found in the list of available units.')
+
+            #first encounter, add unit in the dictionary
+            if not u2[0] in units.keys():
+                units[u2[0]] = 0
+
+            if len(u2) == 1:
+                #no exponent given explicitely -> exponent = 1
+                units[u2[0]] = units[u2[0]] + 1
+            elif len(u2) == 2:
+                exponent = int(u2[1]) 
+                if not exponent == 0:
+                    units[u2[0]] = units[u2[0]] + exponent
+            else:
+                raise ValueError('Invalid unit: '+ str(u) + '.')
+
+        #remove exponents zero from the unit list
+        for k in list(units.keys()):
+            if units[k] == 0:
+                del units[k]
+
+        #reduce the number of unitless units
+        if '1' in units.keys():
+            if len(units) == 1:
+                units['1'] = 1
+            else:
+                del units['1']
+
+        return units
+
+    @staticmethod
+    
+    def _unit2str(unit):
+
+        '''
+        Makes a pretty string representation of unit dictionary
+        '''
+        
+        unit_str = ''
+
+        for k in unit:
+            unit_str = unit_str + k
+            if unit[k] == 1:
+                unit_str = unit_str + ' '
+            else:
+                unit_str = unit_str +'^'+str(unit[k])+' '
+
+        return unit_str[:-1]
+
+    @staticmethod
+
+    def _type2str(unit):
+
+        '''
+        Makes a pretty string representation of unit dictionary's type
+        '''
+        unit_type = {}
+
+        for k in unit:
+            utype = UNITS[k][0]
+
+            #first encounter, add unit in the dictionary
+            if not utype in unit_type:
+                unit_type[utype] = unit[k]
+            else:
+                unit_type[utype] = unit_type[utype] + unit[k]
+
+        return Quantity._unit2str(unit_type)
+
+    def __str__(self):
+        unit_str = ''
+
+        for k in self.unit:
+            if k == '1':
+                continue
+            unit_str = unit_str + k
+            if self.unit[k] == 1:
+                unit_str = unit_str + ' '
+            else:
+                unit_str = unit_str +'^'+str(self.unit[k])+' '
+
+        return str(self.value)+' '+ unit_str[:-1]
diff --git a/pyTTE/rotation_matrix.py b/pyTTE/rotation_matrix.py
new file mode 100755
index 0000000..f6816de
--- /dev/null
+++ b/pyTTE/rotation_matrix.py
@@ -0,0 +1,94 @@
+from __future__ import division, print_function
+import numpy as np
+
+
+def axis_angle(u,theta):
+    '''
+    Computes a matrix which performs a rotation of theta degrees counterclockwise about axis u.
+
+    Input:
+        u = 3-element vector giving the axis of rotation (does not need to be normalized)
+        theta = angle of counterclockwise rotation (in deg) 
+    Output:
+        R = 3x3 rotation matrix
+    '''    
+
+    #normalize
+    u = np.array(u)
+    u = u/np.sqrt(u[0]**2+u[1]**2+u[2]**2)
+    #rotation angle
+    th = np.radians(theta)
+
+    #rotation matrix
+    R=np.array([[        np.cos(th) + u[0]**2*(1-np.cos(th)), u[0]*u[1]*(1-np.cos(th)) - u[2]*np.sin(th), u[0]*u[2]*(1-np.cos(th)) + u[1]*np.sin(th)],
+                [ u[0]*u[1]*(1-np.cos(th)) + u[2]*np.sin(th),        np.cos(th) + u[1]**2*(1-np.cos(th)), u[1]*u[2]*(1-np.cos(th)) - u[0]*np.sin(th)],
+                [ u[0]*u[2]*(1-np.cos(th)) - u[1]*np.sin(th), u[1]*u[2]*(1-np.cos(th)) + u[0]*np.sin(th),        np.cos(th) + u[2]**2*(1-np.cos(th))]])
+
+    return R
+
+
+def align_vector_with_z_axis(h):
+    '''
+    Computes the rotation matrix which aligns the given vector along z-axis.
+    For example, for reflection (hkl), h = h*b1 + k*b2 + l*b3, where bi
+    are the primitive reciprocal vectors.
+
+    Input:
+        h = 3-element vector to be aligned
+    Output:
+        R = 3x3 rotation matrix
+    '''
+
+    if h[0] or h[1]:
+        #rotation axis
+        u = np.array([h[1],-h[0]])/np.sqrt(h[0]**2+h[1]**2)
+        #rotation angle
+        th = np.arccos(h[2]/np.sqrt(h[0]**2+h[1]**2+h[2]**2))
+    else:
+        if h[2] > 0:
+            #zero deg rotation about -y
+            u = np.array([0,-1])
+            th = 0
+        else:
+            #180 deg rotation about -y
+            u = np.array([0,-1])
+            th = np.pi
+
+    #rotation matrix
+    R=np.array([[ np.cos(th) + u[0]**2*(1-np.cos(th)),          u[0]*u[1]*(1-np.cos(th)),  u[1]*np.sin(th)],
+                [            u[0]*u[1]*(1-np.cos(th)), np.cos(th)+u[1]**2*(1-np.cos(th)), -u[0]*np.sin(th)],
+                [                    -u[1]*np.sin(th),                   u[0]*np.sin(th),       np.cos(th)]])
+
+    return R
+
+
+def inplane_rotation(alpha):
+    '''
+    Rotates the given tensor around the z-axis by alpha degrees counterclockwise.
+
+    Input:
+        alpha = angle of counterclockwise rotation (in deg) 
+    Output:
+        R = 3x3 rotation matrix
+    '''
+
+    R = axis_angle([0,0,1], alpha)
+
+    return R
+
+def rotate_asymmetry(phi):
+    '''
+    Rotates the given tensor around the y-axis by phi degrees counterclockwise.
+    This corresponds to the definition of clockwise-positive asymmetry angle in
+    xz-plane as defined in the documentation.
+
+    Input:
+        phi = asymmetry angle (in deg) 
+    Output:
+        R = 3x3 rotation matrix
+    '''
+
+    R = axis_angle([0,1,0], phi)
+
+    return R
+
diff --git a/pyTTE/ttcrystal.py b/pyTTE/ttcrystal.py
new file mode 100644
index 0000000..9f82cd1
--- /dev/null
+++ b/pyTTE/ttcrystal.py
@@ -0,0 +1,769 @@
+# -*- coding: utf-8 -*-
+from __future__ import division, print_function
+from .quantity import Quantity
+from .crystal_vectors import crystal_vectors
+from .elastic_tensors import elastic_matrices, rotate_elastic_matrix
+from .deformation import isotropic_plate, anisotropic_plate_fixed_shape, anisotropic_plate_fixed_torques
+from .rotation_matrix import rotate_asymmetry, align_vector_with_z_axis, inplane_rotation
+import numpy as np
+import xraylib
+
+
+HC_CONST  = Quantity(1.23984193,'eV um') #Planck's constant * speed of light
+
+class TTcrystal:
+    '''
+    Contains all the information about the crystal and its depth-dependent 
+    deformation. An instance can be initialized either by giving a path to a 
+    file defining the crystal parameters, or passing them to the function as 
+    keyword arguments. Keyword parameters are omitted if filepath given.
+
+    Parameters
+    ----------
+
+    filepath : str
+        Path to the file with crystal parameters
+
+    *OR*
+
+    crystal : str
+        String representation of the crystal in compliance with xraylib
+
+    hkl : list, tuple, or 1D array of size 3
+        Miller indices of the reflection (ints or floats)
+
+    thickness : Quantity of type length 
+        Thickness of the crystal wafer e.g. Quantity(300,'um')
+
+    (optional keywords)
+    
+    asymmetry : Quantity of type angle
+        Clockwise-positive asymmetry angle wrapped in a Quantity instance.
+        0 deg for symmetric Bragg case (default), 90 deg for symmetric Laue
+
+    in_plane_rotation : Quantity of type angle OR a list of size 3
+        Counterclockwise-positive rotation of the crystal directions about the
+        normal vector of (hkl) wrapped in a Quantity instance of type angle
+        OR a crystal direction [q,r,s] corresponding to a direct space vector
+        R = q*a1 + r*a2 + s*a3 that together with the crystal will be rotated 
+        about the hkl vector so that its component perpendicular to the normal 
+        of (hkl) will be aligned with the y-axis. Will raise an error if 
+        R || hkl.
+        
+    debye_waller : float in range [0, 1]
+        The Debye-Waller factor to account for the thermal motion. Definined as
+        exp(-0.5 * h^2 * <u^2>), where h is the reciprocal lattice vector 
+        corresponding to (hkl) and <u^2> is the expectation value of mean 
+        displacement of atoms parallel to h. Currently assumes that all atoms
+        share the same <u^2>. Defaults to 1 (= 0 K).
+
+    S : 6x6 array wrapped in a Quantity instance of type pressure^-1
+        The compliance matrix in the Voigt notation. Overrides the default 
+        compliance matrix given by elastic_tensors and any user inputs for E 
+        and nu. 
+                       
+        Note that S is supposed to be in the Cartesian coordinate system aligned
+        with the conventional unit vectors before any rotations i.e. x || a_1 
+        and a_2 is in the xy-plane. For rectagular systems this means that the 
+        Cartesian basis is aligned with the unit vectors. 
+
+        If an input file is used, the non-zero elements of the compliance matrix
+        in the upper triangle and on the diagonal should be given in the units 
+        GPa^-1 (order doesn't matter). Any lower triangle inputs will be omitted 
+        as they are obtained by symmetry from the upper triangle. 
+
+        Example input: 
+            S11  0.00723
+            S22  0.00723
+            S33  0.00723
+            S12 -0.00214
+            etc.
+
+    E : Quantity of type pressure
+        Young's modulus for isotropic material. Overrides the default compliance 
+        matrix. Neglected if S is given. Required with nu but can have an 
+        arbitrary value for 1D TT-calculation, as the isotropic deformation
+        is not dependent on E.
+        
+    nu : float
+        Poisson's ratio for isotropic material. Overrides the default compliance 
+        matrix. Neglected if S is given. Requires that E also given.
+
+    Rx, Ry : Quantity of type length
+        Meridional and sagittal bending radii for toroidal bending wrapped in 
+        Quantity instances e.g. Quantity(1,'m'). If omitted, defaults to inf 
+        (no bending). Overridden by R. 
+        
+        The other one can be set to None if isotropic model is used or if 
+        fix_to_axes = 'torque'; it is then determined by the anticlastic bending.    
+        
+    R : Quantity of type length
+        Bending radius for spherical bending wrapped in Quantity instance. 
+        Overrides Rx and Ry.
+        
+    fix_to_axes : str 
+        Used to determine the anisotropic bending model used. If 'torques' then 
+        the plate is bent by two orthogonal torques acting about x- and y-axes, 
+        if 'shape' then the main axes of curvature are assumed to be along x 
+        and y (and given by Rx and Ry).
+
+
+    Attributes
+    ----------
+
+    crystal_data : dict
+    
+    hkl : 3 element list of ints
+
+    direct_primitives : 3x3 numpy array of direct unit vectors in angstroms 
+    
+    reciprocal_primitives : 3x3 numpy array of reciprocal unit vectors in 1/angstroms 
+
+    thickness : Quantity of type length
+
+    asymmetry : Quantity of type angle
+    
+    in_plane_rotation : Quantity of type angle
+    
+    debye_waller : float
+    
+    isotropy : 'isotropic' or 'anisotropic'
+
+    E  : Quantity of type pressure (present if isotropy == 'isotropic')
+    
+    nu : float (present if isotropy == 'isotropic')
+
+    S0 : 6x6 Numpy array of the compliance matrix before any rotations (crystal 
+         directions as in direct_primitives, present if isotropy == 'anisotropic')  
+
+    S : 6x6 Numpy array of the compliance matrix after applying the rotations 
+        (hkl, asymmetry, in_plane_rotation) 
+
+    deformation_model : list
+        Either ['isotropic'], ['anisotropic', 'fixed_shape'], 
+        ['anisotropic', 'fixed_torques'], or ['custom', jacobian], where 
+        jacobian is a function returning the Jacobian of the displacement
+        vector [ux, uz].
+    
+    fix_to_axes : 'shape' or 'torques'
+
+    crystal_directions : 3 x 3 Numpy array, whose columns give the crystal 
+                        directions along the Cartesian axes after rotations.
+    
+    displacement_jacobian : function returning the partial derivatives of the 
+                            displacement vector u as a function of (x,z)
+       
+    - See the technical documentation in docs for more details. -
+    '''
+
+
+    def __init__(self, filepath = None, **kwargs):
+
+
+        params = {}
+
+        if filepath is not None:
+            
+            #####################################
+            #Read crystal parameters from a file#
+            #####################################
+
+            #Overwrite possible kwargs 
+            kwargs = {}
+
+            with open(filepath,'r') as f:
+                lines = f.readlines()
+
+            #Boolean to check if elements of the compliance matrix are given
+            is_S_given = False
+            S_matrix = np.zeros((6,6))
+
+            #check and parse parameters
+            for line in lines:
+                line = line.strip()
+                if len(line) > 0 and not line[0] == '#':  #skip empty and comment lines
+                    ls = line.split() 
+                    if ls[0] == 'crystal' and len(ls) == 2:
+                        kwargs['crystal'] = ls[1]
+                    elif ls[0] == 'hkl' and len(ls) == 4:
+                        kwargs['hkl'] = [int(ls[1]),int(ls[2]),int(ls[3])]
+                    elif ls[0] == 'in_plane_rotation':
+                        if len(ls) == 4:
+                            kwargs['in_plane_rotation'] = [float(ls[1]),float(ls[2]),float(ls[3])]
+                        elif  len(ls) == 3:
+                            kwargs['in_plane_rotation'] = Quantity(float(ls[1]),ls[2])
+                        else:
+                            print('Skipped an invalid line in the file: ' + line)
+                    elif ls[0] == 'debye_waller' and len(ls) == 2:
+                        kwargs['debye_waller'] = float(ls[1])
+                    elif ls[0] in ['thickness', 'asymmetry', 'E'] and len(ls) == 3:
+                        kwargs[ls[0]] = Quantity(float(ls[1]),ls[2])
+                    elif ls[0] == 'nu' and len(ls) == 2:
+                        kwargs['nu'] = float(ls[1])
+                    elif ls[0][0] == 'S' and len(ls[0]) == 3 and len(ls) == 2:
+                        is_S_given = True
+                        i = int(ls[0][1])-1
+                        j = int(ls[0][2])-1
+                        if i > j:
+                            print('Omitted the lower triangle element ' + ls[0] + '.')
+                        else:
+                            S_matrix[i,j] = float(ls[1])
+                            S_matrix[j,i] = float(ls[1])
+                    elif ls[0] in ['Rx', 'Ry']:
+                        if len(ls) == 3:
+                            kwargs[ls[0]] = Quantity(float(ls[1]),ls[2])
+                        elif len(ls) == 2:
+                            kwargs[ls[0]] = ls[1]
+                        else:
+                            print('Skipped an invalid line in the file: ' + line)                           
+                    elif ls[0] == 'R' and len(ls) == 3:                        
+                        kwargs['Rx'] = Quantity(float(ls[1]),ls[2])
+                        kwargs['Ry'] = Quantity(float(ls[1]),ls[2])
+                    elif ls[0] == 'fix_to_axes' and len(ls) == 2:
+                        kwargs['fix_to_axes'] = ls[1]                        
+                    else:
+                        print('Skipped an invalid line in the file: ' + line)
+
+            if is_S_given:
+                #Finalize the S matrix
+                kwargs['S'] = Quantity(S_matrix,'GPa^-1') 
+
+        ###################################################
+        #Check the presence of the required crystal inputs#
+        ###################################################
+        
+        try:
+            params['crystal']   = kwargs['crystal']
+            params['hkl']       = kwargs['hkl']
+            params['thickness'] = kwargs['thickness']
+        except:
+            raise KeyError('At least one of the required keywords crystal, hkl, or thickness is missing!')
+
+        #Optional keywords       
+        for k in ['asymmetry','in_plane_rotation']:
+            params[k] = kwargs.get(k, Quantity(0,'deg'))
+
+        params['debye_waller'] = kwargs.get('debye_waller', 1.0)
+
+        for k in ['S','E','nu']:
+            params[k] = kwargs.get(k, None)
+
+        #Check that if either E or nu is given, then the other one is also
+        if (params['E'] is not None) ^ (params['nu'] is not None):
+            raise KeyError('Both E and nu required for isotropic material!')
+
+        params['Rx'] = kwargs.get('Rx', 'inf')
+        params['Ry'] = kwargs.get('Ry', 'inf')
+
+        if 'R' in kwargs.keys():  
+            if 'Rx' in kwargs.keys() or 'Rx' in kwargs.keys():
+                print('Warning! Rx and/or Ry given but overridden by R.')
+            params['Rx'] = kwargs['R']
+            params['Ry'] = kwargs['R']
+
+        params['fix_to_axes'] = kwargs.get('fix_to_axes', 'shape')
+
+        ###########################################
+        #Initialize with the read/given parameters#
+        ###########################################
+
+        #determines the length scale in which the position coordinate to the jacobian are given
+        self._jacobian_length_unit = 'um'
+
+        self.set_crystal(params['crystal'], skip_update = True)
+        self.set_reflection(params['hkl'], skip_update = True)
+        self.set_thickness(params['thickness'], skip_update = True)
+        self.set_asymmetry(params['asymmetry'], skip_update = True)
+        self.set_in_plane_rotation(params['in_plane_rotation'], skip_update = True)
+        self.set_debye_waller(params['debye_waller'], skip_update = True)
+
+        if params['S'] is not None:
+            self.set_elastic_constants(S = params['S'], skip_update = True)
+            if 'E' in params.keys() or 'nu' in params.keys():
+                print('Warning! Isotropic E and/or nu given but overridden by the compliance matrix S.')
+        elif (params['E'] is not None) and (params['nu'] is not None):
+            self.set_elastic_constants(E = params['E'], nu = params['nu'], skip_update = True)
+        else:
+            self.set_elastic_constants(skip_update = True)
+
+        self.set_fix_to_axes(params['fix_to_axes'], skip_update = True)
+        self.set_deformation(jacobian = None, skip_update = True)
+        self.set_bending_radii(params['Rx'], params['Ry'], skip_update = True)
+
+        self.update_rotations_and_deformation()
+
+    def set_crystal(self, crystal_str, skip_update = False):
+        '''
+        Changes the crystal keeping other parameters the same. Recalculates
+        the crystallographic parameters. The effect on the deformation depends 
+        on its previous initialization:
+            isotropic -> no change
+            automatic anisotropic elastic matrices -> update to new crystal
+            manual anisotropic elastic matrices    -> clear
+
+        Input:
+            crystal_str = string representation of the crystal in compliance with xraylib
+        '''
+
+        #Check whether the crystal_str is valid and available in xraylib
+        if type(crystal_str) == type(''):
+            if crystal_str in xraylib.Crystal_GetCrystalsList():
+                self.crystal_data = xraylib.Crystal_GetCrystal(crystal_str)
+            else:
+                raise ValueError('The given crystal_str not found in xraylib!')
+        else:
+            raise ValueError('Input argument crystal_str is not type str!')
+
+        #calculate the direct and reciprocal primitive vectors 
+        self.direct_primitives, self.reciprocal_primitives = crystal_vectors(self.crystal_data)
+
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_reflection(self, hkl, skip_update = False):
+        '''
+        Set a new reflection and calculate the new crystallographic data and deformation
+        for rotated crystal.
+
+        Input:
+            crystal_str = string representation of the crystal in compliance with xraylib
+        '''
+
+        #Check whether the hkl is valid
+        hkl_list = list(hkl)
+        if len(hkl_list) == 3:
+            for i in range(3):
+                if not type(hkl_list[i]) in [type(1),type(1.0)]:
+                    raise ValueError('Elements of hkl have to be of type int or float!')
+            self.hkl = hkl_list               
+        else:
+            raise ValueError('Input argument hkl does not have 3 elements!')
+
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_thickness(self, thickness, skip_update = False):
+        '''
+        Set crystal thickness and recalculate the deformation field.
+
+        Input:
+            thickness = the thickness of the crystal wrapped in a Quantity instance e.g. Quantity(300,'um')
+        '''
+
+        #Check that the crystal thickness is valid
+        if isinstance(thickness,Quantity) and thickness.type() == 'length':
+            self.thickness = thickness.copy()
+        else:
+            raise ValueError('Thickness has to be a Quantity instance of type length!')
+
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_asymmetry(self, asymmetry, skip_update = False):
+        '''
+        Set the asymmetry angle.
+
+        Input:
+            asymmetry = clockwise-positive asymmetry angle wrapped in a Quantity instance 0 
+                        for symmetric Bragg case (default), 90 deg for symmetric Laue
+        '''
+
+        if isinstance(asymmetry,Quantity) and asymmetry.type() == 'angle':
+            self.asymmetry = asymmetry.copy()
+        else:
+            raise ValueError('Asymmetry angle has to be a Quantity instance of type angle!')
+
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_in_plane_rotation(self, in_plane_rotation, skip_update = False):
+        '''
+        Set the in-plane rotation angle.
+
+        Input:
+            in_plane_rotation = counterclockwise-positive rotation of the crystal directions about hkl-vector 
+                                wrapped in a Quantity instance of type angle
+                                OR
+                                a crystal direction [q,r,s] corresponding to a direct space vector
+                                R = q*a1 + r*a2 + s*a3 which will be rotated about the hkl vector so that its
+                                component perpendicular to hkl (and the crystal as a whole with it) will be 
+                                aligned with the y-axis. Will raise an error if R || hkl.
+        '''
+
+        if isinstance(in_plane_rotation, Quantity) and in_plane_rotation.type() == 'angle':
+            self.in_plane_rotation = in_plane_rotation.copy()
+        elif type(in_plane_rotation) in [type([]),type((1,)),type(np.array([]))] and len(in_plane_rotation) == 3:
+                     
+            #Check the list entry types
+            for i in in_plane_rotation:
+                if not np.isreal(i):
+                    raise ValueError('In-plane rotation angle has to be a Quantity instance of type angle OR a list of floats size 3!')
+
+            #calculate the given crystal direction in the direct space
+            r = in_plane_rotation[0]*self.direct_primitives[:,0] +\
+                in_plane_rotation[1]*self.direct_primitives[:,1] +\
+                in_plane_rotation[2]*self.direct_primitives[:,2]
+
+            #calculate reciprocal vector of the diffraction hkl
+            h = self.hkl[0]*self.reciprocal_primitives[:,0] +\
+                self.hkl[1]*self.reciprocal_primitives[:,1] +\
+                self.hkl[2]*self.reciprocal_primitives[:,2]
+
+            #check the relative angle of r and h
+            if abs(np.dot(r,h) - np.sqrt(np.dot(r,r)*np.dot(h,h))) < np.finfo(type(1.0)).eps:
+                raise ValueError('in_plane_rotation can not be parallel to the reciprocal diffraction vector!')
+
+            #hkl||z alignment
+            R = align_vector_with_z_axis(h)
+
+            #rotate r to a coordinate system where z||hkl            
+            r_rot = np.dot(R,r)
+
+            #Calculate the inclination between r_rot and the xy-plane
+            incl = np.arctan2(r_rot[2],np.sqrt(r_rot[0]**2 + r_rot[1]**2))
+
+            print('Deviation of the given in_plane_rotation direction from the rotation plane: ' + str(np.degrees(incl)) + ' deg.')
+            
+            #The angle between the direction vector projected to the new xy-plane and the y-axis
+            rotation_angle = np.arctan2(r_rot[0],r_rot[1])
+
+            self.in_plane_rotation = Quantity(np.degrees(rotation_angle),'deg')
+        else:
+            raise ValueError('In-plane rotation angle has to be a Quantity instance of type angle OR a list of floats size 3!')
+
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_debye_waller(self, debye_waller, skip_update = False):
+        '''
+        Set the Debye-Waller factor.
+
+        Input:
+            debye_waller = A float or integer in the range [0,1]
+        '''
+
+        if not isinstance(debye_waller,Quantity) and np.array(debye_waller).size == 1 \
+        and np.real(debye_waller) and debye_waller >= 0 and debye_waller <= 1:
+            self.debye_waller = debye_waller
+        else:
+            raise ValueError('Debye-Waller factor has to be a float or integer in range [0,1]!')
+
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_elastic_constants(self, S = None, E = None, nu = None, skip_update = False):
+        '''
+        Set either the compliance matrix (fully anisotropic) or Young's modulus and Poisson ratio (isotropic).
+
+        Input:
+            None for the compliance matrix in the internal database
+
+            OR
+
+            S = 6x6 compliance matrix wrapped in a instance of Quantity of type pressure^-1
+            
+            OR
+            
+            E  = Young's modulus in a Quantity instance of type pressure
+            nu = Poisson's ratio (float or int) 
+        '''
+
+        if (E is not None) and (nu is not None):
+            if isinstance(E, Quantity) and E.type() == 'pressure':
+                if type(nu) in [int, float]:
+                    self.isotropy = 'isotropic'
+                    self.E  = E.copy()
+                    self.nu = nu
+                else:
+                    raise ValueError('nu has to be float or int!')
+            else:
+                raise ValueError('E has to be an instance of Quantity of type pressure!')
+        elif S is not None:
+            if isinstance(S, Quantity) and S.type() == 'pressure^-1':
+                if S.value.shape == (6,6):
+                    self.isotropy = 'anisotropic'
+                    self.S0 = S.copy()
+                else:
+                    raise ValueError('Shape of S has to be (6,6)!')
+            else:
+                raise ValueError('S has to be an instance of Quantity of type pressure^-1!')
+        else:
+            self.isotropy = 'anisotropic'
+            self.S0 = Quantity(0.01*elastic_matrices(self.crystal_data['name'])[1],'GPa^-1')
+            
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_fix_to_axes(self, fix_to_axes, skip_update = False):
+        '''
+        Sets the deformation field.
+
+        Input:
+            fix_to_axes = Determines the anisotropic bending model used. If 
+                          'torques' then the plate is bent by two orthogonal 
+                          torques acting about x- and y-axes, if 'shape' then 
+                          the main axes of curvature are assumed to be along 
+                          x and y (and given by Rx and Ry).
+        '''
+
+        if fix_to_axes in ['shape', 'torques']:
+            self.fix_to_axes = fix_to_axes
+        else:
+            raise ValueError("The allowed values for fix_to_axes are 'torques' and 'shape'!" )
+                        
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            if self.deformation_model[0] == 'custom':                
+                self.set_deformation(jacobian = self.deformation_model[1], skip_update = True)
+            else:
+                self.set_deformation(jacobian = None, skip_update = True)
+            self.set_bending_radii(self.Rx, self.Ry, skip_update = True)
+            self.update_rotations_and_deformation()
+
+    def set_bending_radii(self, Rx, Ry, skip_update = False):
+        '''
+        Sets the meridional and sagittal bending radii.
+
+        Input:
+            Rx, Ry = Meridional and sagittal bending radii wrapped in Quantity 
+                     instances of type length. Alternatively can be float('inf'), 
+                     'inf', or None. If self.deformation_model == ['anisotropic',
+                     'fixed_shape'], None is interpreted as 'inf'.
+        '''
+
+        if isinstance(Rx, Quantity) and Rx.type() == 'length':
+            self.Rx = Rx.copy()
+        elif Rx == 'inf' or Rx == float('inf'):
+            self.Rx = Quantity(float('inf'),'m')
+        elif Rx is None:
+            if self.deformation_model == ['anisotropic','fixed_shape']:
+                self.Rx = Quantity(float('inf'),'m')
+            else:
+                self.Rx = None
+        else:
+            raise ValueError('Rx has to be an instance of Quantity of type length, inf, or None!')
+        if isinstance(Ry, Quantity) and Ry.type() == 'length':
+            self.Ry = Ry.copy()
+        elif Ry == 'inf' or Ry == float('inf'):
+            self.Ry = Quantity(float('inf'),'m')
+        elif Ry is None:
+            if self.deformation_model == ['anisotropic','fixed_shape']:
+                self.Ry = Quantity(float('inf'),'m')
+            else:
+                self.Ry = None
+        else:
+            raise ValueError('Ry has to be an instance of Quantity of type length, inf, or None!')
+            
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.update_rotations_and_deformation()
+
+    def set_deformation(self, jacobian = None, skip_update = False):
+        '''
+        Sets the deformation field.
+
+        Input:
+            jacobian = function returning the partial derivatives of the 
+                       displacement vector u as a function of (x,z). If None,
+                       the deformation model will be determined from 
+                       self.isotropy, and self.fix_to_axes
+        '''
+
+        if jacobian is not None:
+            #test the given jacobian
+            ujac = jacobian(0,0)
+
+            if len(ujac) == 2:
+               if len(ujac[0]) == 2 and len(ujac[1]) == 2:
+                   self.deformation_model = ['custom', jacobian]
+               else:
+                   raise ValueError('Output of jacobian has to be 2x2 list or array!')
+            else:
+                raise ValueError('Output of jacobian has to be 2x2 list or array!')
+        else:
+            if self.isotropy == 'isotropic':
+                self.deformation_model = ['isotropic']
+            else:
+                if self.fix_to_axes == 'shape':
+                    self.deformation_model = ['anisotropic', 'fixed_shape']                
+                else:
+                    self.deformation_model = ['anisotropic', 'fixed_torques']                            
+            
+        #skip this if the function is used as a part of initialization
+        if not skip_update:
+            self.set_bending_radii(self.Rx, self.Ry, skip_update = True)
+            self.update_rotations_and_deformation()
+
+    def bragg_energy(self, bragg_angle):
+        '''
+        Returns the energy of the photons corresponding to the given Bragg angle.
+
+        Parameters
+        ----------
+        bragg_angle : Quantity of type angle
+            Angle between the incident beam and the diffraction planes. 
+
+        Returns
+        -------
+        bragg_energy : Quantity of type energy
+            The energy of photons fulfilling the kinematical diffraction condition.
+        '''
+
+        if not (isinstance(bragg_angle, Quantity) and bragg_angle.type() == 'angle'):        
+            raise TypeError('bragg_angle has to be an instance of Quantity of type angle!')
+
+        if np.any(bragg_angle.in_units('deg') <= 0) or np.any(bragg_angle.in_units('deg') >= 180):
+            raise ValueError('bragg_angle has to be in range (0,180) deg!')
+            
+        #d-spacing of the reflection
+        d = Quantity(xraylib.Crystal_dSpacing(self.crystal_data,*self.hkl),'A')
+
+        wavelength = 2*d*np.sin(bragg_angle.in_units('rad'))
+
+        return Quantity((HC_CONST/wavelength).in_units('keV'), 'keV')
+
+    def bragg_angle(self, bragg_energy):
+        '''
+        Returns the Bragg angle corresponding to the energy of incident photons.
+
+        Parameters
+        ----------
+        bragg_energy : Quantity of type angle
+            The energy of incident photons. 
+
+        Returns
+        -------
+        bragg_angle : Quantity of type energy
+            The angle between the incident beam and the diffracting planes 
+            fulfilling the kinematical diffraction condition.
+        '''
+
+        if not (isinstance(bragg_energy, Quantity) and bragg_energy.type() == 'energy'):        
+            raise TypeError('bragg_energy has to be an instance of Quantity of type energy!')
+
+        if np.any(bragg_energy.in_units('keV') < 0):
+            raise ValueError('bragg_energy has to be non-negative!')
+            
+        #d-spacing of the reflection
+        d = Quantity(xraylib.Crystal_dSpacing(self.crystal_data,*self.hkl),'A')
+
+        wavelength = HC_CONST/bragg_energy
+
+        sin_th = (wavelength/(2*d)).in_units('1')
+
+        if np.any(sin_th > 1):
+            backscatter_energy = (HC_CONST/(2*d)).in_units('keV')
+            raise ValueError('bragg_energy below the backscattering energy '
+                             + str(backscatter_energy) + ' keV!')
+                    
+        return Quantity(np.degrees(np.arcsin(sin_th)), 'deg')
+
+    def update_rotations_and_deformation(self):
+        '''
+        Applies the in-plane and asymmetry rotations to the elastic matrix (for anisotropic crystal) 
+        and calculates the Jacobian of the deformation field based on the elastic parameters and the
+        bending radii.
+        '''
+
+        #calculate reciprocal vector of the diffraction hkl
+        hkl = self.hkl[0]*self.reciprocal_primitives[:,0] +\
+              self.hkl[1]*self.reciprocal_primitives[:,1] +\
+              self.hkl[2]*self.reciprocal_primitives[:,2]
+
+        #hkl||z alignment
+        R1 = align_vector_with_z_axis(hkl)
+        
+        R2 = inplane_rotation(self.in_plane_rotation.in_units('deg'))
+
+        #asymmetry alignment
+        R3 = rotate_asymmetry(self.asymmetry.in_units('deg'))
+
+        Rmatrix = np.dot(R3,np.dot(R2,R1))
+
+        #rotate the primitive vectors
+        dir_prim_rot = np.dot(Rmatrix,self.direct_primitives)
+        
+        #calculate the basis transform matrix from cartesian to crystal direction 
+        #indices, whose columns are equal to crystal directions along main axes 
+        self.crystal_directions = np.linalg.inv(dir_prim_rot)
+
+        #Apply rotations of the crystal to the elastic matrix
+        if self.deformation_model[0] == 'anisotropic':
+            self.S = Quantity(rotate_elastic_matrix(self.S0.value, 'S', Rmatrix), 
+                              self.S0.units())
+        
+        #calculate the depth-dependent deformation jacobian
+        if self.deformation_model[0] == 'custom':
+            self.displacement_jacobian = self.deformation_model[1]
+        elif self.Rx is not None and self.Rx.value == float('inf') and self.Ry is not None and self.Ry.value == float('inf'):
+            self.displacement_jacobian = None
+        else:
+            if self.Rx is not None:
+                Rx = self.Rx.in_units(self._jacobian_length_unit)
+            else:
+                Rx = None
+            if self.Ry is not None:
+                Ry = self.Ry.in_units(self._jacobian_length_unit)
+            else:
+                Ry = None
+
+            if self.deformation_model[0] == 'anisotropic':
+                if self.deformation_model[1] == 'fixed_shape': 
+                    self.displacement_jacobian = anisotropic_plate_fixed_shape(Rx, Ry, self.S.in_units('GPa^-1'),
+                                                                               self.thickness.in_units(self._jacobian_length_unit))[0]
+                else:
+                    self.displacement_jacobian = anisotropic_plate_fixed_torques(Rx, Ry, self.S.in_units('GPa^-1'),
+                                                                                 self.thickness.in_units(self._jacobian_length_unit))[0]
+            else: 
+                self.displacement_jacobian = isotropic_plate(Rx, Ry, self.nu,
+                                                             self.thickness.in_units(self._jacobian_length_unit))[0]
+
+    def __str__(self):
+        #TODO: Improve output presentation
+        if self.isotropy == 'anisotropic':
+            elastic_str = 'Compliance matrix S (with rotations applied):\n' + np.array2string(self.S.in_units('GPa^-1'),precision=4, suppress_small =True) + ' GPa^-1'
+        else:
+            elastic_str = "Young's modulus E: " + str(self.E) + "\nPoisson's ratio nu: "+ str(self.nu) 
+
+        if self.deformation_model[0] == 'custom':
+            deformation_str = 'custom Jacobian (bending radii and elastic parameters neglected)'
+        elif self.deformation_model[0] == 'isotropic':
+            deformation_str = 'isotropic toroidal (built-in)'            
+        elif self.deformation_model[0] == 'anisotropic':
+            if self.deformation_model[1] == 'fixed_shape':
+                deformation_str = 'anisotropic toroidal, fixed shape (built-in)'            
+            else:
+                deformation_str = 'anisotropic toroidal, fixed torques (built-in)'            
+
+        return 'Crystal: ' + self.crystal_data['name'] + '\n' +\
+               'Crystallographic parameters:\n' +\
+               '    a = ' + str(self.crystal_data['a']*0.1)[:8] + ' nm,  b = ' + str(self.crystal_data['b']*0.1)[:8] + ' nm,  c = ' + str(self.crystal_data['c']*0.1)[:8] + ' nm\n'+\
+               '    alpha = ' + str(self.crystal_data['alpha']) + ' deg,  beta = ' + str(self.crystal_data['beta']) + ' nm,  gamma = ' + str(self.crystal_data['gamma']) + ' deg\n'+\
+               'Direct primitive vectors (before rotations, in nm):\n'+\
+               '    a1 = '+np.array2string(0.1*self.direct_primitives[:,0],precision=4,suppress_small=True)+'\n'+\
+               '    a2 = '+np.array2string(0.1*self.direct_primitives[:,1],precision=4,suppress_small=True)+'\n'+\
+               '    a3 = '+np.array2string(0.1*self.direct_primitives[:,2],precision=4,suppress_small=True)+'\n'+\
+               'Reciprocal primitive vectors (before rotations, in 1/nm):\n' +\
+               '    b1 = ' + np.array2string(10*self.reciprocal_primitives[:,0],precision=4,suppress_small=True)+'\n'+\
+               '    b2 = ' + np.array2string(10*self.reciprocal_primitives[:,1],precision=4,suppress_small=True)+'\n'+\
+               '    b3 = ' + np.array2string(10*self.reciprocal_primitives[:,2],precision=4,suppress_small=True)+'\n\n'+\
+               'Reflection: '+str(self.hkl)+'\n'+\
+               'Asymmetry angle: ' + str(self.asymmetry)+'\n'+\
+               'In-plane rotation angle: ' + str(self.in_plane_rotation)+'\n'+\
+               'Crystal directions parallel to the Cartesian axes (after rotations):\n'+\
+               '    x || ' + np.array2string(self.crystal_directions[:,0]/np.abs(self.crystal_directions[:,0]).max(),precision=4,suppress_small=True)+'\n'+\
+               '    y || ' + np.array2string(self.crystal_directions[:,1]/np.abs(self.crystal_directions[:,1]).max(),precision=4,suppress_small=True)+'\n'+\
+               '    z || ' + np.array2string(self.crystal_directions[:,2]/np.abs(self.crystal_directions[:,2]).max(),precision=4,suppress_small=True)+'\n\n'+\
+               'Crystal thickness: ' + str(self.thickness)+'\n'+\
+               'Debye-Waller factor: ' + str(self.debye_waller)+'\n\n'+\
+               'Deformation model: ' + deformation_str +'\n'+\
+               'Meridional bending radius: ' + str(self.Rx) +'\n'+\
+               'Sagittal bending radius: ' + str(self.Ry) +'\n'+\
+               'Material elastic isotropy: ' + str(self.isotropy) +'\n' + elastic_str        
\ No newline at end of file
diff --git a/pyTTE/ttscan.py b/pyTTE/ttscan.py
new file mode 100644
index 0000000..1abecea
--- /dev/null
+++ b/pyTTE/ttscan.py
@@ -0,0 +1,219 @@
+# -*- coding: utf-8 -*-
+
+from __future__ import division, print_function
+from .quantity import Quantity
+from numpy import linspace
+
+class TTscan:
+    '''
+    Class containing all the parameters for an energy or angle scan together 
+    with the solver settings. An instance can be initialized either by giving 
+    a path to a file defining the scan parameters, or passing them to the 
+    function as keyword arguments. Keyword parameters are omitted if filepath 
+    given.
+
+    Parameters
+    ----------
+    
+    filepath : str
+        Path to the file with scan and solver parameters
+
+    *OR*
+
+    constant : Quantity of type energy or angle
+        Determines value of the incident photon energy or the incidence angle 
+        w.r.t to the Bragg plane fixed during the scan
+    
+    scan : Quantity of type energy or angle OR int
+        Either a list of scan points wrapped in a Quantity e.g. 
+        Quantity(np.linspace(-100,100,250),'meV') OR a non-negative integer 
+        number of scan points for automatic scan range determination. The unit 
+        of Quantity has to be angle if the unit of constant is energy and vice 
+        versa.
+        
+    polarization : str
+        'sigma' or 's' for sigma-polarized beam OR 'pi' or 'p' for pi-polarized
+        beam
+        
+    (optional keywords)
+        
+    solver : str
+        The solver used to integrate the 1D TT-equation. Currently only 
+        'zvode_bdf' is supported.
+        
+    integration_step : Quantity of type length 
+        Step size of the integrator. For 'zvode_bdf' this is the minimum step. 
+        Default is Quantity(1e-10,'um').
+
+    start_depth : Quantity of type length 
+        An alternative starting point for the integration. Useful for thick 
+        crystals in the Bragg case (not used in the Laue case). To make sense, 
+        this should be between 0 and -thickness.
+
+    output_type : str
+        'intensity' if output reflectivity/diffractivity/transmission are given 
+        in terms of wave intensities or 'photon_flux' in terms of photon fluxes. 
+        Matters only for asymmetric cuts. Default is 'photon_flux'.
+
+    Attributes
+    ----------
+    
+    polarization : str
+    
+    constant : Quantity of type energy or angle
+
+    scan : Quantity of type energy or angle (opposite of constant), or int
+    
+    solver : str
+    
+    integration_step : Quantity of type length
+    
+    start_depth : Quantity of type length
+    
+    output_type : Quantity of type length    
+    '''
+    
+    def __init__(self, filepath = None, **kwargs):
+        params = {}
+
+        if filepath is not None:
+            
+            #####################################
+            #Read crystal parameters from a file#
+            #####################################
+
+            #Overwrite possible kwargs 
+            kwargs = {}
+            
+            with open(filepath,'r') as f:
+               lines = f.readlines()
+
+            #check and parse parameters
+            for line in lines:
+                line = line.strip()
+                if len(line) > 0 and not line[0] == '#':  #skip empty and comment lines
+                    ls = line.split() 
+                    if ls[0] == 'constant' and len(ls) == 3:
+                        kwargs['constant'] = Quantity(float(ls[1]),ls[2])
+                    elif ls[0] == 'scan':
+                        if len(ls) == 5:
+                            kwargs['scan'] = Quantity(linspace(float(ls[1]),float(ls[2]),int(ls[3])),ls[4])
+                        elif len(ls) == 2:
+                            kwargs['scan'] = int(ls[1])
+                        else:
+                            print('Skipped an invalid line in the file: ' + line)
+                    elif ls[0] in ['polarization','solver','output_type'] and len(ls) == 2:
+                        kwargs[ls[0]] = ls[1]
+                    elif ls[0] in ['integration_step','start_depth'] and len(ls) == 3:
+                        kwargs[ls[0]] = Quantity(float(ls[1]),ls[2])
+                    else:
+                        print('Skipped an invalid line in the file: ' + line)
+ 
+        ###################################################
+        #Check the presence of the required crystal inputs#
+        ###################################################
+        
+        try:
+            params['constant']     = kwargs['constant']
+            params['scan']         = kwargs['scan']
+            params['polarization'] = kwargs['polarization']
+        except:
+            raise KeyError('At least one of the required keywords constant, scan, or polarization is missing!')                
+
+        #Optional parameters
+        params['solver']           = kwargs.get('solver','zvode_bdf')
+        params['output_type']           = kwargs.get('output_type','photon_flux')
+        params['integration_step'] = kwargs.get('integration_step', Quantity(1e-10,'um'))
+        params['start_depth']      = kwargs.get('start_depth', None)
+
+
+        self.set_polarization(params['polarization'])
+        self.set_scan(params['scan'], params['constant'])
+        self.set_solver(params['solver'])
+        self.set_output_type(params['output_type'])        
+        self.set_integration_step(params['integration_step'])
+        self.set_start_depth(params['start_depth'])
+
+    def set_polarization(self,polarization):
+        if type(polarization) == type('') and polarization.lower() in ['sigma','s']:
+            self.polarization = 'sigma'
+        elif type(polarization) == type('') and polarization.lower() in ['pi','p']:
+            self.polarization = 'pi'
+        else:
+            raise ValueError("Invalid polarization! Choose either 'sigma' or 'pi'.")       
+
+    def set_scan(self, scan, constant):        
+        if isinstance(constant, Quantity) and constant.type() in ['angle', 'energy']:
+            if constant.type() == 'angle':
+                self.scantype = 'energy'
+            else:
+                self.scantype = 'angle'
+            self.constant = constant.copy()
+        else:
+            raise ValueError('constant has to be an instance of Quantity of type energy or angle!')
+
+        if isinstance(scan, Quantity) and scan.type() == self.scantype:
+            self.scan = ('manual', scan.copy())
+        elif type(scan) == type(1) and scan > 0:
+            self.scan = ('automatic',scan)
+        else:
+            raise ValueError('scan has to be either a Quantity of type energy (for angle constant) or angle (for energy constant) or a non-negative integer!')
+
+    def set_solver(self,solver):
+        if type(solver) == type('') and solver.lower() in ['zvode_bdf']:
+            self.solver = solver.lower()
+        else:
+            raise ValueError("Invalid solver! Currently only 'zvode_bdf' is supported.")    
+
+    def set_output_type(self,output_type):
+        if type(output_type) == type('') and output_type.lower() in ['intensity','photon_flux']:
+            self.output_type = output_type.lower()
+        else:
+            raise ValueError("Invalid output_type! Has to be either 'intensity' or 'photon_flux'.")
+
+    def set_integration_step(self, integration_step):
+        if isinstance(integration_step, Quantity) and integration_step.type() == 'length':
+            if not integration_step.value.size == 1:
+                raise ValueError("Invalid integration step! Only single value is allowed.")
+            self.integration_step = integration_step.copy()
+        else:
+            raise ValueError("Invalid integration step! Has to be an instance of Quantity of type length.")    
+
+    def set_start_depth(self, start_depth):
+        if isinstance(start_depth, Quantity) and start_depth.type() == 'length':
+            if not start_depth.value.size == 1:
+                raise ValueError("Invalid starting step! Only single value is allowed.")
+            self.start_depth = start_depth.copy()
+        elif start_depth == None:
+            self.start_depth = None
+        else:
+            raise ValueError("Invalid starting depth! Has to be an instance of Quantity of type length or None.")    
+
+
+    def __str__(self):
+        
+        if self.scan[0] == 'manual':
+            N_points = self.scan[1].value.size
+            limit_str = 'manual from ' + str(self.scan[1].value.min()) \
+                        + ' to ' + str(self.scan[1].value.max()) + ' ' \
+                        + self.scan[1].units()
+        else:
+            N_points = self.scan[1]
+            limit_str = 'automatic'
+
+        if self.output_type == 'intensity':
+            output_type = 'wave intensity'
+        else:
+            output_type = 'photon flux'
+            
+        return 'Scan type     : ' + self.scantype + '\n' +\
+               'Scan constant : ' + str(self.constant) +'\n' +\
+               'Polarization  : ' + self.polarization  +'\n' +\
+               'Scan points   : ' + str(N_points)  +'\n' +\
+               'Scan range    : ' + limit_str   +'\n\n'+\
+               'Output type                : ' + output_type +'\n' +\
+               'Integrator                 : ' + self.solver + '\n'+\
+               '(Minimum) integration step : ' + str(self.integration_step)+'\n'\
+               'Alternative starting depth : ' + str(self.start_depth)+'\n'    
+
+
diff --git a/setup.py b/setup.py
index f129f93..3fd127d 100755
--- a/setup.py
+++ b/setup.py
@@ -1,6 +1,6 @@
 __author__ = 'Ari-Pekka Honkanen'
 __license__ = 'MIT'
-__date__ = '17/11/2017'
+__date__ = '2020-04-30'
 
 from setuptools import setup
 #
@@ -10,19 +10,19 @@
 
 
 setup(name='pyTTE',
-      version='0.1.11',
-      description='Package to compute X-ray diffraction curves of bent crystals by numerically solving the Takagi-Taupin equations.',
+      version='1.0',
+      description='Package to compute X-ray diffraction curves of bent crystals by numerically solving the 1D Takagi-Taupin equation.',
       author='Ari-Pekka Honkanen',
       author_email='honkanen.ap@gmail.com',
       url='https://github.com/aripekka/pyTTE/',
       packages=[
                 'pyTTE',
-                'pyTTE.examples',
                ],
       install_requires=[
-                        'numpy',
-                        'scipy',
-                        'matplotlib'
+                        'numpy>=1.16.6',
+                        'scipy>=1.2.1',
+                        'multiprocess>=0.70.9',
+                        'matplotlib>=2.2.3',
                        ],
       include_package_data=True,
 )


Test patch:
diff --git a/python2_test_environment.txt b/python2_test_environment.txt
new file mode 100644
index 0000000..ea72930
--- /dev/null
+++ b/python2_test_environment.txt
@@ -0,0 +1,117 @@
+# Python2 Anaconda test environment on Win 10
+#
+# Name                    Version                   Build  Channel
+atomicwrites              1.3.0                    py27_1
+attrs                     19.3.0                     py_0
+backports                 1.0                        py_2
+backports.functools_lru_cache 1.6.1                      py_0
+backports.shutil_get_terminal_size 1.0.0                    py27_2
+backports.shutil_which    3.5.2                    py27_0
+backports_abc             0.5              py27h0ec6b72_0
+blas                      1.0                         mkl
+bleach                    3.1.4                      py_0
+ca-certificates           2020.1.1                      0
+certifi                   2019.11.28               py27_0
+colorama                  0.4.3                      py_0
+configparser              4.0.2                    py27_0
+contextlib2               0.6.0.post1                py_0
+cycler                    0.10.0           py27h59acbbf_0
+decorator                 4.4.2                      py_0
+defusedxml                0.6.0                      py_0
+dill                      0.3.1.1                  pypi_0    pypi
+entrypoints               0.3                      py27_0
+enum34                    1.1.6                    py27_1
+freetype                  2.9.1                h4d385ea_1
+funcsigs                  1.0.2            py27h8885ae1_0
+functools32               3.2.3.2                  py27_1
+futures                   3.3.0                    py27_0
+icc_rt                    2019.0.0             h0cc432a_1
+icu                       58.2                 h2aa20d9_1
+importlib_metadata        1.3.0                    py27_0
+intel-openmp              2020.0                      166
+ipaddress                 1.0.23                     py_0
+ipykernel                 4.10.0                   py27_0
+ipython                   5.8.0                    py27_0
+ipython_genutils          0.2.0                    py27_0
+ipywidgets                7.5.1                      py_0
+jinja2                    2.11.2                     py_0
+jpeg                      9b                   ha175dff_2
+jsonschema                3.2.0                    py27_0
+jupyter                   1.0.0                    py27_7
+jupyter_client            5.3.4                    py27_0
+jupyter_console           5.2.0                    py27_1
+jupyter_core              4.6.1                    py27_0
+kiwisolver                1.1.0            py27hc56fc5f_0
+libpng                    1.6.37               h7a46e7a_0
+libsodium                 1.0.16               h8b3e59e_0
+m2w64-gcc-libgfortran     5.3.0                         6
+m2w64-gcc-libs            5.3.0                         7
+m2w64-gcc-libs-core       5.3.0                         7
+m2w64-gmp                 6.1.0                         2
+m2w64-libwinpthread-git   5.0.0.4634.697f757               2
+markupsafe                1.1.1            py27h0c8e037_0
+matplotlib                2.2.3            py27h263d877_0
+mistune                   0.8.4            py27h0c8e037_0
+mkl                       2020.0                      166
+mkl-service               2.3.0            py27h0b88c2a_0
+mkl_fft                   1.0.15           py27h44c1dab_0
+more-itertools            5.0.0                    py27_0
+msys2-conda-epoch         20160418                      1
+multiprocess              0.70.9                   pypi_0    pypi
+nbconvert                 5.6.1                    py27_0
+nbformat                  4.4.0                    py27_0
+notebook                  5.7.8                    py27_0
+numpy                     1.16.6           py27hcd21bde_0
+numpy-base                1.16.6           py27hb1d0314_0
+openssl                   1.0.2u               h0c8e037_0
+packaging                 20.3                       py_0
+pandoc                    2.2.3.2                       0
+pandocfilters             1.4.2                    py27_1
+pathlib2                  2.3.5                    py27_0
+pickleshare               0.7.5                    py27_0
+pip                       19.3.1                   py27_0
+pluggy                    0.13.1                   py27_0
+prometheus_client         0.7.1                      py_0
+prompt_toolkit            1.0.15           py27h3a8ec6a_0
+py                        1.8.1                      py_0
+pygments                  2.5.2                      py_0
+pyparsing                 2.4.6                      py_0
+pyqt                      5.6.0            py27h6e61f57_6
+pyrsistent                0.15.6           py27h0c8e037_0
+pytest                    4.6.2                    py27_0
+python                    2.7.18               hfb89ab9_0
+python-dateutil           2.8.1                      py_0
+python_abi                2.7                     1_cp27m    conda-forge
+pytz                      2019.3                     py_0
+pywin32                   227              py27h0c8e037_1
+pywinpty                  0.5.5                 py27_1000
+pyzmq                     18.1.0           py27hc56fc5f_0
+qt                        5.6.2            vc9hc26998b_12
+qtconsole                 4.7.3                      py_0
+qtpy                      1.9.0                      py_0
+scandir                   1.10.0           py27h0c8e037_0
+scipy                     1.2.1            py27h4c3ab11_0
+send2trash                1.5.0                    py27_0
+setuptools                44.0.0                   py27_0
+simplegeneric             0.8.1                    py27_2
+singledispatch            3.4.0.3          py27h3f9d112_0
+sip                       4.18.1           py27hc56fc5f_2
+six                       1.13.0                   py27_0
+sqlite                    3.30.1               h0c8e037_0
+terminado                 0.8.3                    py27_0
+testpath                  0.4.4                      py_0
+tornado                   5.1.1            py27h0c8e037_0
+traitlets                 4.3.3                    py27_0
+vc                        9                    h7299396_1
+vs2008_runtime            9.00.30729.1         hfaea7d5_1
+wcwidth                   0.1.9                      py_0
+webencodings              0.5.1                    py27_1
+wheel                     0.33.6                   py27_0
+widgetsnbextension        3.5.1                    py27_0
+win_unicode_console       0.5              py27hc037021_0
+wincertstore              0.2              py27hf04cefb_0
+winpty                    0.4.3                         4
+xraylib                   4.0.0            py27h6049954_0    conda-forge
+zeromq                    4.3.1                h2880e7c_3
+zipp                      0.6.0                      py_0
+zlib                      1.2.11               h3cc03e0_3
diff --git a/python3_test_environment.txt b/python3_test_environment.txt
new file mode 100644
index 0000000..6eeb5a7
--- /dev/null
+++ b/python3_test_environment.txt
@@ -0,0 +1,120 @@
+#Python 3 Anaconda test environment on Win 10
+#
+# Name                    Version                   Build  Channel
+atomicwrites              1.3.0                      py_0
+attrs                     19.3.0                     py_0
+backcall                  0.1.0                    py38_0
+blas                      1.0                         mkl
+bleach                    3.1.4                      py_0
+brotlipy                  0.7.0           py38h1e8a9f7_1000    conda-forge
+ca-certificates           2020.4.5.1           hecc5488_0    conda-forge
+certifi                   2020.4.5.1       py38h32f6830_0    conda-forge
+cffi                      1.14.0           py38ha419a9e_0    conda-forge
+chardet                   3.0.4           py38h32f6830_1006    conda-forge
+colorama                  0.4.3                      py_0
+cryptography              2.9.2            py38hba49e27_0    conda-forge
+cycler                    0.10.0                   py38_0
+decorator                 4.4.2                      py_0
+defusedxml                0.6.0                      py_0
+dill                      0.3.1.1          py38h32f6830_1    conda-forge
+entrypoints               0.3                      py38_0
+freetype                  2.9.1                ha9979f8_1
+icc_rt                    2019.0.0             h0cc432a_1
+icu                       58.2                 ha925a31_3
+idna                      2.9                        py_1    conda-forge
+importlib_metadata        1.5.0                    py38_0
+intel-openmp              2020.0                      166
+ipykernel                 5.1.4            py38h39e3cac_0
+ipython                   7.13.0           py38h5ca1d4c_0
+ipython_genutils          0.2.0                    py38_0
+ipywidgets                7.5.1                      py_0
+jedi                      0.16.0                   py38_1
+jinja2                    2.11.2                     py_0
+jpeg                      9b                   hb83a4c4_2
+json5                     0.9.0                      py_0    conda-forge
+jsonschema                3.2.0                    py38_0
+jupyter                   1.0.0                    py38_7
+jupyter_client            6.1.2                      py_0
+jupyter_console           6.1.0                      py_0
+jupyter_core              4.6.3                    py38_0
+jupyterlab                2.1.1                      py_0    conda-forge
+jupyterlab_server         1.1.1                      py_0    conda-forge
+kiwisolver                1.0.1            py38ha925a31_0
+libpng                    1.6.37               h2a8f88b_0
+libsodium                 1.0.16               h9d3ae62_0
+m2w64-gcc-libgfortran     5.3.0                         6
+m2w64-gcc-libs            5.3.0                         7
+m2w64-gcc-libs-core       5.3.0                         7
+m2w64-gmp                 6.1.0                         2
+m2w64-libwinpthread-git   5.0.0.4634.697f757               2
+markupsafe                1.1.1            py38he774522_0
+matplotlib                3.1.3                    py38_0
+matplotlib-base           3.1.3            py38h64f37c6_0
+mistune                   0.8.4           py38he774522_1000
+mkl                       2020.0                      166
+mkl-service               2.3.0            py38hb782905_0
+mkl_fft                   1.0.15           py38h14836fe_0
+mkl_random                1.1.0            py38hf9181ef_0
+more-itertools            8.2.0                      py_0
+msys2-conda-epoch         20160418                      1
+multiprocess              0.70.9           py38h9de7a3e_1    conda-forge
+nbconvert                 5.6.1                    py38_0
+nbformat                  5.0.4                      py_0
+notebook                  6.0.3                    py38_0
+numpy                     1.18.1           py38h93ca92e_0
+numpy-base                1.18.1           py38hc3f5095_1
+openssl                   1.1.1g               he774522_0    conda-forge
+packaging                 20.3                       py_0
+pandoc                    2.2.3.2                       0
+pandocfilters             1.4.2                    py38_1
+parso                     0.6.2                      py_0
+pickleshare               0.7.5                 py38_1000
+pip                       20.0.2                   py38_1
+pluggy                    0.13.1                   py38_0
+prometheus_client         0.7.1                      py_0
+prompt-toolkit            3.0.4                      py_0
+prompt_toolkit            3.0.4                         0
+py                        1.8.1                      py_0
+pycparser                 2.20                       py_0    conda-forge
+pygments                  2.6.1                      py_0
+pyopenssl                 19.1.0                     py_1    conda-forge
+pyparsing                 2.4.6                      py_0
+pyqt                      5.9.2            py38ha925a31_4
+pyreadline                2.1                   py38_1001    conda-forge
+pyrsistent                0.16.0           py38he774522_0
+pysocks                   1.7.1            py38h32f6830_1    conda-forge
+pytest                    5.4.1                    py38_0
+python                    3.8.2               h5fd99cc_11
+python-dateutil           2.8.1                      py_0
+python_abi                3.8                      1_cp38    conda-forge
+pywin32                   227              py38he774522_1
+pywinpty                  0.5.7                    py38_0
+pyzmq                     18.1.1           py38ha925a31_0
+qt                        5.9.7            vc14h73c81de_0
+qtconsole                 4.7.3                      py_0
+qtpy                      1.9.0                      py_0
+requests                  2.23.0             pyh8c360ce_2    conda-forge
+scipy                     1.4.1            py38h9439919_0
+send2trash                1.5.0                    py38_0
+setuptools                46.1.3                   py38_0
+sip                       4.19.13          py38ha925a31_0
+six                       1.14.0                   py38_0
+sqlite                    3.31.1               h2a8f88b_1
+terminado                 0.8.3                    py38_0
+testpath                  0.4.4                      py_0
+tornado                   6.0.4            py38he774522_1
+traitlets                 4.3.3                    py38_0
+urllib3                   1.25.9                     py_0    conda-forge
+vc                        14.1                 h0510ff6_4
+vs2015_runtime            14.16.27012          hf0eaf9b_1
+wcwidth                   0.1.9                      py_0
+webencodings              0.5.1                    py38_1
+wheel                     0.34.2                   py38_0
+widgetsnbextension        3.5.1                    py38_0
+win_inet_pton             1.1.0                    py38_0    conda-forge
+wincertstore              0.2                      py38_0
+winpty                    0.4.3                         4
+xraylib                   4.0.0            py38h6049954_0    conda-forge
+zeromq                    4.3.1                h33f27b4_3
+zipp                      2.2.0                      py_0
+zlib                      1.2.11               h62dcd97_4
diff --git a/tests/test_deformation.py b/tests/test_deformation.py
new file mode 100644
index 0000000..208dae9
--- /dev/null
+++ b/tests/test_deformation.py
@@ -0,0 +1,155 @@
+# -*- coding: utf-8 -*-
+
+'''
+Tests for the deformation functions. Run with pytest.
+'''
+
+import sys
+import os.path
+
+sys.path.insert(1, os.path.join(os.path.dirname(__file__),'..'))
+
+from pyTTE.deformation import *
+import numpy as np
+
+E = 165
+nu = 0.27
+
+#isotropic S
+S = np.zeros((6,6))
+S[0,0] = 1
+S[1,1] = 1
+S[2,2] = 1
+S[3,3] = 2*(1+nu)
+S[4,4] = 2*(1+nu)
+S[5,5] = 2*(1+nu)
+S[0,1] = -nu
+S[0,2] = -nu
+S[1,2] = -nu
+S[1,0] = -nu
+S[2,0] = -nu
+S[2,1] = -nu
+S = S/E
+
+def test_isotropic_R_input():    
+    #test R1, R2
+    
+    #These should work
+    for R in [1.0,2,-.5]:
+        J,R1,R2 = isotropic_plate(R,1,nu,1e-4)
+        J,_, R2 = isotropic_plate(1,R,nu,1e-4)
+        assert R1 == R
+        assert R2 == R
+        
+    for R in ['inf', '-inf',float('inf'),np.inf,-np.inf]:
+        J,R1,R2 = isotropic_plate(R,1,nu,1e-4)
+        J,_, R2 = isotropic_plate(1,R,nu,1e-4)
+        assert R1 == 'inf'
+        assert R2 == 'inf'
+        
+    for R in [None]:
+        J,R1,R2 = isotropic_plate(R,1,nu,1e-4)
+        J,_, R2 = isotropic_plate(1,R,nu,1e-4)
+        assert R1 == -1/0.27
+        assert R2 == -1/0.27
+    
+    #These should fail
+    for R in ['sdsd',0,'2']:
+        all_pass = True
+        try:
+            J,R1,R2 = isotropic_plate(R,1,nu,1e-4)
+            all_pass = False
+        except:
+            pass            
+        try:            
+            J,_, R2 = isotropic_plate(1,R,nu,1e-4)                        
+            all_pass = False
+        except:
+            pass
+
+def test_anisotropic_fixed_torque_R_input():    
+    #test R1, R2
+    
+    #These should work
+    for R in [1.0,2,-.5]:
+        J,R1,R2 = anisotropic_plate_fixed_torques(R,1,S,1e-4)
+        J,_, R2 = anisotropic_plate_fixed_torques(1,R,S,1e-4)
+        assert R1 == R
+        assert R2 == R
+        
+    for R in ['inf', '-inf',float('inf'),np.inf,-np.inf]:
+        J,R1,R2 = anisotropic_plate_fixed_torques(R,1,S,1e-4)
+        J,_, R2 = anisotropic_plate_fixed_torques(1,R,S,1e-4)
+        assert R1 == 'inf'
+        assert R2 == 'inf'
+        
+    for R in [None]:
+        J,R1,R2 = anisotropic_plate_fixed_torques(R,1,S,1e-4)
+        J,_, R2 = anisotropic_plate_fixed_torques(1,R,S,1e-4)
+        assert R1 == -1/0.27
+        assert R2 == -1/0.27
+    
+    #These should fail
+    for R in ['sdsd',0,'2']:
+        all_pass = True
+        try:
+            J,R1,R2 = anisotropic_plate_fixed_torques(R,1,S,1e-4)
+            all_pass = False
+        except:
+            pass            
+        try:            
+            J,_, R2 = anisotropic_plate_fixed_torques(1,R,S,1e-4)                        
+            all_pass = False
+        except:
+            pass
+
+def test_anisotropic_fixed_shape_R_input():    
+    #test R1, R2
+    
+    #These should work
+    for R in [1.0,2,-.5]:
+        J,R1,R2 = anisotropic_plate_fixed_shape(R,1,S,1e-4)
+        J,_,R2 = anisotropic_plate_fixed_shape(1,R,S,1e-4)
+        assert R1 == R
+        assert R2 == R
+        
+    for R in ['inf', '-inf',float('inf'),np.inf,-np.inf]:
+        J,R1,R2 = anisotropic_plate_fixed_shape(R,1,S,1e-4)
+        J,_,R2 = anisotropic_plate_fixed_shape(1,R,S,1e-4)
+        assert R1 == 'inf'
+        assert R2 == 'inf'
+        
+    #These should fail
+    for R in ['sdsd',0,'2',None]:
+        all_pass = True
+        try:
+            J = anisotropic_plate_fixed_shape(R,1,S,1e-4)
+            all_pass = False
+        except:
+            pass            
+        try:            
+            J = anisotropic_plate_fixed_shape(1,R,S,1e-4)                        
+            all_pass = False
+        except:
+            pass
+
+def test_consistency():
+    #The models should give the same Jacobian for the same isotropic input and
+    
+    x = np.linspace(-1e-4,1e-4,101)
+    z = np.flipud(np.linspace(-1e-4,1e-4,101))
+    
+    meps = np.finfo(float).eps
+    
+    for Rs in [(1,1),(-1,1),(2,0.5),(1,'inf'),('inf','inf')]:
+        J1 = isotropic_plate(Rs[0],Rs[1],nu,1e-4)[0]
+        J2 = anisotropic_plate_fixed_torques(Rs[0],Rs[1],S,1e-4)[0]
+        J3 = anisotropic_plate_fixed_shape(Rs[0],Rs[1],S,1e-4)[0]
+        
+        for i in range(x.size):
+            J1i = np.array(J1(x[i],z[i]))
+            J2i = np.array(J2(x[i],z[i]))
+            J3i = np.array(J3(x[i],z[i]))     
+            
+            assert np.all(np.abs(J1i-J2i) < meps), J1i-J2i
+            assert np.all(np.abs(J1i-J3i) < meps), J1i-J3i
diff --git a/tests/test_ttcrystal.py b/tests/test_ttcrystal.py
new file mode 100644
index 0000000..81d3f6c
--- /dev/null
+++ b/tests/test_ttcrystal.py
@@ -0,0 +1,154 @@
+# -*- coding: utf-8 -*-
+
+'''
+Tests for the TTcrystal class. Run with pytest.
+'''
+
+import sys
+import os.path
+
+sys.path.insert(1, os.path.join(os.path.dirname(__file__),'..'))
+
+from pyTTE import TTcrystal, Quantity
+import numpy as np
+
+
+def test_init_required_inputs():
+    #Tries to initialize with correct and incorrect mandatory inputs
+
+    #Test that all the inputs are required    
+    try:
+        TTcrystal()
+        assert False
+    except KeyError as e:
+        assert True
+
+    try:
+        TTcrystal(crystal='Si')
+        assert False
+    except KeyError as e:
+        assert True
+
+    try:
+        TTcrystal(crystal='Si',hkl=[1,1,1])
+        assert False
+    except KeyError as e:
+        assert True
+
+    #Correct input
+    try:
+        TTcrystal(crystal='Si', hkl=[1,1,1], thickness=Quantity(100,'um'))
+        assert True
+    except KeyError as e:
+        assert False
+          
+    #Check that the input types are checked
+    try:
+        TTcrystal(crystal=23,hkl=[1,1,1], thickness=Quantity(100,'um'))
+        assert False
+    except ValueError as e:
+        assert True    
+
+    try:
+        TTcrystal(crystal='Si',hkl='abc', thickness=Quantity(100,'um'))
+        assert False
+    except ValueError as e:
+        assert True    
+
+    try:
+        TTcrystal(crystal='Si',hkl=[1,1,1], thickness=100)
+        assert False
+    except ValueError as e:
+        assert True    
+
+def test_init_optional_inputs():
+
+    #the first elements in the tuple are valid inputs and the second are  invalid 
+    opt_inputs = {
+                  'asymmetry' : ([Quantity(5,'deg')], [598, Quantity(-5,'keV')]),
+                  'in_plane_rotation' : ([Quantity(-5,'deg'), [-1,1,1], (0,1,0), np.array([-1,1,1])], [598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1])]),
+                  'debye_waller' : ([0,0.5,1], [-1, 598, Quantity(-5,'keV'), [1,'1',2]]),
+                  'Rx' : ([Quantity(1,'m'), Quantity(-50,'cm'),'inf',None], [598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1])]),
+                  'Ry' : ([Quantity(1,'m'), Quantity(-50,'cm'),'inf',None], [598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1])]),
+                  'R' : ([Quantity(1,'m'), Quantity(-50,'cm'),'inf',None], [598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1])]),
+                  'fix_to_axes' : (['shape', 'torques'], [Quantity(1,'m'), Quantity(-50,'cm'),'inf',None, 598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1])]),
+    }
+    #Elastic constants E, nu and S are tested in a separate function
+    
+    for k in opt_inputs:
+        for i in range(1, len(opt_inputs[k][0])):
+            kwargs_valid = {'crystal':'Ge', 'hkl' : [7,5,1], 'thickness' : Quantity(1,'mm')}
+            kwargs_valid[k] = opt_inputs[k][0][i]
+
+            try:
+                TTcrystal(**kwargs_valid)
+                assert True
+            except ValueError as e:
+                assert False
+
+        for i in range(1, len(opt_inputs[k][1])):
+            kwargs_invalid = {'crystal':'Ge', 'hkl' : [7,5,1], 'thickness' : Quantity(1,'mm')}
+            kwargs_invalid[k] = opt_inputs[k][1][i]
+
+            try:
+                TTcrystal(**kwargs_invalid)
+                assert False
+            except ValueError as e:
+                assert True    
+        
+def test_input_set_correctly():
+    #TODO: all the optional inputs
+    #Check that the inputs are correctly read
+    xtal = TTcrystal(crystal='Si', hkl=[1,-2,3], thickness=Quantity(100,'um'))
+
+    assert xtal.crystal_data['name'] == 'Si'
+    assert xtal.hkl[0] == 1
+    assert xtal.hkl[1] == -2
+    assert xtal.hkl[2] == 3
+    assert xtal.thickness.value == 100
+    
+def test_changing_parameters():
+    xtal = TTcrystal(crystal='Si', hkl=[1,-2,3], thickness=Quantity(100,'um'))
+    
+    xtal.set_crystal('Ge')
+    assert xtal.crystal_data['name'] == 'Ge'
+
+    xtal.set_reflection([6,6,0])
+    assert xtal.hkl[0] == 6
+    assert xtal.hkl[1] == 6
+    assert xtal.hkl[2] == 0
+
+    xtal.set_thickness(Quantity(500,'um'))
+    assert xtal.thickness.value == 500
+
+def test_bragg_energy_and_bragg_angle():
+
+    xtal = TTcrystal(crystal='Si', hkl=[6,6,0], thickness=Quantity(100,'um'))
+    
+    #Check that the functions are invertible
+    energy = Quantity(np.array([10,20,100]), 'keV')
+    angle  = Quantity(np.array([90,75,25]), 'deg')
+    
+    meps = np.finfo(np.float).eps #machine epsilon
+    meps = meps*2 #There is apparently some accumulation in numerical errors why the inversion is not inside the machine epsilon
+    
+    assert np.all(np.abs(xtal.bragg_energy(xtal.bragg_angle(energy)).in_units('keV') - energy.in_units('keV'))/energy.in_units('keV') < meps)
+    assert np.all(np.abs(xtal.bragg_angle(xtal.bragg_energy(angle)).in_units('deg') - angle.in_units('deg'))/angle.in_units('deg') < meps)
+    
+    #invalid inputs
+    wrong_angle  = [Quantity(-1, 'deg'),Quantity(190, 'deg'),Quantity(80, 'keV')]
+    wrong_energy = [Quantity(-1, 'keV'),Quantity(0.1, 'keV'),Quantity(80, 'deg')]
+    
+    for wa in wrong_angle:
+        try:
+            xtal.bragg_energy(wa)
+            assert False
+        except (TypeError, ValueError):
+            pass
+
+    for we in wrong_energy:
+        try:
+            xtal.bragg_angle(we)
+            assert False
+        except (TypeError, ValueError):
+            pass
\ No newline at end of file
diff --git a/tests/test_ttscan.py b/tests/test_ttscan.py
new file mode 100644
index 0000000..213d4a1
--- /dev/null
+++ b/tests/test_ttscan.py
@@ -0,0 +1,116 @@
+# -*- coding: utf-8 -*-
+
+'''
+Tests for the TTcrystal class. Run with pytest.
+'''
+
+import sys
+import os.path
+
+sys.path.insert(1, os.path.join(os.path.dirname(__file__),'..'))
+
+from pyTTE import TTscan, Quantity
+import numpy as np
+
+def test_required_input():
+    #Test that all the inputs are required    
+    try:
+        TTscan()
+        assert False
+    except KeyError as e:
+        assert True
+
+    try:
+        TTscan(constant=Quantity(8,'keV'))
+        assert False
+    except KeyError as e:
+        assert True
+
+    try:
+        TTscan(constant=Quantity(8,'keV'), scan=Quantity(np.linspace(-100,100,100),'urad'))
+        assert False
+    except KeyError as e:
+        assert True
+
+    #Correct input
+    try:
+        TTscan(constant=Quantity(8,'keV'), scan=Quantity(np.linspace(-100,100,100),'urad'),polarization='pi')
+        assert True
+    except KeyError as e:
+        assert False
+
+def test_energy_scan():    
+
+    for p in ['s','sigma','p','pi']: 
+        #These should work
+        scan = [Quantity(np.linspace(-100,100,100),'meV'), Quantity(np.linspace(-1,1,10),'eV'), 100, 1]        
+        for s in scan:        
+            try:
+                TTscan(constant=Quantity(85,'deg'), scan=s,polarization=p)
+                assert True
+            except ValueError as e:
+                assert False
+        #These should not
+        scan = [Quantity(np.linspace(-100,100,100),'urad'), Quantity(np.linspace(-1,1,10),'arcsec'), [12, 23], np.array([12, 23]), 'str', -100, 0]        
+        for s in scan:                
+            try:
+                TTscan(constant=Quantity(85,'deg'), scan=s,polarization=p)
+                assert False
+            except ValueError as e:
+                assert True
+
+def test_angle_scan():    
+
+    for p in ['s','sigma','p','pi']: 
+        #These should work
+        scan = [Quantity(np.linspace(-100,100,100),'urad'), Quantity(np.linspace(-1,1,10),'arcsec'), 100, 1]        
+        for s in scan:        
+            try:
+                TTscan(constant=Quantity(8.5,'keV'), scan=s,polarization=p)
+                assert True
+            except ValueError as e:
+                assert False
+        #These should not
+        scan = [Quantity(np.linspace(-100,100,100),'meV'), Quantity(np.linspace(-1,1,10),'eV'), -100, 0, [12, 23], np.array([12, 23]), 'str', -100, 0]        
+        for s in scan:                
+            try:
+                TTscan(constant=Quantity(8.5,'keV'), scan=s,polarization=p)
+                assert False
+            except ValueError as e:
+                assert True                
+                
+def test_optional_parameters():    
+            
+    #the first elements in the tuple are valid inputs and the second are  invalid 
+    opt_inputs = {
+                  'solver' : (['zvode_bdf'], [598, Quantity(-5,'keV'),'asds',None]),
+                  'output_type' : (['intensity', 'photon_flux'], [598, Quantity(-5,'keV'),'asds',None]),        
+                  'integration_step' : ([Quantity(1,'um'), Quantity(-1,'mm')], [598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1]), None, Quantity(np.array([1,2,3]),'keV')]),
+                  'start_depth' : ([Quantity(1,'um'), Quantity(-1,'mm'), None], [598, Quantity(-5,'keV'), [1,'1',2], np.array([-1,1]), Quantity(np.array([1,2,3]),'keV')]),
+                 }
+    
+    
+    #Elastic constants E, nu and S are tested in a separate function
+    
+    for k in opt_inputs:
+        for i in range(1, len(opt_inputs[k][0])):
+            kwargs_valid = {'constant' : Quantity(8,'keV'), 'scan' : Quantity(np.linspace(-100,100,100),'urad'), 'polarization' : 'pi'}
+            kwargs_valid[k] = opt_inputs[k][0][i]
+
+            try:
+                TTscan(**kwargs_valid)
+                assert True
+            except ValueError as e:
+                assert False
+
+        for i in range(1, len(opt_inputs[k][1])):
+            kwargs_invalid = {'constant' : Quantity(8,'keV'), 'scan' : Quantity(np.linspace(-100,100,100),'urad'), 'polarization' : 'pi'}
+            kwargs_invalid[k] = opt_inputs[k][1][i]
+            print(k)
+            print(opt_inputs[k][1][i])
+
+            try:
+                TTscan(**kwargs_invalid)
+                assert False
+            except ValueError as e:
+                assert True