Skip to content
Snippets Groups Projects
Commit c53ee1c5 authored by Wuttke, Joachim's avatar Wuttke, Joachim
Browse files

[i229] Doc: hugo now using Examples from top-level source directory (Closes #229)

Merging branch 'i229'  into 'main'.

See merge request !726
parents 61c25261 edc8566a
No related branches found
No related tags found
1 merge request!726Doc: hugo now using Examples from top-level source directory
Pipeline #59090 passed
Showing
with 37 additions and 37 deletions
...@@ -21,6 +21,8 @@ PygmentsStyle = "vs" ...@@ -21,6 +21,8 @@ PygmentsStyle = "vs"
url_userapi = "https://bornagainproject.org/ext/api/git-main/user-API" url_userapi = "https://bornagainproject.org/ext/api/git-main/user-API"
version_mm = "git-main" version_mm = "git-main"
version_mmp = "1.19.0" version_mmp = "1.19.0"
version_repo = "main"
url_blob = "https://jugit.fz-juelich.de/mlz/bornagain/-/blob"
manual_version = "1.7.2" manual_version = "1.7.2"
recommended_python_major = "3" recommended_python_major = "3"
recommended_python_minor = "9" recommended_python_minor = "9"
......
...@@ -16,4 +16,4 @@ Here we are simulating cylinders on top of a substrate without interference. The ...@@ -16,4 +16,4 @@ Here we are simulating cylinders on top of a substrate without interference. The
The radius and height of the cylinders are passed to the function constructing the multi layer The radius and height of the cylinders are passed to the function constructing the multi layer
while the scale and background values are used to initialize the instrument. while the scale and background values are used to initialize the instrument.
{{< highlightfile file="/static/files/python/fitting/ex02_AdvancedExamples/find_background.py" language="python" >}} {{< highlightfile file="Examples/fit52_Advanced/find_background.py" >}}
...@@ -19,4 +19,4 @@ Technically, the idea is to mask the whole detector except thin lines, one verti ...@@ -19,4 +19,4 @@ Technically, the idea is to mask the whole detector except thin lines, one verti
{{< figscg src="fit_along_slices.png" width="600px" caption="Fit window">}} {{< figscg src="fit_along_slices.png" width="600px" caption="Fit window">}}
{{< /galleryscg >}} {{< /galleryscg >}}
{{< highlightfile file="/static/files/python/fitting/ex02_AdvancedExamples/fit_along_slices.py" language="python" >}} {{< highlightfile file="Examples/fit52_Advanced/fit_along_slices.py" >}}
...@@ -22,4 +22,4 @@ where `Rectangle` is related to the shape of the mask in detector coordinates, ` ...@@ -22,4 +22,4 @@ where `Rectangle` is related to the shape of the mask in detector coordinates, `
{{< figscg src="fit_with_masks.png" width="600px" caption="Fit window">}} {{< figscg src="fit_with_masks.png" width="600px" caption="Fit window">}}
{{< /galleryscg >}} {{< /galleryscg >}}
{{< highlightfile file="/static/files/python/fitting/ex02_AdvancedExamples/fit_with_masks.py" language="python" >}} {{< highlightfile file="Examples/fit52_Advanced/fit_with_masks.py" >}}
...@@ -21,4 +21,4 @@ To do this, we define one dataset (a pair of real data and corresponding simulat ...@@ -21,4 +21,4 @@ To do this, we define one dataset (a pair of real data and corresponding simulat
{{< figscg src="multiple_datasets.png" width="600px" caption="Fit window">}} {{< figscg src="multiple_datasets.png" width="600px" caption="Fit window">}}
{{< /galleryscg >}} {{< /galleryscg >}}
{{< highlightfile file="/static/files/python/fitting/ex02_AdvancedExamples/multiple_datasets.py" language="python" >}} {{< highlightfile file="Examples/fit52_Advanced/multiple_datasets.py" >}}
...@@ -11,4 +11,4 @@ This example demonstrates how to run two fits one after the other using differen ...@@ -11,4 +11,4 @@ This example demonstrates how to run two fits one after the other using differen
* During the first (started at line 101) fit we are setting the initial values of the fit parameters to be quite far from the expected values and use a genetic minimizer to explore a large parameter space. * During the first (started at line 101) fit we are setting the initial values of the fit parameters to be quite far from the expected values and use a genetic minimizer to explore a large parameter space.
* The second fit at line 112 starts from the best parameter values found in the previous step and uses one of the gradient descent algorithms to find the precise location of the minimum. * The second fit at line 112 starts from the best parameter values found in the previous step and uses one of the gradient descent algorithms to find the precise location of the minimum.
{{< highlightfile file="/static/files/python/fitting/ex01_BasicExamples/consecutive_fitting.py" language="python" >}} {{< highlightfile file="Examples/fit51_Basic/consecutive_fitting.py" >}}
...@@ -24,4 +24,4 @@ print(ba.MinimizerFactory().catalogueDetailsToString()) ...@@ -24,4 +24,4 @@ print(ba.MinimizerFactory().catalogueDetailsToString())
For more information, see the For more information, see the
[minimizer settings tutorial]({{% ref-py "fitting/minimizers/index.md" %}}). [minimizer settings tutorial]({{% ref-py "fitting/minimizers/index.md" %}}).
{{< highlightfile file="/static/files/python/fitting/ex01_BasicExamples/minimizer_settings.py" language="python" >}} {{< highlightfile file="Examples/fit51_Basic/minimizer_settings.py" >}}
...@@ -20,4 +20,4 @@ This is done by defining our own `MyObjective` class at line 14. It is derived f ...@@ -20,4 +20,4 @@ This is done by defining our own `MyObjective` class at line 14. It is derived f
Later in the code, the `MyObjective.evaluate_residual` function is used to setup a custom objective function for the minimizer (line 116). Later in the code, the `MyObjective.evaluate_residual` function is used to setup a custom objective function for the minimizer (line 116).
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/custom_objective_function/custom_objective_function.py" language="python" >}} {{< highlightfile file="Examples/fit53_CustomObjective/custom_objective_function.py" >}}
...@@ -5,7 +5,7 @@ weight = 30 ...@@ -5,7 +5,7 @@ weight = 30
## Experiment at GALAXI ## Experiment at GALAXI
This is an example of a real data fit. We use our own measurements performed at the laboratory diffractometer [GALAXI](http://www.fz-juelich.de/jcns/jcns-2//DE/Leistungen/GALAXI/_node.html) in Forschungszentrum Jülich. This is an example of a real data fit. We use our own measurements performed at the laboratory diffractometer [GALAXI](http://www.fz-juelich.de/jcns/jcns-2//DE/Leistungen/GALAXI/_node.html) in Forschungszentrum Jülich.
{{< galleryscg >}} {{< galleryscg >}}
{{< figscg src="FitGALAXIData_setup.jpg" width="350px" caption="Real-space model">}} {{< figscg src="FitGALAXIData_setup.jpg" width="350px" caption="Real-space model">}}
...@@ -17,7 +17,7 @@ This is an example of a real data fit. We use our own measurements performed at ...@@ -17,7 +17,7 @@ This is an example of a real data fit. We use our own measurements performed at
* The sample is generated with the help of a `SampleBuilder`, which is able to create samples depending on parameters defined in the constructor and passed through to the `create_sample` method. * The sample is generated with the help of a `SampleBuilder`, which is able to create samples depending on parameters defined in the constructor and passed through to the `create_sample` method.
* The nanoparticles have a broad log-normal size distribution. * The nanoparticles have a broad log-normal size distribution.
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/experiment_at_galaxi/sample_builder.py" language="python" >}} {{< highlightfile file="Examples/fit61_Galaxi/sample_builder.py" >}}
<hr> <hr>
...@@ -27,4 +27,4 @@ This is an example of a real data fit. We use our own measurements performed at ...@@ -27,4 +27,4 @@ This is an example of a real data fit. We use our own measurements performed at
* The real data is loaded from a tiff file into a histogram representing the detector's channels. * The real data is loaded from a tiff file into a histogram representing the detector's channels.
* The `run_fitting()` function contains the initialization of the fitting kernel: loading experimental data, assignment of fit pair, fit parameters selection (line 62). * The `run_fitting()` function contains the initialization of the fitting kernel: loading experimental data, assignment of fit pair, fit parameters selection (line 62).
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/experiment_at_galaxi/fit_galaxi_data.py" language="python" >}} {{< highlightfile file="Examples/fit61_Galaxi/fit_galaxi_data.py" >}}
...@@ -37,4 +37,4 @@ The complete script to plot the fitting progress and the image produced by it ar ...@@ -37,4 +37,4 @@ The complete script to plot the fitting progress and the image produced by it ar
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_with_plotting.py" language="python" >}} {{< highlightfile file="Examples/fit54_ExternalMinimizer/lmfit_with_plotting.py" >}}
...@@ -42,4 +42,4 @@ print(result.params.pretty_print()) ...@@ -42,4 +42,4 @@ print(result.params.pretty_print())
The complete script for the `lmfit` based fitting is shown below. The complete script for the `lmfit` based fitting is shown below.
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/external_minimizer/lmfit_basics.py" language="python" >}} {{< highlightfile file="Examples/fit54_ExternalMinimizer/lmfit_basics.py" >}}
...@@ -44,6 +44,6 @@ in the BornAgain directory. ...@@ -44,6 +44,6 @@ in the BornAgain directory.
### Complete script and data ### Complete script and data
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/specular/FitSpecularBasics.py" language="python" >}} {{< highlightfile file="Examples/fit55_SpecularBasic/FitSpecularBasics.py" >}}
{{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/specular/genx_interchanging_layers.dat.gz" name="Reference data" %}} {{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/specular/genx_interchanging_layers.dat.gz" name="Reference data" %}}
...@@ -20,6 +20,6 @@ This example follows closely the tutorial on [Fitting reflectometry data](/py/fi ...@@ -20,6 +20,6 @@ This example follows closely the tutorial on [Fitting reflectometry data](/py/fi
{{% figure src="FitWithUncertainties.png" command="Resize" options="450x" caption="Fitting with uncertainties plot. Notice the $RQ^4$ scale of the Intensity axis" class="center" %}} {{% figure src="FitWithUncertainties.png" command="Resize" options="450x" caption="Fitting with uncertainties plot. Notice the $RQ^4$ scale of the Intensity axis" class="center" %}}
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/specular/FitWithUncertainties.py" language="python" >}} {{< highlightfile file="Examples/fit55_SpecularBasic/FitWithUncertainties.py" >}}
{{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/specular/genx_interchanging_layers.dat.gz" name="Reference data" %}} {{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/specular/genx_interchanging_layers.dat.gz" name="Reference data" %}}
...@@ -97,4 +97,4 @@ python3 PolarizedSpinAsymmetryFit.py ...@@ -97,4 +97,4 @@ python3 PolarizedSpinAsymmetryFit.py
Here is the complete example: Here is the complete example:
{{< highlightfile file="src/Examples/fit55_SpecularBasic/PolarizedSpinAsymmetryFit.py" language="python" >}} {{< highlightfile file="Examples/fit55_SpecularBasic/PolarizedSpinAsymmetryFit.py" >}}
...@@ -26,7 +26,6 @@ Be patient, since it takes some time to run. ...@@ -26,7 +26,6 @@ Be patient, since it takes some time to run.
{{% figure src="Figure.png" command="Resize" options="450x" caption="Figure obtained after running the script below" class="center" %}} {{% figure src="Figure.png" command="Resize" options="450x" caption="Figure obtained after running the script below" class="center" %}}
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/specular/RealLifeReflectometryFitting.py" language="python" >}} {{< highlightfile file="Examples/fit55_SpecularBasic/RealLifeReflectometryFitting.py" >}}
{{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/specular/mg6a_Merged.txt.gz" name="Reference data" %}} {{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/specular/mg6a_Merged.txt.gz" name="Reference data" %}}
...@@ -8,7 +8,7 @@ weight = 60 ...@@ -8,7 +8,7 @@ weight = 60
In this example, we want to demonstrate how to fit a more complex sample. In this example, we want to demonstrate how to fit a more complex sample.
For this purpose, we utilize the reflectometry data of an For this purpose, we utilize the reflectometry data of an
artificial magnetic honeycomb lattice published by A.&nbsp;Glavic et al., in artificial magnetic honeycomb lattice published by A.&nbsp;Glavic et al., in
[this paper](https://doi.org/10.1002/advs.201700856) [this paper](https://doi.org/10.1002/advs.201700856)
The experiment was performed with polarized neutrons, but without polarization analysis. The experiment was performed with polarized neutrons, but without polarization analysis.
...@@ -24,21 +24,21 @@ The experimental data consists of four datasets that should be fitted simultaneo ...@@ -24,21 +24,21 @@ The experimental data consists of four datasets that should be fitted simultaneo
These datasets arise from the two polarization channels for up and down polarization of the incoming beam These datasets arise from the two polarization channels for up and down polarization of the incoming beam
and both of these channels are measured at two temperatures (300K and 150K). and both of these channels are measured at two temperatures (300K and 150K).
All of this is measured on the same sample, so all parameters are assumed to be the same, All of this is measured on the same sample, so all parameters are assumed to be the same,
except the magnetization being temperature dependent. except the magnetization being temperature dependent.
Therefore, we introduce a scaling parameter for the magnetization as the ratio of the Therefore, we introduce a scaling parameter for the magnetization as the ratio of the
magnetizations at 150K and 300K: $M_{s150} = M_{150K} / M_{300K}$. magnetizations at 150K and 300K: $M_{s150} = M_{150K} / M_{300K}$.
#### Magnetization model #### Magnetization model
To model a magnetic material, one can assign a magnetization vector to any material, as is demonstrated To model a magnetic material, one can assign a magnetization vector to any material, as is demonstrated
in the [basic polarized reflectometry tutorial]({{% ref-py "instr/polarized/basic-polarized-reflectometry" %}}). in the [basic polarized reflectometry tutorial]({{% ref-py "instr/polarized/basic-polarized-reflectometry" %}}).
When a non-vanishing magnetization vector is specified for at least one layer in a sample, When a non-vanishing magnetization vector is specified for at least one layer in a sample,
BornAgain will automatically utilize the polarized computational engine. BornAgain will automatically utilize the polarized computational engine.
This leads to lower performance as the computations are more invovled. This leads to lower performance as the computations are more invovled.
In this example, the magnetization is (anti)parallel to the neutron spin and hence we instead parametrize In this example, the magnetization is (anti)parallel to the neutron spin and hence we instead parametrize
the magnetic layers with an effective SLD that is the sum/difference of the nuclear and their magnetic SLD: the magnetic layers with an effective SLD that is the sum/difference of the nuclear and their magnetic SLD:
$$\rho_\pm = \rho_{\text{N}} \pm \rho_{\text{M}}$$ $$\rho_\pm = \rho_{\text{N}} \pm \rho_{\text{M}}$$
...@@ -55,21 +55,21 @@ The SLDs of these three layers are taken from the literature and kept constant. ...@@ -55,21 +55,21 @@ The SLDs of these three layers are taken from the literature and kept constant.
Then we model the lattice structure with a three-layer model: two layers to account for density fluctuations Then we model the lattice structure with a three-layer model: two layers to account for density fluctuations
in $z$-direction and another oxide layer on top. in $z$-direction and another oxide layer on top.
This lattice structure is assumed to be magnetic and we fit all of their SLDs, magnetic SLDs, This lattice structure is assumed to be magnetic and we fit all of their SLDs, magnetic SLDs,
thicknesses and roughnesses. thicknesses and roughnesses.
The magnetic SLD depends on the temperature of the dataset, according to the scaling described above, where The magnetic SLD depends on the temperature of the dataset, according to the scaling described above, where
the $M_{s150}$ parameter is fitted. the $M_{s150}$ parameter is fitted.
All layers are modeled without absorption, i.e. no imaginary part of the SLD. All layers are modeled without absorption, i.e. no imaginary part of the SLD.
Ferthermore, we apply a resolution correction as described in [this tutorial]({{% ref-py "simulation/reflectometry/tofr-with-resolution" %}}) Ferthermore, we apply a resolution correction as described in [this tutorial]({{% ref-py "simulation/reflectometry/tofr-with-resolution" %}})
with a fixed value for $\Delta Q / Q = 0.018$. with a fixed value for $\Delta Q / Q = 0.018$.
The experimental data is normalized to unity, but we still fit the intensity, as is necessary due to the resolution correction. The experimental data is normalized to unity, but we still fit the intensity, as is necessary due to the resolution correction.
#### Running a computation #### Running a computation
In order to run a computation, we define some functions to utilize a common simulation function In order to run a computation, we define some functions to utilize a common simulation function
for the two spin channels and both temperatures: for the two spin channels and both temperatures:
{{< highlight python>}} {{< highlight python>}}
...@@ -88,7 +88,7 @@ def run_Simulation_150_m( qzs, params ): ...@@ -88,7 +88,7 @@ def run_Simulation_150_m( qzs, params ):
Here, the given arguments specify whether we want to simulate a spin-up beam (`sign = 1`) Here, the given arguments specify whether we want to simulate a spin-up beam (`sign = 1`)
and whether the scaling of the magnetization should be applied (`ms150=True`). and whether the scaling of the magnetization should be applied (`ms150=True`).
For the latter, `true` means that a dataset at 150K is simulated while `false` For the latter, `true` means that a dataset at 150K is simulated while `false`
corresponds to 300K and the scaling parameter is set to unity. corresponds to 300K and the scaling parameter is set to unity.
All four reflectivity curves are then computed using: All four reflectivity curves are then computed using:
...@@ -101,7 +101,7 @@ q_150_p, r_150_p = qr( run_Simulation_150_p( qzs, paramsInitial ) ) ...@@ -101,7 +101,7 @@ q_150_p, r_150_p = qr( run_Simulation_150_p( qzs, paramsInitial ) )
q_150_m, r_150_m = qr( run_Simulation_150_m( qzs, paramsInitial ) ) q_150_m, r_150_m = qr( run_Simulation_150_m( qzs, paramsInitial ) )
{{< /highlight >}} {{< /highlight >}}
We choose some sensible initial parameters and these yield the following We choose some sensible initial parameters and these yield the following
simulation result simulation result
{{< galleryscg >}} {{< galleryscg >}}
...@@ -120,9 +120,9 @@ As a measure for the goodness of the fit, we use the relative difference: ...@@ -120,9 +120,9 @@ As a measure for the goodness of the fit, we use the relative difference:
$$\Delta = \sum_{j = 1}^4 \frac{1}{N_j} \sum_{i = 1}^N \left( \frac{d_{ji} - s_{ji}}{d_{ji} + s_{ji}} \right)^2$$ $$\Delta = \sum_{j = 1}^4 \frac{1}{N_j} \sum_{i = 1}^N \left( \frac{d_{ji} - s_{ji}}{d_{ji} + s_{ji}} \right)^2$$
Here the sum over $i$ sums up the fitting error at every data point as usual and Here the sum over $i$ sums up the fitting error at every data point as usual and
the sum over $j$ adds the contributions from all four datasets. the sum over $j$ adds the contributions from all four datasets.
This is implemented in the `FitObjective::__call__` function and This is implemented in the `FitObjective::__call__` function and
the `FitObjective` object holds all four datasets, and also performs the corresponding simulations. the `FitObjective` object holds all four datasets, and also performs the corresponding simulations.
In the function `run_fit_differential_evolution` this is dispatched to the differential evolution algorithm. In the function `run_fit_differential_evolution` this is dispatched to the differential evolution algorithm.
...@@ -146,7 +146,6 @@ On a four-core workstation, the fitting procedure takes roughly 45 minutes to co ...@@ -146,7 +146,6 @@ On a four-core workstation, the fitting procedure takes roughly 45 minutes to co
As can be seen from the plot of the SLDs, the magnetization is indeed larger for the measurement at lower temperature, exactly as expected. As can be seen from the plot of the SLDs, the magnetization is indeed larger for the measurement at lower temperature, exactly as expected.
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/honeycomb/Honeycomb_fit.py" language="python" >}} {{< highlightfile file="Examples/fit56_SpecularAdvanced/Honeycomb_fit.py" >}}
{{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/honeycomb/honeycomb_data.zip" name="Reference data" %}} {{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/honeycomb/honeycomb_data.zip" name="Reference data" %}}
...@@ -98,6 +98,6 @@ python3 Pt_layer_fit.py ...@@ -98,6 +98,6 @@ python3 Pt_layer_fit.py
a simulation is performed with our fit results and one should obtain the result shown above. a simulation is performed with our fit results and one should obtain the result shown above.
{{< highlightfile file="/static/files/python/fitting/ex03_ExtendedExamples/pt-layer/Pt_layer_fit.py" language="python" >}} {{< highlightfile file="Examples/fit56_SpecularAdvanced/Pt_layer_fit.py" >}}
{{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/pt-layer/RvsQ_36563_36662.txt.gz" name="Reference data" %}} {{% filelink file="/static/files/python/fitting/ex03_ExtendedExamples/pt-layer/RvsQ_36563_36662.txt.gz" name="Reference data" %}}
...@@ -40,7 +40,7 @@ and terminates with the following result: ...@@ -40,7 +40,7 @@ and terminates with the following result:
### Parametric sample and simulation model ### Parametric sample and simulation model
{{< highlightfile file="/static/files/python/fitting/gisas2d/gisas_model1.py" language="python" >}} {{< highlightfile file="Examples/fit/gisas2d/gisas_model1.py" >}}
### Explanation ### Explanation
...@@ -62,7 +62,7 @@ in order to facilitate the benchmarking of different fith methods. ...@@ -62,7 +62,7 @@ in order to facilitate the benchmarking of different fith methods.
### Main fit script ### Main fit script
{{< highlightfile file="/static/files/python/fitting/gisas2d/fit_gisas.py" language="python" >}} {{< highlightfile file="Examples/fit/gisas2d/fit_gisas.py" >}}
<p> <p>
### Explanation ### Explanation
......
...@@ -16,7 +16,7 @@ so the BornAgain setup looks very similar. ...@@ -16,7 +16,7 @@ so the BornAgain setup looks very similar.
In the code snippet below we give an example of finding the minimum of the [Rosenbrock function](https://en.wikipedia.org/wiki/Rosenbrock_function) In the code snippet below we give an example of finding the minimum of the [Rosenbrock function](https://en.wikipedia.org/wiki/Rosenbrock_function)
using the BornAgain minimizer with default settings. using the BornAgain minimizer with default settings.
{{< highlightfile file="/static/files/python/fitting/algo/fit_rosenbrock.py" language="python" >}} {{< highlightfile file="Examples/fit/algo/fit_rosenbrock.py" >}}
<p> <p>
The rest of the page gives additional details on The rest of the page gives additional details on
......
...@@ -18,6 +18,6 @@ The observed reflectometry signal can be affected either by a spread in the beam ...@@ -18,6 +18,6 @@ The observed reflectometry signal can be affected either by a spread in the beam
In this example, a Gaussian distribution is used to spread the incident angle, with a standard deviation of $\sigma_{\alpha} = 0.01^{\circ}$. In this example, a Gaussian distribution is used to spread the incident angle, with a standard deviation of $\sigma_{\alpha} = 0.01^{\circ}$.
{{< highlightfile file="src/Examples/specular/BeamAngularDivergence.py" language="python" >}} {{< highlightfile file="Examples/specular/BeamAngularDivergence.py" >}}
{{% filelink file="src/Examples/scatter2d/genx_angular_divergence.dat.gz" name="Reference data" %}} {{% filelink file="Examples/scatter2d/genx_angular_divergence.dat.gz" name="Reference data" %}}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment