Aby zainstalować ReadManager-a w wersji python3 wpisz w terminalu komendę:
sudo pip3 install obci_readmanager
from obci_readmanager.signal_processing.read_manager import ReadManager
# Utwórz obiekt klasy ReadManager podając na wejściu
# ścieżki do odpowiednich plików
mgr = ReadManager("file.xml", "file.raw", "file.tag")
# Pobierz informacje o sygnale
sampling = float(mgr.get_param("sampling_frequency"))
num_of_channels = int(mgr.get_param("number_of_channels"))
channels_names = mgr.get_param("channels_names")
# Iteruj po każdej próbce sygnału
for i, sample_vector in enumerate(mgr.iter_samples()):
print("Sample number "+str(i)+" is: "+str(sample_vector))
# Pobierz cały sygnał
syg = mgr.get_samples()
# Pobierz cały, wybrany kanał
fpz = mgr.get_channel_samples("Fpz")
# Pobierz dwusekundowy fragment wybranego kanału zaczynając
# od piątej sekundy sygnału
fpz_part = mgr.get_channel_samples("Fpz", 5.0, 2.0, p_unit='second')
# Pobierz sygnał z wybranych kanałów
syg = mgr.get_channels_samples(['Fz', 'Cz'])
# Pobierz dwusekundowy fragment wybranych kanałów zaczynając
# od piątej sekundy sygnału
syg_part = mgr.get_channels_samples(["Fz", 'Cz'], 5.0, 2.0, p_unit='second')
# Pobierz wszystkie znaczniki
tags = mgr.get_tags()
# Pobierz wszystkie znaczniki typu "target" zaczynając
# od piątej sekundy sygnału
tags_5 = mgr.get_tags("target", 5.0)
# Pobierz wszystkie znaczniki spełniające kryterium określone funkcją
# UWAGA! Parametry znaczników wczytywane są jako napisy. Jeżeli chcesz
# wykonać operację arytmetyczną na wartości wybranego parametru przekonwertuj
# ją wcześniej do formatu liczbowego.
func = lambda tag: int(tag["start_timestamp"]) > 10.0 and int(tag["desc"]["czestosc"]) == 12
tags_f = mgr.get_tags(p_func=func)
W ReadManagerze wyodrębniono trzy etapy przetwarzania danych: wczytanie danych, interpretacja danych oraz przetwarzanie danych. Każdy z etapów jest realizowany przez inny zestaw klas (Ilustracja 1):
Klasy typu Proxy – zestaw klas odpowiadających za rozpoznawanie formatu pliku i wczytywanie danych z pliku. Obiekty klasy Proxy odpowiadają za bezpośredni dostęp do pliku; nie potrafią interpretować ani organizować danych biorąc pod uwagę ich specyfikę. Przykładowo, obiekt klasy DataFileReadProxy potrafi odczytywać z binarnego pliku kolejne ośmiobajtowe liczby zmiennoprzecinkowe, ale w żaden sposób ich nie organizuje, np. nie interpretuje, które liczby należą do tego samego kanału w sygnale.
Klasy typu Source - zestaw klas odpowiadających za organizowanie i interpretowanie danych. Obiekty klasy Source tworzą obiekt klasy Proxy i zarządzają nim. Dodatkowo organizują dane; "wiedzą", że operują sygnałem. Przykładowo, obiekt klasy FileDataSource mając informację o liczbie kanałów, grupuje dane z pliku w kanały i umożliwia do nich dostęp, odwołując się do wybranego kanału. Ponadto buforuje sygnał. Po pierwszym pobraniu całego sygnału dane są przenoszone do pamięci operacyjnej. Dzięki temu każde kolejne odwołanie do sygnału jest już dużo szybsze.
Klasy typu ReadManager - zestaw klas udostępniających wygodne API do pracy z danymi. Obiekty klasy ReadManager tworzą lub dostają na wejściu obiekty klas InfoSource, DataSource, TagsSource. Zapewniają proste API z dostępem do wszystkich interesujących danych: do sygnału, do metadanych o sygnale oraz do tagów.