본문 바로가기
Brain Engineering/MNE Python

[MNE-Python] 원시 데이터에서 이벤트 구문 분석 (1)

by goatlab 2022. 3. 23.
728x90
반응형
SMALL

원시 데이터에서 실험적 이벤트를 읽는 방법과 MNE-Python (이벤트 배열 및 주석 객체) 내에서 이벤트의 두 가지 다른 표현 사이를 변환하는 방법을 설명한다.

 

필요한 Python 모듈을 로드하고 입문 자습서에서 사용한 것과 동일한 예제 데이터를 로드하는 것으로 시작하지만 메모리를 절약하기 위해 RAM에 로드하기 전에 개체를 60초로 자른다.

 

import os
import numpy as np
import mne

sample_data_folder = mne.datasets.sample.data_path()
sample_data_raw_file = os.path.join(sample_data_folder, 'MEG', 'sample',
                                    'sample_audvis_raw.fif')
raw = mne.io.read_raw_fif(sample_data_raw_file)
raw.crop(tmax=60).load_data()
---
Opening raw data file /home/circleci/mne_data/MNE-sample-data/MEG/sample/sample_audvis_raw.fif...
    Read a total of 3 projection items:
        PCA-v1 (1 x 102)  idle
        PCA-v2 (1 x 102)  idle
        PCA-v3 (1 x 102)  idle
    Range : 25800 ... 192599 =     42.956 ...   320.670 secs
Ready.
Reading 0 ... 36037  =      0.000 ...    60.000 secs...

 

The Events and Annotations data structures

 

일반적으로 이벤트와 Annotations 데이터 구조는 동일한 목적을 수행한다. 즉, EEG / MEG 기록 중 시간 매핑과 해당 시간에 발생한 일에 대한 설명을 제공한다. 즉, when과 what을 연관시킨다. 주요 차이점은 다음과 같다.

 

  1. 단위 : 이벤트 데이터 구조는 샘플로 when 을 나타내는 반면 Annotations 데이터 구조는 when 을 초로 나타낸다.
  2. 설명에 대한 제한 사항: Events 데이터 구조는 what 을 정수 "Event ID" 코드로 나타내는 반면 Annotations 데이터 구조는 what 을 문자열로 나타낸다.
  3. 지속 시간이 인코딩되는 방법 : 이벤트 배열의 이벤트에는 지속 시간이 없지만 (이벤트 배열 내에서 시작 / 오프셋 이벤트 쌍으로 지속 시간을 나타낼 수 있음) Annotations 객체의 각 요소에는 반드시 지속 시간이 포함된다 (시간 즉각적인 이벤트가 필요한 경우 0이 될 수 있음).
  4. 내부 표현 : 이벤트는 일반 으로 저장되는 반면 MNE-Python에 정의된 유사 클래스이다.

 

What is a STIM channel?

 

자극 채널은 EEG, MEG 또는 기타 센서로부터 신호를 수신하지 않는 채널이다. 대신, STIM 채널은 자극의 시작이나 피험자의 버튼 누름 반응과 같은 실험 이벤트에 시간 고정된 전압 (일반적으로 실험 제어 컴퓨터에서 전송된 고정 크기의 짧은 직사각형 DC 펄스)을 기록한다. 이러한 펄스를 TTL 펄스, 이벤트 펄스, 트리거 신호 또는 그냥 "트리거" 라고도 한다. 다른 경우에, 이러한 펄스는 실험 이벤트에 대해 엄격하게 시간 고정되지 않을 수 있지만 대신 다가오는 시도에서 발생하려는 자극 (또는 실험 조건)의 유형을 나타내기 위해 시도 사이에 발생할 수 있다.

 

DC 펄스는 모두 하나의 STIM 채널에 있거나 (이 경우 다른 실험 이벤트 또는 시도 유형이 다른 전압 크기로 인코딩됨) 여러 채널에 걸쳐 확산될 수 있다. 이 경우 펄스 발생은 다른 이벤트나 조건을 인코딩하는 데 사용할 수 있다. 여러 STIM 채널이 있는 시스템에서도 종종 다른 STIM 채널의 가중치 합을 기록하는 채널이 하나 있기 때문에 해당 채널의 전압 레벨이 특정 이벤트 유형으로 명확하게 디코딩될 수 있다. 이전 Neuromag 시스템 (ex. 샘플 데이터를 기록하는 데 사용)에서 이 "합산 채널"은 일반적으로 ; 최신 시스템에서는 더 일반적이다. 여기에서 원시 데이터 파일의 STIM 채널을 볼 수 있다.

 

raw.copy().pick_types(meg=False, stim=True).plot(start=3, duration=6)

 

(합산 채널) 다른 크기의 펄스를 포함하는 반면 다른 채널의 펄스는 일관된 크기를 가지고 있음을 알 수 있다. 또한 다른 STIM 채널 중 하나에 펄스가 있을 때마다 해당 펄스가 에 있음을 알 수 있다.

 

Converting a STIM channel signal to an Events array

 

데이터에 STIM 채널에 기록된 이벤트가 있는 경우 를 사용하여 이벤트 배열로 변환할 수 있다 (find_events). 각 펄스의 시작 (또는 오프셋)의 샘플 번호는 이벤트 시간으로 기록되고 펄스 크기는 정수로 변환되며 이러한 샘플 번호와 정수 코드 쌍은 (일반적으로 "이벤트 배열"이라고 하거나 "사건"). 가장 간단한 형태의 함수는 객체와 이벤트를 읽을 채널 이름만 필요하다.

 

events = mne.find_events(raw, stim_channel='STI 014')
print(events[:5])  # show the first 5
---
86 events found
Event IDs: [ 1  2  3  4  5 32]
[[27977     0     2]
 [28345     0     3]
 [28771     0     1]
 [29219     0     4]
 [29652     0     2]]

 

STIM 채널의 이름을 제공하지 않으면 변수 등 find_events 대한 MNE-Python 구성 변수를 찾는다. 이러한 변수가 없으면 채널  시도되고 "STIM" 유형이 있는 첫 번째 채널이 온다. STIM 채널 이름이 다른 여러 MEG 시스템의 데이터로 정기적으로 작업하는 경우 구성 변수를 설정하는 것은 유용하지 않을 수 있지만 데이터가 모두 단일 시스템의 데이터인 경우 해당 변수를 한 번 구성하면 시간을 절약할 수 있다.

 

find_events 이벤트를 STIM 채널 펄스의 시작 또는 오프셋에 정렬하고, 최소 펄스 지속 시간을 설정하고, 연속 펄스를 처리하는 옵션을 포함하여 여러 옵션이 있다. 예를 들어, output='step'에 전달하여 이벤트 기간을 효과적으로 인코딩할 수 있다.

 

https://mne.tools/stable/auto_tutorials/intro/20_events_from_raw.html

 

Parsing events from raw data — MNE 1.0.0 documentation

This tutorial describes how to read experimental events from raw recordings, and how to convert between the two different representations of events within MNE-Python (Events arrays and Annotations objects). In the introductory tutorial we saw an example of

mne.tools

 

728x90
반응형
LIST