# Frequently Asked Questions

## Installation

### Why can’t the linker find libufo.so?

In the rare circumstances that you installed UFO from source for the first time by calling `make install`, the dynamic linker does not know that the library exists. If this is the case issue

    $ sudo ldconfig

on Debian systems or

    $ su
    $ ldconfig

on openSUSE systems.

If this is not working, the library is neither installed into `/usr/lib` nor `/usr/local/lib` on 32-bit systems or `/usr/lib64` and `/usr/local/lib64` on 64-bit systems.

### How are kernel files loaded?

In a similar way as plugins. However, OpenCL kernel files are not architecture specific and are installed to `${PREFIX}/share/ufo`. Additional search paths can be added at run-time through the `UFO_KERNEL_PATH` environment variable.

## Usage

### Why do I get a “libfilter<foo>.so not found” message?

Because the UFO core system is unable to locate the filters. By default it looks into `${LIBDIR}/ufo`. If you don’t want to install the filters system-wide, you can tell the system to try other paths as well by appending paths to the `UFO_PLUGIN_PATH` environment variable.

### How can I control the debug output from libufo?

Generally, UFO emits debug messages under the log domain `Ufo`. If you use a UFO-based tool and cannot see debug messages, you might have to enable them by setting the `G_MESSAGES_DEBUG` environment variable, i.e.:

    export G_MESSAGES_DEBUG=Ufo

To handle these messages from within a script or program, you must set a log handler that decides what to do with the messages. To ignore all messages in Python, you would have to write something like this:

    from gi.repository import Ufo, GLib

    def ignore_message(domain, level, message, user):
        pass

    if __name__ == '__main__':
        GLib.log_set_handler("Ufo", GLib.LogLevelFlags.LEVEL_MASK,
            ignore_message, None)

### How can I use Numpy output?

Install the `ufo-python-tools`. You can then use the BufferInput filter to process Numpy arrays data:

    from gi.repository import Ufo
    import ufo.numpy
    import numpy as np

    arrays = [ i*np.eye(100, dtype=np.float32) for i in range(1, 10) ]
    buffers = [ ufo.numpy.fromarray(a) for a in arrays ]

    pm = Ufo.PluginManager()
    numpy_input = pm.get_task('bufferinput')
    numpy_input.set_properties(buffers=buffers)

### How can I synchronize two properties?

Although this is a general GObject question, synchronizing two properties is particularly important if the receiving filter depends on a changed property. For example, the back-projection should start only if a center-of-rotation is known. In Python you can use the `bind_property` function from the `ufotools` module like this:

    from gi.repository import Ufo
    import ufotools.bind_property

    pm = Ufo.PluginManager()
    cor = g.get_task('centerofrotation')
    bp = g.get_task('backproject')

    # Now connect the properties
    ufotools.bind_property(cor, 'center', bp, 'axis-pos')

In C, the similar `g_object_bind_property` function is provided out-of-the-box.