#
# Copyright 2018-2026 the orix developers
#
# This file is part of orix.
#
# orix is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# orix is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with orix. If not, see <http://www.gnu.org/licenses/>.
#

r"""
================================================
Rotations mapping the fundamental sector on *S2*
================================================

This example shows how to sample rotations :math:`\mathbf{R}` that when rotating the
vector :math:`\mathbf{v_z} = (0, 0, 1)`, the resulting vectors cover the fundamental
sector of a given Laue class.

We show this by comparing the vectors we get by:

1. Sampling rotations for *4/mmm* and then rotating :math:`\mathbf{v_z}`
2. Sampling all of *S2* but only keeping those within the corresponding fundamental
   sector.

Apart from the first rotation, all rotations have a Euler angle
:math:`\phi = 0^{\circ}`.
These "reduced" rotations can be useful in template matching of spot patterns from the
transmission electron microscope.
"""

# %%
import matplotlib.pyplot as plt
import numpy as np

from orix import sampling
from orix.plot import register_projections
from orix.quaternion.symmetry import D4h
from orix.vector import Vector3d

register_projections()  # Register our custom Matplotlib projections

# Sample rotations with an average misorientation
res = 2
pg = D4h  # 4/mmm

R = sampling.get_sample_reduced_fundamental(res, point_group=pg)
print(np.allclose(R.to_euler()[1:, 0], 0))

# %%
# Get vectors within the fundamental sector following the two routes
v1 = R * Vector3d.zvector()

v2 = sampling.sample_S2(res)
v2 = v2[v2 <= pg.fundamental_sector]

# Only equivalent for the same S2 sampling method
print(np.allclose(v1.data, v2.data))
print(v1)
print(v2)

# %%
# Plot the vectors in the fundamental sector of Laue group 4/mmm
fig, (ax0, ax1) = plt.subplots(
    ncols=2, subplot_kw={"projection": "ipf", "symmetry": pg}, layout="tight"
)
ax0.scatter(v1, s=5)
ax1.scatter(v2, c="C1", s=5)
ax0.set_title("Rotated Z vectors", loc="left")
ax1.set_title("Directly sampled", loc="left")
_ = fig.suptitle("Vectors in the fundamental sector of 4/mmm", y=0.8)
