Skip to content

Cannot use antenna pattern defined outsideantenna_pattern.py #8

Description

@mlouielu

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions