Dalej

Wstecz

ReadManager

Segmentacja i grupowanie danych względem znaczników

Otagowany sygnał można pociąć wzdłuż znaczników. Służy do tego klasa SmartTag.

Przykład - cięcie sygnału

from obci_readmanager.signal_processing.smart_tags_manager import SmartTagsManager
from obci_readmanager.signal_processing.tags.smart_tag_definition import (
                    SmartTagDurationDefinition,
                    SmartTagEndTagDefinition)
from obci_readmanager.signal_processing.read_manager import ReadManager
import numpy

# Utwórz definicję cięcia - fragmenty od 100 ms przed znacznikiem
#typu "target" do 600 ms po tym znaczniku
tag_def = SmartTagDurationDefinition(start_tag_name="target",
                                     start_offset=-0.1,
                                     end_offset=0.0,
                                     duration=0.7)

# Utwórz obiekt zarządzający
smgr = SmartTagsManager(tag_def,
                        "data.xml",
                        "data.raw",
                        "data.tag")

# Alternatywnie:

mgr = ReadManager('data.xml', 'data.raw', 'data.tag')
smgr = SmartTagsManager(tag_def, '', '', '', mgr)

# Uśrednij wszystkie znalezione fragmenty sygnału
avg = numpy.mean([i.get_samples() for i in smgr], axis=0)

# Zsumuj wszystkie fragmenty, których startowy znacznik spełnia zadane
# kryteria:
# * znacznik o długości dwudziestu sekund zaczynający się od piątej sekundy
# * spełniający dodatkowe kryterium func
func = lambda s_tag: int(s_tag["desc"]["value"]) == 0
tags = smgr.get_smart_tags(p_from=5.0, p_len=20.0, p_func=func)
avg = numpy.mean([i.get_samples() for i in tags], axis=1)

# Wypisz wszystkie fragmenty zaczynające się znacznikiem typu "target",
# a kończące się pół sekundy przed kolejnym znacznikiem
# typu "target" lub "non-target"
tag_def = SmartTagEndTagDefinition(start_tag_name="target",
                                   start_offset=-0.1,
                                   end_offset=-0.5,
                                   end_tags_names=["target", "non-target"]
                                   )
mgr = SmartTagsManager(tag_def,
                       "data.xml",
                       "data.raw",
                       "data.tag"
                       )
for i_smart_tag in mgr.iter_smart_tags():
    print(i_smart_tag.get_samples())

Technikalia - klasa SmartTag

Obiekty klasy SmartTag reprezentują wycięty fragment sygnału. Klasa dziedziczy z klasy ReadManager tak więc dostęp do wyciętego fragmentu jest identyczny, jak w przypadku całego sygnału. Pozwala to tworzyć moduły transformacji sygnału działające zarówno dla całego sygnału reprezentowanego przez obiekt ReadManager, jak i dla fragmentów sygnału reprezentowanych przez obiekt SmartTag.

W zależności od typu cięcia użyj jednej z dwóch podklas klasy SmartTag:

UWAGA!
Nie twórz obiektów klasy SmartTag bezpośrednio!
Odpowiada za to klasa SmartTagsManager. Obiekty klasy SmartTagsManager tworzą, agregują i udostępniają obiekty klasy SmartTag. Klasa SmartTagsManager wymaga na wejściu obiektu klasy SmartTagDefinition. Obiekty klasy SmartTagDefinition określają dokładną definicję cięcia sygnału na fragmenty.

Ilustracja 2. Diagram klas do analizy danych z eksperymentu — kluczową klasą jest (abstrakcyjna) klasa SmartTag, która dziedziczy z klasy ReadManager. Jest więc pełnoprawnym źródłem danych (sygnału EEG) oraz znaczników, jednak nie z całego zbioru, a z pewnego odcinka, zdefiniowanego parametrami.



Spis

Dalej

Wstecz