Coverage for colour/temperature/tests/test_ohno2013.py: 100%
96 statements
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-15 19:01 +1300
« prev ^ index » next coverage.py v7.11.0, created at 2025-11-15 19:01 +1300
1"""Define the unit tests for the :mod:`colour.temperature.ohno2013` module."""
3from __future__ import annotations
5from itertools import product
7import numpy as np
9from colour.colorimetry import MSDS_CMFS
10from colour.constants import TOLERANCE_ABSOLUTE_TESTS
11from colour.temperature import (
12 CCT_to_uv_Ohno2013,
13 CCT_to_XYZ_Ohno2013,
14 XYZ_to_CCT_Ohno2013,
15 uv_to_CCT_Ohno2013,
16)
17from colour.temperature.ohno2013 import planckian_table
18from colour.utilities import ignore_numpy_errors
20__author__ = "Colour Developers"
21__copyright__ = "Copyright 2013 Colour Developers"
22__license__ = "BSD-3-Clause - https://opensource.org/licenses/BSD-3-Clause"
23__maintainer__ = "Colour Developers"
24__email__ = "colour-developers@colour-science.org"
25__status__ = "Production"
27__all__ = [
28 "TestPlanckianTable",
29 "TestUv_to_CCT_Ohno2013",
30 "TestCCT_to_uv_Ohno2013",
31 "Test_XYZ_to_CCT_Ohno2013",
32 "Test_CCT_to_XYZ_Ohno2013",
33]
36class TestPlanckianTable:
37 """
38 Define :func:`colour.temperature.ohno2013.planckian_table` definition
39 unit tests methods.
40 """
42 def test_planckian_table(self) -> None:
43 """Test :func:`colour.temperature.ohno2013.planckian_table` definition."""
45 np.testing.assert_allclose(
46 planckian_table(
47 MSDS_CMFS["CIE 1931 2 Degree Standard Observer"],
48 5000,
49 6000,
50 1.01,
51 ),
52 np.array(
53 [
54 [5.00000000e03, 2.11424442e-01, 3.23115810e-01],
55 [5.00100000e03, 2.11414166e-01, 3.23105716e-01],
56 [5.05101000e03, 2.10906941e-01, 3.22603850e-01],
57 [5.09965995e03, 2.10425840e-01, 3.22121155e-01],
58 [5.14875592e03, 2.09952257e-01, 3.21639518e-01],
59 [5.19830158e03, 2.09486095e-01, 3.21159015e-01],
60 [5.24830059e03, 2.09027261e-01, 3.20679719e-01],
61 [5.29875665e03, 2.08575658e-01, 3.20201701e-01],
62 [5.34967349e03, 2.08131192e-01, 3.19725033e-01],
63 [5.40105483e03, 2.07693769e-01, 3.19249784e-01],
64 [5.45290444e03, 2.07263296e-01, 3.18776019e-01],
65 [5.50522609e03, 2.06839680e-01, 3.18303806e-01],
66 [5.55802360e03, 2.06422828e-01, 3.17833209e-01],
67 [5.61130078e03, 2.06012650e-01, 3.17364290e-01],
68 [5.66506148e03, 2.05609054e-01, 3.16897111e-01],
69 [5.71930956e03, 2.05211949e-01, 3.16431730e-01],
70 [5.77404891e03, 2.04821246e-01, 3.15968207e-01],
71 [5.82928344e03, 2.04436856e-01, 3.15506598e-01],
72 [5.88501707e03, 2.04058690e-01, 3.15046958e-01],
73 [5.94125375e03, 2.03686660e-01, 3.14589340e-01],
74 [5.99799745e03, 2.03320679e-01, 3.14133796e-01],
75 [5.99900000e03, 2.03314296e-01, 3.14125803e-01],
76 [6.00000000e03, 2.03307932e-01, 3.14117832e-01],
77 ]
78 ),
79 atol=1e-6,
80 )
83class TestUv_to_CCT_Ohno2013:
84 """
85 Define :func:`colour.temperature.ohno2013.uv_to_CCT_Ohno2013` definition
86 unit tests methods.
87 """
89 def test_uv_to_CCT_Ohno2013(self) -> None:
90 """
91 Test :func:`colour.temperature.ohno2013.uv_to_CCT_Ohno2013`
92 definition.
93 """
95 CCT = np.linspace(1_000, 100_000, 3_000)
96 D_uv = np.linspace(-0.01, 0.01, 10)
98 CCT, D_uv = np.meshgrid(CCT, D_uv)
99 table_r = np.transpose((np.ravel(CCT), np.ravel(D_uv)))
100 table_t = uv_to_CCT_Ohno2013(CCT_to_uv_Ohno2013(table_r))
102 np.testing.assert_allclose(table_t[1, :], table_r[1, :], atol=1)
104 np.testing.assert_allclose(
105 uv_to_CCT_Ohno2013(np.array([0.1978, 0.3122])),
106 np.array([6507.474788799616363, 0.003223346337596]),
107 atol=TOLERANCE_ABSOLUTE_TESTS,
108 )
110 np.testing.assert_allclose(
111 uv_to_CCT_Ohno2013(np.array([0.4328, 0.2883])),
112 np.array([1041.678320000468375, -0.067378053475797]),
113 atol=TOLERANCE_ABSOLUTE_TESTS,
114 )
116 np.testing.assert_allclose(
117 uv_to_CCT_Ohno2013(np.array([0.2927, 0.2722])),
118 np.array([2444.971818951082696, -0.084370641205118]),
119 atol=TOLERANCE_ABSOLUTE_TESTS,
120 )
122 def test_n_dimensional_uv_to_CCT_Ohno2013(self) -> None:
123 """
124 Test :func:`colour.temperature.ohno2013.uv_to_CCT_Ohno2013` definition
125 n-dimensional arrays support.
126 """
128 uv = np.array([0.1978, 0.3122])
129 CCT_D_uv = uv_to_CCT_Ohno2013(uv)
131 uv = np.tile(uv, (6, 1))
132 CCT_D_uv = np.tile(CCT_D_uv, (6, 1))
133 np.testing.assert_allclose(
134 uv_to_CCT_Ohno2013(uv), CCT_D_uv, atol=TOLERANCE_ABSOLUTE_TESTS
135 )
137 uv = np.reshape(uv, (2, 3, 2))
138 CCT_D_uv = np.reshape(CCT_D_uv, (2, 3, 2))
139 np.testing.assert_allclose(
140 uv_to_CCT_Ohno2013(uv), CCT_D_uv, atol=TOLERANCE_ABSOLUTE_TESTS
141 )
143 @ignore_numpy_errors
144 def test_nan_uv_to_CCT_Ohno2013(self) -> None:
145 """
146 Test :func:`colour.temperature.ohno2013.uv_to_CCT_Ohno2013` definition
147 nan support.
148 """
150 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
151 cases = np.array(list(set(product(cases, repeat=2))))
152 uv_to_CCT_Ohno2013(cases)
155class TestCCT_to_uv_Ohno2013:
156 """
157 Define :func:`colour.temperature.ohno2013.CCT_to_uv_Ohno2013` definition
158 unit tests methods.
159 """
161 def test_CCT_to_uv_Ohno2013(self) -> None:
162 """
163 Test :func:`colour.temperature.ohno2013.CCT_to_uv_Ohno2013`
164 definition.
165 """
167 np.testing.assert_allclose(
168 CCT_to_uv_Ohno2013(np.array([6507.47380460, 0.00322335])),
169 np.array([0.19779997, 0.31219997]),
170 atol=TOLERANCE_ABSOLUTE_TESTS,
171 )
173 np.testing.assert_allclose(
174 CCT_to_uv_Ohno2013(np.array([1041.68315360, -0.06737802])),
175 np.array([0.43279885, 0.28830013]),
176 atol=TOLERANCE_ABSOLUTE_TESTS,
177 )
179 np.testing.assert_allclose(
180 CCT_to_uv_Ohno2013(np.array([2452.15316417, -0.08437064])),
181 np.array([0.29247364, 0.27215157]),
182 atol=TOLERANCE_ABSOLUTE_TESTS,
183 )
185 def test_n_dimensional_CCT_to_uv_Ohno2013(self) -> None:
186 """
187 Test :func:`colour.temperature.ohno2013.CCT_to_uv_Ohno2013` definition
188 n-dimensional arrays support.
189 """
191 CCT_D_uv = np.array([6507.47380460, 0.00322335])
192 uv = CCT_to_uv_Ohno2013(CCT_D_uv)
194 CCT_D_uv = np.tile(CCT_D_uv, (6, 1))
195 uv = np.tile(uv, (6, 1))
196 np.testing.assert_allclose(
197 CCT_to_uv_Ohno2013(CCT_D_uv), uv, atol=TOLERANCE_ABSOLUTE_TESTS
198 )
200 CCT_D_uv = np.reshape(CCT_D_uv, (2, 3, 2))
201 uv = np.reshape(uv, (2, 3, 2))
202 np.testing.assert_allclose(
203 CCT_to_uv_Ohno2013(CCT_D_uv), uv, atol=TOLERANCE_ABSOLUTE_TESTS
204 )
206 @ignore_numpy_errors
207 def test_nan_CCT_to_uv_Ohno2013(self) -> None:
208 """
209 Test :func:`colour.temperature.ohno2013.CCT_to_uv_Ohno2013` definition
210 nan support.
211 """
213 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
214 cases = np.array(list(set(product(cases, repeat=2))))
215 CCT_to_uv_Ohno2013(cases)
218class Test_XYZ_to_CCT_Ohno2013:
219 """
220 Define :func:`colour.temperature.ohno2013.XYZ_to_CCT_Ohno2013` definition
221 unit tests methods.
222 """
224 def test_XYZ_to_CCT_Ohno2013(self) -> None:
225 """
226 Test :func:`colour.temperature.ohno2013.XYZ_to_CCT_Ohno2013` definition.
227 """
229 np.testing.assert_allclose(
230 XYZ_to_CCT_Ohno2013(np.array([95.04, 100.00, 108.88])),
231 np.array([6503.30711709, 0.00321729]),
232 atol=TOLERANCE_ABSOLUTE_TESTS,
233 )
235 def test_n_dimensional_XYZ_to_CCT_Ohno2013(self) -> None:
236 """
237 Test :func:`colour.temperature.ohno2013.XYZ_to_CCT_Ohno2013` definition
238 n-dimensional arrays support.
239 """
241 XYZ = np.array([95.04, 100.00, 108.88])
242 CCT_D_uv = XYZ_to_CCT_Ohno2013(XYZ)
244 XYZ = np.tile(XYZ, (6, 1))
245 CCT_D_uv = np.tile(CCT_D_uv, (6, 1))
246 np.testing.assert_allclose(
247 XYZ_to_CCT_Ohno2013(XYZ), CCT_D_uv, atol=TOLERANCE_ABSOLUTE_TESTS
248 )
250 XYZ = np.reshape(XYZ, (2, 3, 3))
251 CCT_D_uv = np.reshape(CCT_D_uv, (2, 3, 2))
252 np.testing.assert_allclose(
253 XYZ_to_CCT_Ohno2013(XYZ), CCT_D_uv, atol=TOLERANCE_ABSOLUTE_TESTS
254 )
256 @ignore_numpy_errors
257 def test_nan_XYZ_to_CCT_Ohno2013(self) -> None:
258 """
259 Test :func:`colour.temperature.ohno2013.XYZ_to_CCT_Ohno2013` definition
260 nan support.
261 """
263 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
264 cases = np.array(list(set(product(cases, repeat=3))))
265 XYZ_to_CCT_Ohno2013(cases)
268class Test_CCT_to_XYZ_Ohno2013:
269 """
270 Define :func:`colour.temperature.ohno2013.CCT_to_XYZ_Ohno2013` definition
271 unit tests methods.
272 """
274 def test_CCT_to_XYZ_Ohno2013(self) -> None:
275 """
276 Test :func:`colour.temperature.ohno2013.CCT_to_XYZ_Ohno2013` definition.
277 """
279 np.testing.assert_allclose(
280 CCT_to_XYZ_Ohno2013(np.array([6503.30711709, 0.00321729])),
281 np.array([95.04, 100.00, 108.88]) / 100,
282 atol=1e-6,
283 )
285 def test_n_dimensional_CCT_to_XYZ_Ohno2013(self) -> None:
286 """
287 Test :func:`colour.temperature.ohno2013.CCT_to_XYZ_Ohno2013` definition
288 n-dimensional arrays support.
289 """
291 CCT_D_uv = np.array([6503.30711709, 0.00321729])
292 XYZ = CCT_to_XYZ_Ohno2013(CCT_D_uv)
294 CCT_D_uv = np.tile(CCT_D_uv, (6, 1))
295 XYZ = np.tile(XYZ, (6, 1))
296 np.testing.assert_allclose(
297 CCT_to_XYZ_Ohno2013(CCT_D_uv), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS
298 )
300 CCT_D_uv = np.reshape(CCT_D_uv, (2, 3, 2))
301 XYZ = np.reshape(XYZ, (2, 3, 3))
302 np.testing.assert_allclose(
303 CCT_to_XYZ_Ohno2013(CCT_D_uv), XYZ, atol=TOLERANCE_ABSOLUTE_TESTS
304 )
306 @ignore_numpy_errors
307 def test_nan_CCT_to_uv_Ohno2013(self) -> None:
308 """
309 Test :func:`colour.temperature.ohno2013.CCT_to_uv_Ohno2013` definition
310 nan support.
311 """
313 cases = [-1.0, 0.0, 1.0, -np.inf, np.inf, np.nan]
314 cases = np.array(list(set(product(cases, repeat=2))))
315 CCT_to_uv_Ohno2013(cases)