The built-in create_factory for register_antenna_pattern() use globals() for the v_pattern:
def create_factory(name: str) -> Callable[[str, str], PolarizedAntennaPattern]:
r"""Create a factory method for the instantiation of polarized antenna
patterns
Note that there must be a vertical antenna pattern function with name
"v_{s}_pattern" which is used.
:param name: Name under which to register the factory method
:returns: Callable creating an instance of PolarizedAntennaPattern
"""
def f(*, polarization, polarization_model="tr38901_2"):
return PolarizedAntennaPattern(
v_pattern=globals()["v_" + name + "_pattern"],
polarization=polarization,
polarization_model=polarization_model)
return f
Which will not work if the user register their own custom antenna pattern:
import sionna.rt
import mitsuba as mi
from sionna.rt.antenna_pattern import register_antenna_pattern, create_factory
from sionna.rt.antenna_array import PlanarArray
def v_poc_pattern(theta, phi):
return mi.Complex2f(10, 0.0)
register_antenna_pattern("poc", create_factory("poc"))
array = PlanarArray(num_rows=1, num_cols=1, pattern="poc", polarization="V")
Output:
Traceback (most recent call last):
File "/poc2.py", line 14, in <module>
array = PlanarArray(num_rows=1, num_cols=1, pattern="poc", polarization="V")
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/sionna-rt/src/sionna/rt/antenna_array.py", line 200, in __init__
antenna_pattern = antenna_pattern_registry.get(pattern)(**kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/sionna-rt/src/sionna/rt/antenna_pattern.py", line 599, in f
v_pattern=globals()["v_" + name + "_pattern"],
~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
KeyError: 'v_poc_pattern'
Although user can define their own callback to do the same thing:
import sionna.rt
import mitsuba as mi
from sionna.rt.antenna_pattern import (
register_antenna_pattern,
create_factory,
PolarizedAntennaPattern,
)
from sionna.rt.antenna_array import PlanarArray
def v_poc_pattern(theta, phi):
return mi.Complex2f(10, 0.0)
def f(*, polarization, polarization_model="tr38901_2"):
return PolarizedAntennaPattern(
v_pattern=v_poc_pattern,
polarization=polarization,
polarization_model=polarization_model,
)
register_antenna_pattern("poc", f)
array = PlanarArray(num_rows=1, num_cols=1, pattern="poc", polarization="V")
I think it will still be better if user can use the same API interface -- or at least to document this in the tutorial.
The built-in
create_factoryforregister_antenna_pattern()useglobals()for the v_pattern:Which will not work if the user register their own custom antenna pattern:
Output:
Although user can define their own callback to do the same thing:
I think it will still be better if user can use the same API interface -- or at least to document this in the tutorial.