initial commit
45
README.md
@@ -1,3 +1,44 @@
|
||||
# flares
|
||||
FLARES (fNIRS Lightweight Analysis, Research, & Evaluation Suite)
|
||||
=================================================================
|
||||
|
||||
fNIRS Lightweight Analysis, Research, & Evaluation Suite
|
||||
FLARES is a lightweight standalone application to extract meaningful data out of .snirf files.
|
||||
|
||||
FLARES is free and open-source software that runs on Windows, MacOS, and Linux. Please read the information regarding each operating system below.
|
||||
|
||||
Visit the official [FLARES web site](https://research.dezeeuw.ca/flares).
|
||||
|
||||
[](https://www.python.org)
|
||||
|
||||
# For MacOS Users
|
||||
|
||||
Due to the cost of an Apple Developer account, the application is not certified by Apple. Once the application is extracted and attempted to be launched for the first time you will get a popup stating:
|
||||
|
||||
"Apple could not verify flares.app is free of malware that may harm your Mac or compromise your privacy.", with the options of "Done" or "Move to Trash".
|
||||
|
||||
The solution around this is to use finder and navigate to the flares-darwin folder. Once the folder has been located, right click the folder and click the option "New Terminal at Folder". Once the terminal opens, run the following command (you can copy + paste):
|
||||
|
||||
```xattr -dr com.apple.quarantine flares.app & pid1=$!; xattr -dr com.apple.quarantine flares_updater.app & pid2=$!; wait $pid1 $pid2; exit```
|
||||
|
||||
Once the command has been executed and the text "[Process completed]" appears, you may close the terminal window and attempt to open the application again. If you choose to unrestrict the app through Settings > Privacy & Security, the app may not be able to update correctly in the future.
|
||||
|
||||
This only applies for the first time you attempt to run FLARES. Subsequent times, including after updates, will function correctly as-is.
|
||||
|
||||
# For Windows Users
|
||||
|
||||
Due to the cost of a code signing certificate, the application is not digitally signed. Once the application is extracted and attempted to be launched for the first time you will get a popup stating:
|
||||
|
||||
"Windows protected your PC - Microsoft Defender SmartScreen prevented an unrecognized app from starting. Running this app might put your PC at risk.", with the options of" More info" or "Don't run".
|
||||
|
||||
The solution around this is to click "More info" and then select "Run anyway".
|
||||
|
||||
This only applies for the first time you attempt to run FLARES. Subsequent times, including after updates, will function correctly as-is.
|
||||
|
||||
# For Linux Users
|
||||
|
||||
There are no conditions for Linux users at this time.
|
||||
|
||||
# Licence
|
||||
|
||||
FLARES is distributed under the GPL-3.0 license.
|
||||
|
||||
Copyright (C) 2025 Tyler de Zeeuw
|
||||
4074
fNIRS_module.py
Normal file
255
flares_updater.py
Normal file
@@ -0,0 +1,255 @@
|
||||
"""
|
||||
Filename: flares_updater.py
|
||||
Description: FLARES updater executable
|
||||
|
||||
Author: Tyler de Zeeuw
|
||||
License: GPL-3.0
|
||||
"""
|
||||
|
||||
# Built-in imports
|
||||
import os
|
||||
import sys
|
||||
import time
|
||||
import shlex
|
||||
import psutil
|
||||
import shutil
|
||||
import platform
|
||||
import subprocess
|
||||
from datetime import datetime
|
||||
|
||||
PLATFORM_NAME = platform.system().lower()
|
||||
|
||||
if PLATFORM_NAME == 'darwin':
|
||||
LOG_FILE = os.path.join(os.path.dirname(sys.executable), "../../../flares_updater.log")
|
||||
else:
|
||||
LOG_FILE = os.path.join(os.getcwd(), "flares_updater.log")
|
||||
|
||||
|
||||
def log(msg):
|
||||
with open(LOG_FILE, "a", encoding="utf-8") as f:
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
f.write(f"{timestamp} - {msg}\n")
|
||||
|
||||
|
||||
def kill_all_processes_by_executable(exe_path):
|
||||
terminated_any = False
|
||||
exe_path = os.path.realpath(exe_path)
|
||||
|
||||
if PLATFORM_NAME == 'windows':
|
||||
for proc in psutil.process_iter(['pid', 'exe']):
|
||||
try:
|
||||
proc_exe = proc.info.get('exe')
|
||||
if proc_exe and os.path.samefile(os.path.realpath(proc_exe), exe_path):
|
||||
log(f"Terminating process: PID {proc.pid}")
|
||||
_terminate_process(proc)
|
||||
terminated_any = True
|
||||
except Exception as e:
|
||||
log(f"Error terminating process (Windows): {e}")
|
||||
elif PLATFORM_NAME == 'linux':
|
||||
for proc in psutil.process_iter(['pid', 'cmdline']):
|
||||
try:
|
||||
cmdline = proc.info.get('cmdline', [])
|
||||
if cmdline:
|
||||
proc_cmd = os.path.realpath(cmdline[0])
|
||||
if os.path.samefile(proc_cmd, exe_path):
|
||||
log(f"Terminating process: PID {proc.pid}")
|
||||
_terminate_process(proc)
|
||||
terminated_any = True
|
||||
except Exception as e:
|
||||
log(f"Error terminating process (Linux): {e}")
|
||||
|
||||
if not terminated_any:
|
||||
log(f"No running processes found for {exe_path}")
|
||||
return terminated_any
|
||||
|
||||
|
||||
def _terminate_process(proc):
|
||||
try:
|
||||
proc.terminate()
|
||||
proc.wait(timeout=10)
|
||||
log(f"Process {proc.pid} terminated gracefully.")
|
||||
except psutil.TimeoutExpired:
|
||||
log(f"Process {proc.pid} did not terminate in time. Killing forcefully.")
|
||||
proc.kill()
|
||||
proc.wait(timeout=5)
|
||||
log(f"Process {proc.pid} killed.")
|
||||
|
||||
|
||||
def wait_for_unlock(path, timeout=100):
|
||||
start_time = time.time()
|
||||
while time.time() - start_time < timeout:
|
||||
try:
|
||||
if os.path.isdir(path):
|
||||
shutil.rmtree(path)
|
||||
else:
|
||||
os.remove(path)
|
||||
log(f"Deleted (after wait): {path}")
|
||||
return
|
||||
except Exception as e:
|
||||
log(f"Still locked: {path} - {e}")
|
||||
time.sleep(1)
|
||||
log(f"Failed to delete after wait: {path}")
|
||||
|
||||
|
||||
def delete_path(path):
|
||||
if os.path.exists(path):
|
||||
try:
|
||||
if os.path.isdir(path):
|
||||
shutil.rmtree(path)
|
||||
log(f"Deleted directory: {path}")
|
||||
else:
|
||||
os.remove(path)
|
||||
log(f"Deleted file: {path}")
|
||||
except Exception as e:
|
||||
log(f"Error deleting {path}: {e}")
|
||||
|
||||
|
||||
def copy_update_files(src_folder, dest_folder, updater_name):
|
||||
for item in os.listdir(src_folder):
|
||||
if item.lower() == updater_name.lower():
|
||||
log(f"Skipping updater executable: {item}")
|
||||
continue
|
||||
s = os.path.join(src_folder, item)
|
||||
d = os.path.join(dest_folder, item)
|
||||
delete_path(d)
|
||||
try:
|
||||
if os.path.isdir(s):
|
||||
shutil.copytree(s, d)
|
||||
log(f"Copied folder: {s} -> {d}")
|
||||
else:
|
||||
shutil.copy2(s, d)
|
||||
log(f"Copied file: {s} -> {d}")
|
||||
except Exception as e:
|
||||
log(f"Error copying {s} -> {d}: {e}")
|
||||
|
||||
|
||||
def copy_update_files_darwin(src_folder, dest_folder, updater_name):
|
||||
|
||||
updater_name = updater_name + ".app"
|
||||
|
||||
for item in os.listdir(src_folder):
|
||||
if item.lower() == updater_name.lower():
|
||||
log(f"Skipping updater executable: {item}")
|
||||
continue
|
||||
s = os.path.join(src_folder, item)
|
||||
d = os.path.join(dest_folder, item)
|
||||
delete_path(d)
|
||||
try:
|
||||
if os.path.isdir(s):
|
||||
subprocess.check_call(["ditto", s, d])
|
||||
log(f"Copied folder with ditto: {s} -> {d}")
|
||||
else:
|
||||
shutil.copy2(s, d)
|
||||
log(f"Copied file: {s} -> {d}")
|
||||
except Exception as e:
|
||||
log(f"Error copying {s} -> {d}: {e}")
|
||||
|
||||
|
||||
def remove_quarantine(app_path):
|
||||
script = f'''
|
||||
do shell script "xattr -d -r com.apple.quarantine {shlex.quote(app_path)}" with administrator privileges with prompt "FLARES needs privileges to finish the update. (1/2)"
|
||||
'''
|
||||
try:
|
||||
subprocess.run(['osascript', '-e', script], check=True)
|
||||
print("✅ Quarantine attribute removed.")
|
||||
except subprocess.CalledProcessError as e:
|
||||
print("❌ Failed to remove quarantine attribute.")
|
||||
print(e)
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
log(f"[Updater] sys.argv: {sys.argv}")
|
||||
|
||||
if len(sys.argv) != 3:
|
||||
log("Invalid arguments. Usage: flares_updater <update_folder> <main_app_executable>")
|
||||
sys.exit(1)
|
||||
|
||||
update_folder = sys.argv[1]
|
||||
main_exe = sys.argv[2]
|
||||
|
||||
# Interesting naming convention
|
||||
parent_dir = os.path.dirname(os.path.abspath(main_exe))
|
||||
pparent_dir = os.path.dirname(parent_dir)
|
||||
ppparent_dir = os.path.dirname(pparent_dir)
|
||||
pppparent_dir = os.path.dirname(ppparent_dir)
|
||||
|
||||
updater_name = os.path.basename(sys.argv[0])
|
||||
|
||||
log("Updater started.")
|
||||
log(f"Update folder: {update_folder}")
|
||||
log(f"Main EXE: {main_exe}")
|
||||
log(f"Updater EXE: {updater_name}")
|
||||
if PLATFORM_NAME == 'darwin':
|
||||
log(f"Main App Folder: {ppparent_dir}")
|
||||
|
||||
# Kill all instances of main app
|
||||
kill_all_processes_by_executable(main_exe)
|
||||
|
||||
# Wait until main_exe process is fully gone (polling)
|
||||
for _ in range(20): # wait max 10 seconds
|
||||
running = False
|
||||
for proc in psutil.process_iter(['exe', 'cmdline']):
|
||||
try:
|
||||
if PLATFORM_NAME == 'windows':
|
||||
proc_exe = proc.info.get('exe')
|
||||
if proc_exe and os.path.samefile(os.path.realpath(proc_exe), os.path.realpath(main_exe)):
|
||||
running = True
|
||||
break
|
||||
elif PLATFORM_NAME == 'linux':
|
||||
cmdline = proc.info.get('cmdline', [])
|
||||
if cmdline:
|
||||
proc_cmd = os.path.realpath(cmdline[0])
|
||||
if os.path.samefile(proc_cmd, os.path.realpath(main_exe)):
|
||||
running = True
|
||||
break
|
||||
except Exception as e:
|
||||
log(f"Polling error: {e}")
|
||||
if not running:
|
||||
break
|
||||
time.sleep(0.5)
|
||||
else:
|
||||
log("Warning: main executable still running after wait timeout.")
|
||||
|
||||
# Delete old version files
|
||||
if PLATFORM_NAME == 'darwin':
|
||||
log(f'Attempting to delete {ppparent_dir}')
|
||||
delete_path(ppparent_dir)
|
||||
update_folder = os.path.join(sys.argv[1], "flares-darwin")
|
||||
copy_update_files_darwin(update_folder, pppparent_dir, updater_name)
|
||||
|
||||
else:
|
||||
delete_path(main_exe)
|
||||
wait_for_unlock(os.path.join(parent_dir, "_internal"))
|
||||
|
||||
# Copy new files excluding the updater itself
|
||||
copy_update_files(update_folder, parent_dir, updater_name)
|
||||
|
||||
except Exception as e:
|
||||
log(f"Something went wrong: {e}")
|
||||
|
||||
# Relaunch main app
|
||||
try:
|
||||
if PLATFORM_NAME == 'linux':
|
||||
os.chmod(main_exe, 0o755)
|
||||
log("Added executable bit")
|
||||
|
||||
if PLATFORM_NAME == 'darwin':
|
||||
os.chmod(ppparent_dir, 0o755)
|
||||
log("Added executable bit")
|
||||
remove_quarantine(ppparent_dir)
|
||||
log(f"Removed the quarantine flag on {ppparent_dir}")
|
||||
subprocess.Popen(['open', ppparent_dir, "--args", "--finish-update"])
|
||||
else:
|
||||
subprocess.Popen([main_exe, "--finish-update"], cwd=parent_dir)
|
||||
|
||||
log("Relaunched main app.")
|
||||
except Exception as e:
|
||||
log(f"Failed to relaunch main app: {e}")
|
||||
|
||||
log("Updater completed. Exiting.")
|
||||
sys.exit(0)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
1
icons/article_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-5 14H7v-2h7v2zm3-4H7v-2h10v2zm0-4H7V7h10v2z"/></svg>
|
||||
|
After Width: | Height: | Size: 278 B |
1
icons/content_copy_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M16 1H4c-1.1 0-2 .9-2 2v14h2V3h12V1zm3 4H8c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h11c1.1 0 2-.9 2-2V7c0-1.1-.9-2-2-2zm0 16H8V7h11v14z"/></svg>
|
||||
|
After Width: | Height: | Size: 284 B |
1
icons/content_cut_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><circle cx="6" cy="18" fill="none" r="2"/><circle cx="12" cy="12" fill="none" r=".5"/><circle cx="6" cy="6" fill="none" r="2"/><path d="M9.64 7.64c.23-.5.36-1.05.36-1.64 0-2.21-1.79-4-4-4S2 3.79 2 6s1.79 4 4 4c.59 0 1.14-.13 1.64-.36L10 12l-2.36 2.36C7.14 14.13 6.59 14 6 14c-2.21 0-4 1.79-4 4s1.79 4 4 4 4-1.79 4-4c0-.59-.13-1.14-.36-1.64L12 14l7 7h3v-1L9.64 7.64zM6 8c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm0 12c-1.1 0-2-.89-2-2s.9-2 2-2 2 .89 2 2-.9 2-2 2zm6-7.5c-.28 0-.5-.22-.5-.5s.22-.5.5-.5.5.22.5.5-.22.5-.5.5zM19 3l-6 6 2 2 7-7V3z"/></svg>
|
||||
|
After Width: | Height: | Size: 694 B |
1
icons/content_paste_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M19 2h-4.18C14.4.84 13.3 0 12 0c-1.3 0-2.4.84-2.82 2H5c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm-7 0c.55 0 1 .45 1 1s-.45 1-1 1-1-.45-1-1 .45-1 1-1zm7 18H5V4h2v3h10V4h2v16z"/></svg>
|
||||
|
After Width: | Height: | Size: 357 B |
2
icons/desktop.ini
Normal file
@@ -0,0 +1,2 @@
|
||||
[LocalizedFileNames]
|
||||
updater.png=@updater.png,0
|
||||
1
icons/exit_to_app_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M10.09 15.59L11.5 17l5-5-5-5-1.41 1.41L12.67 11H3v2h9.67l-2.58 2.59zM19 3H5c-1.11 0-2 .9-2 2v4h2V5h14v14H5v-4H3v4c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2z"/></svg>
|
||||
|
After Width: | Height: | Size: 321 B |
1
icons/file_open_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><g><rect fill="none" height="24" width="24"/></g><g><path d="M14,2H6C4.9,2,4,2.9,4,4v16c0,1.1,0.89,2,1.99,2H15v-8h5V8L14,2z M13,9V3.5L18.5,9H13z M17,21.66V16h5.66v2h-2.24 l2.95,2.95l-1.41,1.41L19,19.41l0,2.24H17z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 361 B |
1
icons/folder_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 4H4c-1.1 0-1.99.9-1.99 2L2 18c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V8c0-1.1-.9-2-2-2h-8l-2-2z"/></svg>
|
||||
|
After Width: | Height: | Size: 248 B |
1
icons/folder_copy_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><g><rect fill="none" height="24" width="24"/></g><g><g><path d="M3,6H1v13c0,1.1,0.9,2,2,2h17v-2H3V6z"/><path d="M21,4h-7l-2-2H7C5.9,2,5.01,2.9,5.01,4L5,15c0,1.1,0.9,2,2,2h14c1.1,0,2-0.9,2-2V6C23,4.9,22.1,4,21,4z"/></g></g></svg>
|
||||
|
After Width: | Height: | Size: 364 B |
1
icons/help_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 17h-2v-2h2v2zm2.07-7.75l-.9.92C13.45 12.9 13 13.5 13 15h-2v-.5c0-1.1.45-2.1 1.17-2.83l1.24-1.26c.37-.36.59-.86.59-1.41 0-1.1-.9-2-2-2s-2 .9-2 2H8c0-2.21 1.79-4 4-4s4 1.79 4 4c0 .88-.36 1.68-.93 2.25z"/></svg>
|
||||
|
After Width: | Height: | Size: 425 B |
1
icons/info_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm1 15h-2v-6h2v6zm0-8h-2V7h2v2z"/></svg>
|
||||
|
After Width: | Height: | Size: 253 B |
BIN
icons/main.icns
Normal file
BIN
icons/main.ico
Normal file
|
After Width: | Height: | Size: 214 KiB |
1
icons/save_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><path d="M0 0h24v24H0z" fill="none"/><path d="M17 3H5c-1.11 0-2 .9-2 2v14c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V7l-4-4zm-5 16c-1.66 0-3-1.34-3-3s1.34-3 3-3 3 1.34 3 3-1.34 3-3 3zm3-10H5V5h10v4z"/></svg>
|
||||
|
After Width: | Height: | Size: 299 B |
1
icons/save_as_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><g><rect fill="none" height="24" width="24"/></g><g><path d="M21,12.4V7l-4-4H5C3.89,3,3,3.9,3,5v14c0,1.1,0.89,2,2,2h7.4L21,12.4z M15,15c0,1.66-1.34,3-3,3s-3-1.34-3-3s1.34-3,3-3 S15,13.34,15,15z M6,6h9v4H6V6z M19.99,16.25l1.77,1.77L16.77,23H15v-1.77L19.99,16.25z M23.25,16.51l-0.85,0.85l-1.77-1.77 l0.85-0.85c0.2-0.2,0.51-0.2,0.71,0l1.06,1.06C23.45,16,23.45,16.32,23.25,16.51z"/></g></svg>
|
||||
|
After Width: | Height: | Size: 524 B |
1
icons/update_24dp_1F1F1F.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#1f1f1f"><g><rect fill="none" height="24" width="24" x="0"/></g><g><g><g><path d="M21,10.12h-6.78l2.74-2.82c-2.73-2.7-7.15-2.8-9.88-0.1c-2.73,2.71-2.73,7.08,0,9.79s7.15,2.71,9.88,0 C18.32,15.65,19,14.08,19,12.1h2c0,1.98-0.88,4.55-2.64,6.29c-3.51,3.48-9.21,3.48-12.72,0c-3.5-3.47-3.53-9.11-0.02-12.58 s9.14-3.47,12.65,0L21,3V10.12z M12.5,8v4.25l3.5,2.08l-0.72,1.21L11,13V8H12.5z"/></g></g></g></svg>
|
||||
|
After Width: | Height: | Size: 525 B |
BIN
icons/updater.icns
Normal file
BIN
icons/updater.ico
Normal file
|
After Width: | Height: | Size: 208 KiB |
36
mne/__init__.py
Normal file
@@ -0,0 +1,36 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
"""MNE software for MEG and EEG data analysis."""
|
||||
# PEP0440 compatible formatted version, see:
|
||||
# https://www.python.org/dev/peps/pep-0440/
|
||||
#
|
||||
# Generic release markers:
|
||||
# X.Y
|
||||
# X.Y.Z # For bugfix releases
|
||||
#
|
||||
# Admissible pre-release markers:
|
||||
# X.YaN # Alpha release
|
||||
# X.YbN # Beta release
|
||||
# X.YrcN # Release Candidate
|
||||
# X.Y # Final release
|
||||
#
|
||||
# Dev branch marker is: 'X.Y.devN' where N is an integer.
|
||||
#
|
||||
import lazy_loader as lazy
|
||||
|
||||
try:
|
||||
from importlib.metadata import version
|
||||
|
||||
__version__ = version("mne")
|
||||
except Exception:
|
||||
__version__ = "0.0.0"
|
||||
|
||||
(__getattr__, __dir__, __all__) = lazy.attach_stub(__name__, __file__)
|
||||
|
||||
# initialize logging
|
||||
from .utils import set_log_level, set_log_file
|
||||
|
||||
set_log_level(None, False)
|
||||
set_log_file()
|
||||
430
mne/__init__.pyi
Normal file
@@ -0,0 +1,430 @@
|
||||
__all__ = [
|
||||
"AcqParserFIF",
|
||||
"Annotations",
|
||||
"BaseEpochs",
|
||||
"BiHemiLabel",
|
||||
"Covariance",
|
||||
"Dipole",
|
||||
"DipoleFixed",
|
||||
"Epochs",
|
||||
"EpochsArray",
|
||||
"Evoked",
|
||||
"EvokedArray",
|
||||
"Forward",
|
||||
"Info",
|
||||
"Label",
|
||||
"MixedSourceEstimate",
|
||||
"MixedVectorSourceEstimate",
|
||||
"Projection",
|
||||
"Report",
|
||||
"SourceEstimate",
|
||||
"SourceMorph",
|
||||
"SourceSpaces",
|
||||
"Transform",
|
||||
"VectorSourceEstimate",
|
||||
"VolSourceEstimate",
|
||||
"VolVectorSourceEstimate",
|
||||
"add_reference_channels",
|
||||
"add_source_space_distances",
|
||||
"annotations_from_events",
|
||||
"apply_forward",
|
||||
"apply_forward_raw",
|
||||
"average_forward_solutions",
|
||||
"beamformer",
|
||||
"channel_indices_by_type",
|
||||
"channel_type",
|
||||
"channels",
|
||||
"chpi",
|
||||
"combine_evoked",
|
||||
"commands",
|
||||
"compute_covariance",
|
||||
"compute_proj_epochs",
|
||||
"compute_proj_evoked",
|
||||
"compute_proj_raw",
|
||||
"compute_rank",
|
||||
"compute_raw_covariance",
|
||||
"compute_source_morph",
|
||||
"concatenate_epochs",
|
||||
"concatenate_events",
|
||||
"concatenate_raws",
|
||||
"convert_forward_solution",
|
||||
"coreg",
|
||||
"count_annotations",
|
||||
"count_events",
|
||||
"create_default_subject",
|
||||
"create_info",
|
||||
"cuda",
|
||||
"datasets",
|
||||
"decimate_surface",
|
||||
"decoding",
|
||||
"defaults",
|
||||
"dig_mri_distances",
|
||||
"dipole",
|
||||
"epochs",
|
||||
"equalize_channels",
|
||||
"event",
|
||||
"events_from_annotations",
|
||||
"export",
|
||||
"extract_label_time_course",
|
||||
"filter",
|
||||
"find_events",
|
||||
"find_layout",
|
||||
"find_stim_steps",
|
||||
"fit_dipole",
|
||||
"forward",
|
||||
"get_config",
|
||||
"get_config_path",
|
||||
"get_head_surf",
|
||||
"get_meg_helmet_surf",
|
||||
"get_montage_volume_labels",
|
||||
"get_volume_labels_from_aseg",
|
||||
"get_volume_labels_from_src",
|
||||
"grade_to_tris",
|
||||
"grade_to_vertices",
|
||||
"grand_average",
|
||||
"grow_labels",
|
||||
"gui",
|
||||
"head_to_mni",
|
||||
"head_to_mri",
|
||||
"inverse_sparse",
|
||||
"io",
|
||||
"label_sign_flip",
|
||||
"labels_to_stc",
|
||||
"make_ad_hoc_cov",
|
||||
"make_bem_model",
|
||||
"make_bem_solution",
|
||||
"make_field_map",
|
||||
"make_fixed_length_epochs",
|
||||
"make_fixed_length_events",
|
||||
"make_forward_dipole",
|
||||
"make_forward_solution",
|
||||
"make_sphere_model",
|
||||
"match_channel_orders",
|
||||
"merge_events",
|
||||
"minimum_norm",
|
||||
"morph_labels",
|
||||
"morph_source_spaces",
|
||||
"open_docs",
|
||||
"open_report",
|
||||
"parse_config",
|
||||
"pick_channels",
|
||||
"pick_channels_cov",
|
||||
"pick_channels_forward",
|
||||
"pick_channels_regexp",
|
||||
"pick_events",
|
||||
"pick_info",
|
||||
"pick_types",
|
||||
"pick_types_forward",
|
||||
"preprocessing",
|
||||
"random_parcellation",
|
||||
"read_annotations",
|
||||
"read_bem_solution",
|
||||
"read_bem_surfaces",
|
||||
"read_cov",
|
||||
"read_dipole",
|
||||
"read_epochs",
|
||||
"read_epochs_eeglab",
|
||||
"read_epochs_fieldtrip",
|
||||
"read_epochs_kit",
|
||||
"read_events",
|
||||
"read_evoked_besa",
|
||||
"read_evoked_fieldtrip",
|
||||
"read_evokeds",
|
||||
"read_evokeds_mff",
|
||||
"read_forward_solution",
|
||||
"read_freesurfer_lut",
|
||||
"read_label",
|
||||
"read_labels_from_annot",
|
||||
"read_lta",
|
||||
"read_morph_map",
|
||||
"read_proj",
|
||||
"read_reject_parameters",
|
||||
"read_source_estimate",
|
||||
"read_source_morph",
|
||||
"read_source_spaces",
|
||||
"read_surface",
|
||||
"read_talxfm",
|
||||
"read_trans",
|
||||
"read_tri",
|
||||
"read_vectorview_selection",
|
||||
"rename_channels",
|
||||
"report",
|
||||
"scale_bem",
|
||||
"scale_labels",
|
||||
"scale_mri",
|
||||
"scale_source_space",
|
||||
"sensitivity_map",
|
||||
"set_bipolar_reference",
|
||||
"set_cache_dir",
|
||||
"set_config",
|
||||
"set_eeg_reference",
|
||||
"set_log_file",
|
||||
"set_log_level",
|
||||
"set_memmap_min_size",
|
||||
"setup_source_space",
|
||||
"setup_volume_source_space",
|
||||
"simulation",
|
||||
"source_space",
|
||||
"spatial_dist_adjacency",
|
||||
"spatial_inter_hemi_adjacency",
|
||||
"spatial_src_adjacency",
|
||||
"spatial_tris_adjacency",
|
||||
"spatio_temporal_dist_adjacency",
|
||||
"spatio_temporal_src_adjacency",
|
||||
"spatio_temporal_tris_adjacency",
|
||||
"split_label",
|
||||
"stats",
|
||||
"stc_near_sensors",
|
||||
"stc_to_label",
|
||||
"surface",
|
||||
"sys_info",
|
||||
"time_frequency",
|
||||
"transform_surface_to",
|
||||
"use_coil_def",
|
||||
"use_log_level",
|
||||
"verbose",
|
||||
"vertex_to_mni",
|
||||
"viz",
|
||||
"what",
|
||||
"whiten_evoked",
|
||||
"write_bem_solution",
|
||||
"write_bem_surfaces",
|
||||
"write_cov",
|
||||
"write_events",
|
||||
"write_evokeds",
|
||||
"write_forward_solution",
|
||||
"write_head_bem",
|
||||
"write_label",
|
||||
"write_labels_to_annot",
|
||||
"write_proj",
|
||||
"write_source_spaces",
|
||||
"write_surface",
|
||||
"write_trans",
|
||||
]
|
||||
from . import (
|
||||
beamformer,
|
||||
channels,
|
||||
chpi,
|
||||
commands,
|
||||
coreg,
|
||||
cuda,
|
||||
datasets,
|
||||
decoding,
|
||||
defaults,
|
||||
dipole,
|
||||
epochs,
|
||||
event,
|
||||
export,
|
||||
filter,
|
||||
forward,
|
||||
gui,
|
||||
inverse_sparse,
|
||||
io,
|
||||
minimum_norm,
|
||||
preprocessing,
|
||||
report,
|
||||
simulation,
|
||||
source_space,
|
||||
stats,
|
||||
surface,
|
||||
time_frequency,
|
||||
viz,
|
||||
)
|
||||
from ._fiff.meas_info import Info, create_info
|
||||
from ._fiff.pick import (
|
||||
channel_indices_by_type,
|
||||
channel_type,
|
||||
pick_channels,
|
||||
pick_channels_cov,
|
||||
pick_channels_forward,
|
||||
pick_channels_regexp,
|
||||
pick_info,
|
||||
pick_types,
|
||||
pick_types_forward,
|
||||
)
|
||||
from ._fiff.proj import Projection
|
||||
from ._fiff.reference import (
|
||||
add_reference_channels,
|
||||
set_bipolar_reference,
|
||||
set_eeg_reference,
|
||||
)
|
||||
from ._fiff.what import what
|
||||
from ._freesurfer import (
|
||||
get_volume_labels_from_aseg,
|
||||
head_to_mni,
|
||||
head_to_mri,
|
||||
read_freesurfer_lut,
|
||||
read_lta,
|
||||
read_talxfm,
|
||||
vertex_to_mni,
|
||||
)
|
||||
from .annotations import (
|
||||
Annotations,
|
||||
annotations_from_events,
|
||||
count_annotations,
|
||||
events_from_annotations,
|
||||
read_annotations,
|
||||
)
|
||||
from .bem import (
|
||||
make_bem_model,
|
||||
make_bem_solution,
|
||||
make_sphere_model,
|
||||
read_bem_solution,
|
||||
read_bem_surfaces,
|
||||
write_bem_solution,
|
||||
write_bem_surfaces,
|
||||
write_head_bem,
|
||||
)
|
||||
from .channels import (
|
||||
equalize_channels,
|
||||
find_layout,
|
||||
read_vectorview_selection,
|
||||
rename_channels,
|
||||
)
|
||||
from .coreg import (
|
||||
create_default_subject,
|
||||
scale_bem,
|
||||
scale_labels,
|
||||
scale_mri,
|
||||
scale_source_space,
|
||||
)
|
||||
from .cov import (
|
||||
Covariance,
|
||||
compute_covariance,
|
||||
compute_raw_covariance,
|
||||
make_ad_hoc_cov,
|
||||
read_cov,
|
||||
whiten_evoked,
|
||||
write_cov,
|
||||
)
|
||||
from .dipole import Dipole, DipoleFixed, fit_dipole, read_dipole
|
||||
from .epochs import (
|
||||
BaseEpochs,
|
||||
Epochs,
|
||||
EpochsArray,
|
||||
concatenate_epochs,
|
||||
make_fixed_length_epochs,
|
||||
read_epochs,
|
||||
)
|
||||
from .event import (
|
||||
AcqParserFIF,
|
||||
concatenate_events,
|
||||
count_events,
|
||||
find_events,
|
||||
find_stim_steps,
|
||||
make_fixed_length_events,
|
||||
merge_events,
|
||||
pick_events,
|
||||
read_events,
|
||||
write_events,
|
||||
)
|
||||
from .evoked import Evoked, EvokedArray, combine_evoked, read_evokeds, write_evokeds
|
||||
from .forward import (
|
||||
Forward,
|
||||
apply_forward,
|
||||
apply_forward_raw,
|
||||
average_forward_solutions,
|
||||
convert_forward_solution,
|
||||
make_field_map,
|
||||
make_forward_dipole,
|
||||
make_forward_solution,
|
||||
read_forward_solution,
|
||||
use_coil_def,
|
||||
write_forward_solution,
|
||||
)
|
||||
from .io import (
|
||||
read_epochs_fieldtrip,
|
||||
read_evoked_besa,
|
||||
read_evoked_fieldtrip,
|
||||
read_evokeds_mff,
|
||||
)
|
||||
from .io.base import concatenate_raws, match_channel_orders
|
||||
from .io.eeglab import read_epochs_eeglab
|
||||
from .io.kit import read_epochs_kit
|
||||
from .label import (
|
||||
BiHemiLabel,
|
||||
Label,
|
||||
grow_labels,
|
||||
label_sign_flip,
|
||||
labels_to_stc,
|
||||
morph_labels,
|
||||
random_parcellation,
|
||||
read_label,
|
||||
read_labels_from_annot,
|
||||
split_label,
|
||||
stc_to_label,
|
||||
write_label,
|
||||
write_labels_to_annot,
|
||||
)
|
||||
from .misc import parse_config, read_reject_parameters
|
||||
from .morph import (
|
||||
SourceMorph,
|
||||
compute_source_morph,
|
||||
grade_to_vertices,
|
||||
read_source_morph,
|
||||
)
|
||||
from .morph_map import read_morph_map
|
||||
from .proj import (
|
||||
compute_proj_epochs,
|
||||
compute_proj_evoked,
|
||||
compute_proj_raw,
|
||||
read_proj,
|
||||
sensitivity_map,
|
||||
write_proj,
|
||||
)
|
||||
from .rank import compute_rank
|
||||
from .report import Report, open_report
|
||||
from .source_estimate import (
|
||||
MixedSourceEstimate,
|
||||
MixedVectorSourceEstimate,
|
||||
SourceEstimate,
|
||||
VectorSourceEstimate,
|
||||
VolSourceEstimate,
|
||||
VolVectorSourceEstimate,
|
||||
extract_label_time_course,
|
||||
grade_to_tris,
|
||||
read_source_estimate,
|
||||
spatial_dist_adjacency,
|
||||
spatial_inter_hemi_adjacency,
|
||||
spatial_src_adjacency,
|
||||
spatial_tris_adjacency,
|
||||
spatio_temporal_dist_adjacency,
|
||||
spatio_temporal_src_adjacency,
|
||||
spatio_temporal_tris_adjacency,
|
||||
stc_near_sensors,
|
||||
)
|
||||
from .source_space._source_space import (
|
||||
SourceSpaces,
|
||||
add_source_space_distances,
|
||||
get_volume_labels_from_src,
|
||||
morph_source_spaces,
|
||||
read_source_spaces,
|
||||
setup_source_space,
|
||||
setup_volume_source_space,
|
||||
write_source_spaces,
|
||||
)
|
||||
from .surface import (
|
||||
decimate_surface,
|
||||
dig_mri_distances,
|
||||
get_head_surf,
|
||||
get_meg_helmet_surf,
|
||||
get_montage_volume_labels,
|
||||
read_surface,
|
||||
read_tri,
|
||||
write_surface,
|
||||
)
|
||||
from .transforms import Transform, read_trans, transform_surface_to, write_trans
|
||||
from .utils import (
|
||||
get_config,
|
||||
get_config_path,
|
||||
grand_average,
|
||||
open_docs,
|
||||
set_cache_dir,
|
||||
set_config,
|
||||
set_log_file,
|
||||
set_log_level,
|
||||
set_memmap_min_size,
|
||||
sys_info,
|
||||
use_log_level,
|
||||
verbose,
|
||||
)
|
||||
8
mne/__main__.py
Normal file
@@ -0,0 +1,8 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
from .commands.utils import main
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
8
mne/_fiff/__init__.py
Normal file
@@ -0,0 +1,8 @@
|
||||
"""Private module for FIF basic I/O routines."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
# All imports should be done directly to submodules, so we don't import
|
||||
# anything here or use lazy_loader.
|
||||
605
mne/_fiff/_digitization.py
Normal file
@@ -0,0 +1,605 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import heapq
|
||||
from collections import Counter
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..utils import Bunch, _check_fname, _validate_type, logger, verbose, warn
|
||||
from .constants import FIFF, _coord_frame_named
|
||||
from .tag import read_tag
|
||||
from .tree import dir_tree_find
|
||||
from .write import _safe_name_list, start_and_end_file, write_dig_points
|
||||
|
||||
_dig_kind_dict = {
|
||||
"cardinal": FIFF.FIFFV_POINT_CARDINAL,
|
||||
"hpi": FIFF.FIFFV_POINT_HPI,
|
||||
"eeg": FIFF.FIFFV_POINT_EEG,
|
||||
"extra": FIFF.FIFFV_POINT_EXTRA,
|
||||
}
|
||||
_dig_kind_ints = tuple(sorted(_dig_kind_dict.values()))
|
||||
_dig_kind_proper = {
|
||||
"cardinal": "Cardinal",
|
||||
"hpi": "HPI",
|
||||
"eeg": "EEG",
|
||||
"extra": "Extra",
|
||||
"unknown": "Unknown",
|
||||
}
|
||||
_dig_kind_rev = {val: key for key, val in _dig_kind_dict.items()}
|
||||
_cardinal_kind_rev = {1: "LPA", 2: "Nasion", 3: "RPA", 4: "Inion"}
|
||||
|
||||
|
||||
def _format_dig_points(dig, enforce_order=False):
|
||||
"""Format the dig points nicely."""
|
||||
if enforce_order and dig is not None:
|
||||
# reorder points based on type:
|
||||
# Fiducials/HPI, EEG, extra (headshape)
|
||||
fids_digpoints = []
|
||||
hpi_digpoints = []
|
||||
eeg_digpoints = []
|
||||
extra_digpoints = []
|
||||
head_digpoints = []
|
||||
|
||||
# use a heap to enforce order on FIDS, EEG, Extra
|
||||
for idx, digpoint in enumerate(dig):
|
||||
ident = digpoint["ident"]
|
||||
kind = digpoint["kind"]
|
||||
|
||||
# push onto heap based on 'ident' (for the order) for
|
||||
# each of the possible DigPoint 'kind's
|
||||
# keep track of 'idx' in case of any clashes in
|
||||
# the 'ident' variable, which can occur when
|
||||
# user passes in DigMontage + DigMontage
|
||||
if kind == FIFF.FIFFV_POINT_CARDINAL:
|
||||
heapq.heappush(fids_digpoints, (ident, idx, digpoint))
|
||||
elif kind == FIFF.FIFFV_POINT_HPI:
|
||||
heapq.heappush(hpi_digpoints, (ident, idx, digpoint))
|
||||
elif kind == FIFF.FIFFV_POINT_EEG:
|
||||
heapq.heappush(eeg_digpoints, (ident, idx, digpoint))
|
||||
elif kind == FIFF.FIFFV_POINT_EXTRA:
|
||||
heapq.heappush(extra_digpoints, (ident, idx, digpoint))
|
||||
elif kind == FIFF.FIFFV_POINT_HEAD:
|
||||
heapq.heappush(head_digpoints, (ident, idx, digpoint))
|
||||
|
||||
# now recreate dig based on sorted order
|
||||
fids_digpoints.sort(), hpi_digpoints.sort()
|
||||
eeg_digpoints.sort()
|
||||
extra_digpoints.sort(), head_digpoints.sort()
|
||||
new_dig = []
|
||||
for idx, d in enumerate(
|
||||
fids_digpoints
|
||||
+ hpi_digpoints
|
||||
+ extra_digpoints
|
||||
+ eeg_digpoints
|
||||
+ head_digpoints
|
||||
):
|
||||
new_dig.append(d[-1])
|
||||
dig = new_dig
|
||||
|
||||
return [DigPoint(d) for d in dig] if dig is not None else dig
|
||||
|
||||
|
||||
def _get_dig_eeg(dig):
|
||||
return [d for d in dig if d["kind"] == FIFF.FIFFV_POINT_EEG]
|
||||
|
||||
|
||||
def _count_points_by_type(dig):
|
||||
"""Get the number of points of each type."""
|
||||
occurrences = Counter([d["kind"] for d in dig])
|
||||
return dict(
|
||||
fid=occurrences[FIFF.FIFFV_POINT_CARDINAL],
|
||||
hpi=occurrences[FIFF.FIFFV_POINT_HPI],
|
||||
eeg=occurrences[FIFF.FIFFV_POINT_EEG],
|
||||
extra=occurrences[FIFF.FIFFV_POINT_EXTRA],
|
||||
)
|
||||
|
||||
|
||||
_dig_keys = {"kind", "ident", "r", "coord_frame"}
|
||||
|
||||
|
||||
class DigPoint(dict):
|
||||
"""Container for a digitization point.
|
||||
|
||||
This is a simple subclass of the standard dict type designed to provide
|
||||
a readable string representation.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
kind : int
|
||||
The kind of channel,
|
||||
e.g. ``FIFFV_POINT_EEG``, ``FIFFV_POINT_CARDINAL``.
|
||||
r : array, shape (3,)
|
||||
3D position in m. and coord_frame.
|
||||
ident : int
|
||||
Number specifying the identity of the point.
|
||||
e.g. ``FIFFV_POINT_NASION`` if kind is ``FIFFV_POINT_CARDINAL``,
|
||||
or 42 if kind is ``FIFFV_POINT_EEG``.
|
||||
coord_frame : int
|
||||
The coordinate frame used, e.g. ``FIFFV_COORD_HEAD``.
|
||||
"""
|
||||
|
||||
def __repr__(self): # noqa: D105
|
||||
from ..transforms import _coord_frame_name
|
||||
|
||||
if self["kind"] == FIFF.FIFFV_POINT_CARDINAL:
|
||||
id_ = _cardinal_kind_rev.get(self["ident"], "Unknown cardinal")
|
||||
else:
|
||||
id_ = _dig_kind_proper[_dig_kind_rev.get(self["kind"], "unknown")]
|
||||
id_ = f"{id_} #{self['ident']}"
|
||||
id_ = id_.rjust(10)
|
||||
cf = _coord_frame_name(self["coord_frame"])
|
||||
x, y, z = self["r"]
|
||||
if "voxel" in cf:
|
||||
pos = (f"({x:0.1f}, {y:0.1f}, {z:0.1f})").ljust(25)
|
||||
else:
|
||||
pos = (f"({x * 1e3:0.1f}, {y * 1e3:0.1f}, {z * 1e3:0.1f}) mm").ljust(25)
|
||||
return f"<DigPoint | {id_} : {pos} : {cf} frame>"
|
||||
|
||||
# speed up info copy by only deep copying the mutable item
|
||||
def __deepcopy__(self, memodict):
|
||||
"""Make a deepcopy."""
|
||||
return DigPoint(
|
||||
kind=self["kind"],
|
||||
r=self["r"].copy(),
|
||||
ident=self["ident"],
|
||||
coord_frame=self["coord_frame"],
|
||||
)
|
||||
|
||||
def __eq__(self, other): # noqa: D105
|
||||
"""Compare two DigPoints.
|
||||
|
||||
Two digpoints are equal if they are the same kind, share the same
|
||||
coordinate frame and position.
|
||||
"""
|
||||
my_keys = ["kind", "ident", "coord_frame"]
|
||||
if set(self.keys()) != set(other.keys()):
|
||||
return False
|
||||
elif any(self[_] != other[_] for _ in my_keys):
|
||||
return False
|
||||
else:
|
||||
return np.allclose(self["r"], other["r"])
|
||||
|
||||
|
||||
def _read_dig_fif(fid, meas_info, *, return_ch_names=False):
|
||||
"""Read digitizer data from a FIFF file."""
|
||||
isotrak = dir_tree_find(meas_info, FIFF.FIFFB_ISOTRAK)
|
||||
dig = None
|
||||
ch_names = None
|
||||
if len(isotrak) == 0:
|
||||
logger.info("Isotrak not found")
|
||||
elif len(isotrak) > 1:
|
||||
warn("Multiple Isotrak found")
|
||||
else:
|
||||
isotrak = isotrak[0]
|
||||
coord_frame = FIFF.FIFFV_COORD_HEAD
|
||||
dig = []
|
||||
for k in range(isotrak["nent"]):
|
||||
kind = isotrak["directory"][k].kind
|
||||
pos = isotrak["directory"][k].pos
|
||||
if kind == FIFF.FIFF_DIG_POINT:
|
||||
tag = read_tag(fid, pos)
|
||||
dig.append(tag.data)
|
||||
elif kind == FIFF.FIFF_MNE_COORD_FRAME:
|
||||
tag = read_tag(fid, pos)
|
||||
coord_frame = _coord_frame_named.get(int(tag.data.item()))
|
||||
elif kind == FIFF.FIFF_MNE_CH_NAME_LIST:
|
||||
tag = read_tag(fid, pos)
|
||||
ch_names = _safe_name_list(tag.data, "read", "ch_names")
|
||||
for d in dig:
|
||||
d["coord_frame"] = coord_frame
|
||||
out = _format_dig_points(dig)
|
||||
if return_ch_names:
|
||||
out = (out, ch_names)
|
||||
return out
|
||||
|
||||
|
||||
@verbose
|
||||
def write_dig(
|
||||
fname, pts, coord_frame=None, *, ch_names=None, overwrite=False, verbose=None
|
||||
):
|
||||
"""Write digitization data to a FIF file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like
|
||||
Destination file name.
|
||||
pts : iterator of dict
|
||||
Iterator through digitizer points. Each point is a dictionary with
|
||||
the keys 'kind', 'ident' and 'r'.
|
||||
coord_frame : int | str | None
|
||||
If all the points have the same coordinate frame, specify the type
|
||||
here. Can be None (default) if the points could have varying
|
||||
coordinate frames.
|
||||
ch_names : list of str | None
|
||||
Channel names associated with the digitization points, if available.
|
||||
|
||||
.. versionadded:: 1.9
|
||||
%(overwrite)s
|
||||
|
||||
.. versionadded:: 1.0
|
||||
%(verbose)s
|
||||
|
||||
.. versionadded:: 1.0
|
||||
"""
|
||||
from ..transforms import _to_const
|
||||
|
||||
fname = _check_fname(fname, overwrite=overwrite)
|
||||
if coord_frame is not None:
|
||||
coord_frame = _to_const(coord_frame)
|
||||
pts_frames = {pt.get("coord_frame", coord_frame) for pt in pts}
|
||||
bad_frames = pts_frames - {coord_frame}
|
||||
if len(bad_frames) > 0:
|
||||
raise ValueError(
|
||||
"Points have coord_frame entries that are incompatible with "
|
||||
f"coord_frame={coord_frame}: {tuple(bad_frames)}."
|
||||
)
|
||||
_validate_type(ch_names, (None, list, tuple), "ch_names")
|
||||
if ch_names is not None:
|
||||
for ci, ch_name in enumerate(ch_names):
|
||||
_validate_type(ch_name, str, f"ch_names[{ci}]")
|
||||
|
||||
with start_and_end_file(fname) as fid:
|
||||
write_dig_points(
|
||||
fid, pts, block=True, coord_frame=coord_frame, ch_names=ch_names
|
||||
)
|
||||
|
||||
|
||||
_cardinal_ident_mapping = {
|
||||
FIFF.FIFFV_POINT_NASION: "nasion",
|
||||
FIFF.FIFFV_POINT_LPA: "lpa",
|
||||
FIFF.FIFFV_POINT_RPA: "rpa",
|
||||
}
|
||||
|
||||
|
||||
def _ensure_fiducials_head(dig):
|
||||
# Ensure that there are all three fiducials in the head coord frame
|
||||
fids = dict()
|
||||
for d in dig:
|
||||
if d["kind"] == FIFF.FIFFV_POINT_CARDINAL:
|
||||
name = _cardinal_ident_mapping.get(d["ident"], None)
|
||||
if name is not None:
|
||||
fids[name] = d
|
||||
radius = None
|
||||
mults = dict(
|
||||
lpa=[-1, 0, 0],
|
||||
rpa=[1, 0, 0],
|
||||
nasion=[0, 1, 0],
|
||||
)
|
||||
for ident, name in _cardinal_ident_mapping.items():
|
||||
if name not in fids:
|
||||
if radius is None:
|
||||
radius = [
|
||||
np.linalg.norm(d["r"])
|
||||
for d in dig
|
||||
if d["coord_frame"] == FIFF.FIFFV_COORD_HEAD
|
||||
and not np.isnan(d["r"]).any()
|
||||
]
|
||||
if not radius:
|
||||
return # can't complete, no head points
|
||||
radius = np.mean(radius)
|
||||
dig.append(
|
||||
DigPoint(
|
||||
kind=FIFF.FIFFV_POINT_CARDINAL,
|
||||
ident=ident,
|
||||
r=np.array(mults[name], float) * radius,
|
||||
coord_frame=FIFF.FIFFV_COORD_HEAD,
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
# XXXX:
|
||||
# This does something really similar to _read_dig_montage_fif but:
|
||||
# - does not check coord_frame
|
||||
# - does not do any operation that implies assumptions with the names
|
||||
def _get_data_as_dict_from_dig(dig, exclude_ref_channel=True):
|
||||
"""Obtain coordinate data from a Dig.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
dig : list of dicts
|
||||
A container of DigPoints to be added to the info['dig'].
|
||||
|
||||
Returns
|
||||
-------
|
||||
ch_pos : dict
|
||||
The container of all relevant channel positions inside dig.
|
||||
"""
|
||||
# Split up the dig points by category
|
||||
hsp, hpi, elp = list(), list(), list()
|
||||
fids, dig_ch_pos_location = dict(), list()
|
||||
dig = [] if dig is None else dig
|
||||
|
||||
for d in dig:
|
||||
if d["kind"] == FIFF.FIFFV_POINT_CARDINAL:
|
||||
fids[_cardinal_ident_mapping[d["ident"]]] = d["r"]
|
||||
elif d["kind"] == FIFF.FIFFV_POINT_HPI:
|
||||
hpi.append(d["r"])
|
||||
elp.append(d["r"])
|
||||
elif d["kind"] == FIFF.FIFFV_POINT_EXTRA:
|
||||
hsp.append(d["r"])
|
||||
elif d["kind"] == FIFF.FIFFV_POINT_EEG:
|
||||
if d["ident"] != 0 or not exclude_ref_channel:
|
||||
dig_ch_pos_location.append(d["r"])
|
||||
|
||||
dig_coord_frames = set([d["coord_frame"] for d in dig])
|
||||
if len(dig_coord_frames) == 0:
|
||||
dig_coord_frames = set([FIFF.FIFFV_COORD_HEAD])
|
||||
if len(dig_coord_frames) != 1:
|
||||
raise RuntimeError(
|
||||
"Only single coordinate frame in dig is supported, "
|
||||
f"got {dig_coord_frames}"
|
||||
)
|
||||
dig_ch_pos_location = np.array(dig_ch_pos_location)
|
||||
dig_ch_pos_location.shape = (-1, 3) # empty will be (0, 3)
|
||||
return Bunch(
|
||||
nasion=fids.get("nasion", None),
|
||||
lpa=fids.get("lpa", None),
|
||||
rpa=fids.get("rpa", None),
|
||||
hsp=np.array(hsp) if len(hsp) else None,
|
||||
hpi=np.array(hpi) if len(hpi) else None,
|
||||
elp=np.array(elp) if len(elp) else None,
|
||||
dig_ch_pos_location=dig_ch_pos_location,
|
||||
coord_frame=dig_coord_frames.pop(),
|
||||
)
|
||||
|
||||
|
||||
def _get_fid_coords(dig, raise_error=True):
|
||||
fid_coords = Bunch(nasion=None, lpa=None, rpa=None)
|
||||
fid_coord_frames = dict()
|
||||
|
||||
for d in dig:
|
||||
if d["kind"] == FIFF.FIFFV_POINT_CARDINAL:
|
||||
key = _cardinal_ident_mapping[d["ident"]]
|
||||
fid_coords[key] = d["r"]
|
||||
fid_coord_frames[key] = d["coord_frame"]
|
||||
|
||||
if len(fid_coord_frames) > 0 and raise_error:
|
||||
if set(fid_coord_frames.keys()) != set(["nasion", "lpa", "rpa"]):
|
||||
raise ValueError(
|
||||
f"Some fiducial points are missing (got {fid_coord_frames.keys()})."
|
||||
)
|
||||
|
||||
if len(set(fid_coord_frames.values())) > 1:
|
||||
raise ValueError(
|
||||
"All fiducial points must be in the same coordinate system "
|
||||
f"(got {len(fid_coord_frames)})"
|
||||
)
|
||||
|
||||
coord_frame = fid_coord_frames.popitem()[1] if fid_coord_frames else None
|
||||
|
||||
return fid_coords, coord_frame
|
||||
|
||||
|
||||
def _coord_frame_const(coord_frame):
|
||||
from ..transforms import _str_to_frame
|
||||
|
||||
if not isinstance(coord_frame, str) or coord_frame not in _str_to_frame:
|
||||
raise ValueError(
|
||||
f"coord_frame must be one of {sorted(_str_to_frame.keys())}, got "
|
||||
f"{coord_frame}"
|
||||
)
|
||||
return _str_to_frame[coord_frame]
|
||||
|
||||
|
||||
def _make_dig_points(
|
||||
nasion=None,
|
||||
lpa=None,
|
||||
rpa=None,
|
||||
hpi=None,
|
||||
extra_points=None,
|
||||
dig_ch_pos=None,
|
||||
*,
|
||||
coord_frame="head",
|
||||
add_missing_fiducials=False,
|
||||
):
|
||||
"""Construct digitizer info for the info.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
nasion : array-like | numpy.ndarray, shape (3,) | None
|
||||
Point designated as the nasion point.
|
||||
lpa : array-like | numpy.ndarray, shape (3,) | None
|
||||
Point designated as the left auricular point.
|
||||
rpa : array-like | numpy.ndarray, shape (3,) | None
|
||||
Point designated as the right auricular point.
|
||||
hpi : array-like | numpy.ndarray, shape (n_points, 3) | None
|
||||
Points designated as head position indicator points.
|
||||
extra_points : array-like | numpy.ndarray, shape (n_points, 3)
|
||||
Points designed as the headshape points.
|
||||
dig_ch_pos : dict
|
||||
Dict of EEG channel positions.
|
||||
coord_frame : str
|
||||
The coordinate frame of the points. Usually this is "unknown"
|
||||
for native digitizer space. Defaults to "head".
|
||||
add_missing_fiducials : bool
|
||||
If True, add fiducials to the dig points if they are not present.
|
||||
Requires that coord_frame='head' and that lpa, nasion, and rpa are all
|
||||
None.
|
||||
|
||||
Returns
|
||||
-------
|
||||
dig : list of dicts
|
||||
A container of DigPoints to be added to the info['dig'].
|
||||
"""
|
||||
coord_frame = _coord_frame_const(coord_frame)
|
||||
|
||||
dig = []
|
||||
if lpa is not None:
|
||||
lpa = np.asarray(lpa)
|
||||
if lpa.shape != (3,):
|
||||
raise ValueError(f"LPA should have the shape (3,) instead of {lpa.shape}")
|
||||
dig.append(
|
||||
{
|
||||
"r": lpa,
|
||||
"ident": FIFF.FIFFV_POINT_LPA,
|
||||
"kind": FIFF.FIFFV_POINT_CARDINAL,
|
||||
"coord_frame": coord_frame,
|
||||
}
|
||||
)
|
||||
if nasion is not None:
|
||||
nasion = np.asarray(nasion)
|
||||
if nasion.shape != (3,):
|
||||
raise ValueError(
|
||||
f"Nasion should have the shape (3,) instead of {nasion.shape}"
|
||||
)
|
||||
dig.append(
|
||||
{
|
||||
"r": nasion,
|
||||
"ident": FIFF.FIFFV_POINT_NASION,
|
||||
"kind": FIFF.FIFFV_POINT_CARDINAL,
|
||||
"coord_frame": coord_frame,
|
||||
}
|
||||
)
|
||||
if rpa is not None:
|
||||
rpa = np.asarray(rpa)
|
||||
if rpa.shape != (3,):
|
||||
raise ValueError(f"RPA should have the shape (3,) instead of {rpa.shape}")
|
||||
dig.append(
|
||||
{
|
||||
"r": rpa,
|
||||
"ident": FIFF.FIFFV_POINT_RPA,
|
||||
"kind": FIFF.FIFFV_POINT_CARDINAL,
|
||||
"coord_frame": coord_frame,
|
||||
}
|
||||
)
|
||||
if hpi is not None:
|
||||
hpi = np.asarray(hpi)
|
||||
if hpi.ndim != 2 or hpi.shape[1] != 3:
|
||||
raise ValueError(
|
||||
f"HPI should have the shape (n_points, 3) instead of {hpi.shape}"
|
||||
)
|
||||
for idx, point in enumerate(hpi):
|
||||
dig.append(
|
||||
{
|
||||
"r": point,
|
||||
"ident": idx + 1,
|
||||
"kind": FIFF.FIFFV_POINT_HPI,
|
||||
"coord_frame": coord_frame,
|
||||
}
|
||||
)
|
||||
if extra_points is not None:
|
||||
extra_points = np.asarray(extra_points)
|
||||
if len(extra_points) and extra_points.shape[1] != 3:
|
||||
raise ValueError(
|
||||
"Points should have the shape (n_points, 3) instead of "
|
||||
f"{extra_points.shape}"
|
||||
)
|
||||
for idx, point in enumerate(extra_points):
|
||||
dig.append(
|
||||
{
|
||||
"r": point,
|
||||
"ident": idx + 1,
|
||||
"kind": FIFF.FIFFV_POINT_EXTRA,
|
||||
"coord_frame": coord_frame,
|
||||
}
|
||||
)
|
||||
if dig_ch_pos is not None:
|
||||
idents = []
|
||||
use_arange = False
|
||||
for key, value in dig_ch_pos.items():
|
||||
_validate_type(key, str, "dig_ch_pos")
|
||||
try:
|
||||
idents.append(int(key[-3:]))
|
||||
except ValueError:
|
||||
use_arange = True
|
||||
_validate_type(value, (np.ndarray, list, tuple), "dig_ch_pos")
|
||||
value = np.array(value, dtype=float)
|
||||
dig_ch_pos[key] = value
|
||||
if value.shape != (3,):
|
||||
raise RuntimeError(
|
||||
"The position should be a 1D array of 3 floats. "
|
||||
f"Provided shape {value.shape}."
|
||||
)
|
||||
if use_arange:
|
||||
idents = np.arange(1, len(dig_ch_pos) + 1)
|
||||
for key, ident in zip(dig_ch_pos, idents):
|
||||
dig.append(
|
||||
{
|
||||
"r": dig_ch_pos[key],
|
||||
"ident": int(ident),
|
||||
"kind": FIFF.FIFFV_POINT_EEG,
|
||||
"coord_frame": coord_frame,
|
||||
}
|
||||
)
|
||||
if add_missing_fiducials:
|
||||
assert coord_frame == FIFF.FIFFV_COORD_HEAD
|
||||
# These being none is really an assumption that if you have one you
|
||||
# should have all three. But we can relax this later if necessary.
|
||||
assert lpa is None
|
||||
assert rpa is None
|
||||
assert nasion is None
|
||||
_ensure_fiducials_head(dig)
|
||||
|
||||
return _format_dig_points(dig)
|
||||
|
||||
|
||||
def _call_make_dig_points(nasion, lpa, rpa, hpi, extra, convert=True):
|
||||
from ..transforms import (
|
||||
Transform,
|
||||
apply_trans,
|
||||
get_ras_to_neuromag_trans,
|
||||
)
|
||||
|
||||
if convert:
|
||||
neuromag_trans = get_ras_to_neuromag_trans(nasion, lpa, rpa)
|
||||
nasion = apply_trans(neuromag_trans, nasion)
|
||||
lpa = apply_trans(neuromag_trans, lpa)
|
||||
rpa = apply_trans(neuromag_trans, rpa)
|
||||
|
||||
if hpi is not None:
|
||||
hpi = apply_trans(neuromag_trans, hpi)
|
||||
|
||||
extra = apply_trans(neuromag_trans, extra).astype(np.float32)
|
||||
else:
|
||||
neuromag_trans = None
|
||||
|
||||
ctf_head_t = Transform(fro="ctf_head", to="head", trans=neuromag_trans)
|
||||
|
||||
info_dig = _make_dig_points(
|
||||
nasion=nasion, lpa=lpa, rpa=rpa, hpi=hpi, extra_points=extra
|
||||
)
|
||||
|
||||
return info_dig, ctf_head_t
|
||||
|
||||
|
||||
##############################################################################
|
||||
# From artemis123 (we have modified the function a bit)
|
||||
def _artemis123_read_pos(nas, lpa, rpa, hpi, extra):
|
||||
# move into MNE head coords
|
||||
dig_points, _ = _call_make_dig_points(nas, lpa, rpa, hpi, extra)
|
||||
return dig_points
|
||||
|
||||
|
||||
##############################################################################
|
||||
# From bti
|
||||
def _make_bti_dig_points(
|
||||
nasion,
|
||||
lpa,
|
||||
rpa,
|
||||
hpi,
|
||||
extra,
|
||||
convert=False,
|
||||
use_hpi=False,
|
||||
bti_dev_t=False,
|
||||
dev_ctf_t=False,
|
||||
):
|
||||
from ..transforms import (
|
||||
Transform,
|
||||
combine_transforms,
|
||||
invert_transform,
|
||||
)
|
||||
|
||||
_hpi = hpi if use_hpi else None
|
||||
info_dig, ctf_head_t = _call_make_dig_points(nasion, lpa, rpa, _hpi, extra, convert)
|
||||
|
||||
if convert:
|
||||
t = combine_transforms(
|
||||
invert_transform(bti_dev_t), dev_ctf_t, "meg", "ctf_head"
|
||||
)
|
||||
dev_head_t = combine_transforms(t, ctf_head_t, "meg", "head")
|
||||
else:
|
||||
dev_head_t = Transform("meg", "head", trans=None)
|
||||
|
||||
return info_dig, dev_head_t, ctf_head_t # ctf_head_t should not be needed
|
||||
168
mne/_fiff/compensator.py
Normal file
@@ -0,0 +1,168 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..utils import fill_doc
|
||||
from .constants import FIFF
|
||||
|
||||
|
||||
def get_current_comp(info):
|
||||
"""Get the current compensation in effect in the data."""
|
||||
comp = None
|
||||
first_comp = -1
|
||||
for k, chan in enumerate(info["chs"]):
|
||||
if chan["kind"] == FIFF.FIFFV_MEG_CH:
|
||||
comp = int(chan["coil_type"]) >> 16
|
||||
if first_comp < 0:
|
||||
first_comp = comp
|
||||
elif comp != first_comp:
|
||||
raise ValueError("Compensation is not set equally on all MEG channels")
|
||||
return comp
|
||||
|
||||
|
||||
def set_current_comp(info, comp):
|
||||
"""Set the current compensation in effect in the data."""
|
||||
comp_now = get_current_comp(info)
|
||||
for k, chan in enumerate(info["chs"]):
|
||||
if chan["kind"] == FIFF.FIFFV_MEG_CH:
|
||||
rem = chan["coil_type"] - (comp_now << 16)
|
||||
chan["coil_type"] = int(rem + (comp << 16))
|
||||
|
||||
|
||||
def _make_compensator(info, grade):
|
||||
"""Auxiliary function for make_compensator."""
|
||||
for k in range(len(info["comps"])):
|
||||
if info["comps"][k]["kind"] == grade:
|
||||
this_data = info["comps"][k]["data"]
|
||||
|
||||
# Create the preselector
|
||||
presel = np.zeros((this_data["ncol"], info["nchan"]))
|
||||
for col, col_name in enumerate(this_data["col_names"]):
|
||||
ind = [k for k, ch in enumerate(info["ch_names"]) if ch == col_name]
|
||||
if len(ind) == 0:
|
||||
raise ValueError(f"Channel {col_name} is not available in data")
|
||||
elif len(ind) > 1:
|
||||
raise ValueError(f"Ambiguous channel {col_name}")
|
||||
presel[col, ind[0]] = 1.0
|
||||
|
||||
# Create the postselector (zero entries for channels not found)
|
||||
postsel = np.zeros((info["nchan"], this_data["nrow"]))
|
||||
for c, ch_name in enumerate(info["ch_names"]):
|
||||
ind = [
|
||||
k for k, ch in enumerate(this_data["row_names"]) if ch == ch_name
|
||||
]
|
||||
if len(ind) > 1:
|
||||
raise ValueError(f"Ambiguous channel {ch_name}")
|
||||
elif len(ind) == 1:
|
||||
postsel[c, ind[0]] = 1.0
|
||||
# else, don't use it at all (postsel[c, ?] = 0.0) by allocation
|
||||
this_comp = np.dot(postsel, np.dot(this_data["data"], presel))
|
||||
return this_comp
|
||||
|
||||
raise ValueError(f"Desired compensation matrix (grade = {grade:d}) not found")
|
||||
|
||||
|
||||
@fill_doc
|
||||
def make_compensator(info, from_, to, exclude_comp_chs=False):
|
||||
"""Return compensation matrix eg. for CTF system.
|
||||
|
||||
Create a compensation matrix to bring the data from one compensation
|
||||
state to another.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
%(info_not_none)s
|
||||
from_ : int
|
||||
Compensation in the input data.
|
||||
to : int
|
||||
Desired compensation in the output.
|
||||
exclude_comp_chs : bool
|
||||
Exclude compensation channels from the output.
|
||||
|
||||
Returns
|
||||
-------
|
||||
comp : array | None.
|
||||
The compensation matrix. Might be None if no compensation
|
||||
is needed (from == to).
|
||||
"""
|
||||
if from_ == to:
|
||||
return None
|
||||
|
||||
# s_orig = s_from + C1*s_from = (I + C1)*s_from
|
||||
# s_to = s_orig - C2*s_orig = (I - C2)*s_orig
|
||||
# s_to = (I - C2)*(I + C1)*s_from = (I + C1 - C2 - C2*C1)*s_from
|
||||
if from_ != 0:
|
||||
C1 = _make_compensator(info, from_)
|
||||
comp_from_0 = np.linalg.inv(np.eye(info["nchan"]) - C1)
|
||||
if to != 0:
|
||||
C2 = _make_compensator(info, to)
|
||||
comp_0_to = np.eye(info["nchan"]) - C2
|
||||
if from_ != 0:
|
||||
if to != 0:
|
||||
# This is mathematically equivalent, but has higher numerical
|
||||
# error than using the inverse to always go to zero and back
|
||||
# comp = np.eye(info['nchan']) + C1 - C2 - np.dot(C2, C1)
|
||||
comp = np.dot(comp_0_to, comp_from_0)
|
||||
else:
|
||||
comp = comp_from_0
|
||||
else:
|
||||
# from == 0, to != 0 guaranteed here
|
||||
comp = comp_0_to
|
||||
|
||||
if exclude_comp_chs:
|
||||
pick = [
|
||||
k for k, c in enumerate(info["chs"]) if c["kind"] != FIFF.FIFFV_REF_MEG_CH
|
||||
]
|
||||
|
||||
if len(pick) == 0:
|
||||
raise ValueError(
|
||||
"Nothing remains after excluding the compensation channels"
|
||||
)
|
||||
|
||||
comp = comp[pick, :]
|
||||
|
||||
return comp
|
||||
|
||||
|
||||
# @verbose
|
||||
# def compensate_to(data, to, verbose=None):
|
||||
# """
|
||||
# %
|
||||
# % [newdata] = mne_compensate_to(data,to)
|
||||
# %
|
||||
# % Apply compensation to the data as desired
|
||||
# %
|
||||
# """
|
||||
#
|
||||
# newdata = data.copy()
|
||||
# now = get_current_comp(newdata['info'])
|
||||
#
|
||||
# # Are we there already?
|
||||
# if now == to:
|
||||
# logger.info('Data are already compensated as desired')
|
||||
#
|
||||
# # Make the compensator and apply it to all data sets
|
||||
# comp = make_compensator(newdata['info'], now, to)
|
||||
# for k in range(len(newdata['evoked'])):
|
||||
# newdata['evoked'][k]['epochs'] = np.dot(comp,
|
||||
# newdata['evoked'][k]['epochs'])
|
||||
#
|
||||
# # Update the compensation info in the channel descriptors
|
||||
# newdata['info']['chs'] = set_current_comp(newdata['info']['chs'], to)
|
||||
# return newdata
|
||||
|
||||
|
||||
# def set_current_comp(chs, value):
|
||||
# """Set the current compensation value in the channel info structures
|
||||
# """
|
||||
# new_chs = chs
|
||||
#
|
||||
# lower_half = int('FFFF', 16) # hex2dec('FFFF')
|
||||
# for k in range(len(chs)):
|
||||
# if chs[k]['kind'] == FIFF.FIFFV_MEG_CH:
|
||||
# coil_type = float(chs[k]['coil_type']) & lower_half
|
||||
# new_chs[k]['coil_type'] = int(coil_type | (value << 16))
|
||||
#
|
||||
# return new_chs
|
||||
1218
mne/_fiff/constants.py
Normal file
189
mne/_fiff/ctf_comp.py
Normal file
@@ -0,0 +1,189 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
from copy import deepcopy
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..utils import _pl, logger, verbose
|
||||
from .constants import FIFF
|
||||
from .matrix import _read_named_matrix, write_named_matrix
|
||||
from .tag import read_tag
|
||||
from .tree import dir_tree_find
|
||||
from .write import end_block, start_block, write_int
|
||||
|
||||
|
||||
def _add_kind(one):
|
||||
"""Convert CTF kind to MNE kind."""
|
||||
if one["ctfkind"] == int("47314252", 16):
|
||||
one["kind"] = 1
|
||||
elif one["ctfkind"] == int("47324252", 16):
|
||||
one["kind"] = 2
|
||||
elif one["ctfkind"] == int("47334252", 16):
|
||||
one["kind"] = 3
|
||||
else:
|
||||
one["kind"] = int(one["ctfkind"])
|
||||
|
||||
|
||||
def _calibrate_comp(
|
||||
comp, chs, row_names, col_names, mult_keys=("range", "cal"), flip=False
|
||||
):
|
||||
"""Get row and column cals."""
|
||||
ch_names = [c["ch_name"] for c in chs]
|
||||
row_cals = np.zeros(len(row_names))
|
||||
col_cals = np.zeros(len(col_names))
|
||||
for names, cals, inv in zip(
|
||||
(row_names, col_names), (row_cals, col_cals), (False, True)
|
||||
):
|
||||
for ii in range(len(cals)):
|
||||
p = ch_names.count(names[ii])
|
||||
if p != 1:
|
||||
raise RuntimeError(
|
||||
f"Channel {names[ii]} does not appear exactly once "
|
||||
f"in data, found {p:d} instance{_pl(p)}"
|
||||
)
|
||||
idx = ch_names.index(names[ii])
|
||||
val = chs[idx][mult_keys[0]] * chs[idx][mult_keys[1]]
|
||||
val = float(1.0 / val) if inv else float(val)
|
||||
val = 1.0 / val if flip else val
|
||||
cals[ii] = val
|
||||
comp["rowcals"] = row_cals
|
||||
comp["colcals"] = col_cals
|
||||
comp["data"]["data"] = row_cals[:, None] * comp["data"]["data"] * col_cals[None, :]
|
||||
|
||||
|
||||
@verbose
|
||||
def read_ctf_comp(fid, node, chs, verbose=None):
|
||||
"""Read the CTF software compensation data from the given node.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file
|
||||
The file descriptor.
|
||||
node : dict
|
||||
The node in the FIF tree.
|
||||
chs : list
|
||||
The list of channels from info['chs'] to match with
|
||||
compensators that are read.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
compdata : list
|
||||
The compensation data
|
||||
"""
|
||||
return _read_ctf_comp(fid, node, chs, None)
|
||||
|
||||
|
||||
def _read_ctf_comp(fid, node, chs, ch_names_mapping):
|
||||
"""Read the CTF software compensation data from the given node.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file
|
||||
The file descriptor.
|
||||
node : dict
|
||||
The node in the FIF tree.
|
||||
chs : list
|
||||
The list of channels from info['chs'] to match with
|
||||
compensators that are read.
|
||||
ch_names_mapping : dict | None
|
||||
The channel renaming to use.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
compdata : list
|
||||
The compensation data
|
||||
"""
|
||||
from .meas_info import _rename_comps
|
||||
|
||||
ch_names_mapping = dict() if ch_names_mapping is None else ch_names_mapping
|
||||
compdata = []
|
||||
comps = dir_tree_find(node, FIFF.FIFFB_MNE_CTF_COMP_DATA)
|
||||
|
||||
for node in comps:
|
||||
# Read the data we need
|
||||
mat = _read_named_matrix(fid, node, FIFF.FIFF_MNE_CTF_COMP_DATA)
|
||||
for p in range(node["nent"]):
|
||||
kind = node["directory"][p].kind
|
||||
pos = node["directory"][p].pos
|
||||
if kind == FIFF.FIFF_MNE_CTF_COMP_KIND:
|
||||
tag = read_tag(fid, pos)
|
||||
break
|
||||
else:
|
||||
raise Exception("Compensation type not found")
|
||||
|
||||
# Get the compensation kind and map it to a simple number
|
||||
one = dict(ctfkind=tag.data.item())
|
||||
del tag
|
||||
_add_kind(one)
|
||||
for p in range(node["nent"]):
|
||||
kind = node["directory"][p].kind
|
||||
pos = node["directory"][p].pos
|
||||
if kind == FIFF.FIFF_MNE_CTF_COMP_CALIBRATED:
|
||||
tag = read_tag(fid, pos)
|
||||
calibrated = tag.data
|
||||
break
|
||||
else:
|
||||
calibrated = False
|
||||
|
||||
one["save_calibrated"] = bool(calibrated)
|
||||
one["data"] = mat
|
||||
_rename_comps([one], ch_names_mapping)
|
||||
if not calibrated:
|
||||
# Calibrate...
|
||||
_calibrate_comp(one, chs, mat["row_names"], mat["col_names"])
|
||||
else:
|
||||
one["rowcals"] = np.ones(mat["data"].shape[0], dtype=np.float64)
|
||||
one["colcals"] = np.ones(mat["data"].shape[1], dtype=np.float64)
|
||||
|
||||
compdata.append(one)
|
||||
|
||||
if len(compdata) > 0:
|
||||
logger.info(f" Read {len(compdata)} compensation matrices")
|
||||
|
||||
return compdata
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Writing
|
||||
|
||||
|
||||
def write_ctf_comp(fid, comps):
|
||||
"""Write the CTF compensation data into a fif file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file
|
||||
The open FIF file descriptor
|
||||
|
||||
comps : list
|
||||
The compensation data to write
|
||||
"""
|
||||
if len(comps) <= 0:
|
||||
return
|
||||
|
||||
# This is very simple in fact
|
||||
start_block(fid, FIFF.FIFFB_MNE_CTF_COMP)
|
||||
for comp in comps:
|
||||
start_block(fid, FIFF.FIFFB_MNE_CTF_COMP_DATA)
|
||||
# Write the compensation kind
|
||||
write_int(fid, FIFF.FIFF_MNE_CTF_COMP_KIND, comp["ctfkind"])
|
||||
if comp.get("save_calibrated", False):
|
||||
write_int(fid, FIFF.FIFF_MNE_CTF_COMP_CALIBRATED, comp["save_calibrated"])
|
||||
|
||||
if not comp.get("save_calibrated", True):
|
||||
# Undo calibration
|
||||
comp = deepcopy(comp)
|
||||
data = (
|
||||
(1.0 / comp["rowcals"][:, None])
|
||||
* comp["data"]["data"]
|
||||
* (1.0 / comp["colcals"][None, :])
|
||||
)
|
||||
comp["data"]["data"] = data
|
||||
write_named_matrix(fid, FIFF.FIFF_MNE_CTF_COMP_DATA, comp["data"])
|
||||
end_block(fid, FIFF.FIFFB_MNE_CTF_COMP_DATA)
|
||||
|
||||
end_block(fid, FIFF.FIFFB_MNE_CTF_COMP)
|
||||
137
mne/_fiff/matrix.py
Normal file
@@ -0,0 +1,137 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
from ..utils import logger
|
||||
from .constants import FIFF
|
||||
from .tag import find_tag, has_tag
|
||||
from .write import (
|
||||
end_block,
|
||||
start_block,
|
||||
write_float_matrix,
|
||||
write_int,
|
||||
write_name_list,
|
||||
)
|
||||
|
||||
|
||||
def _transpose_named_matrix(mat):
|
||||
"""Transpose mat inplace (no copy)."""
|
||||
mat["nrow"], mat["ncol"] = mat["ncol"], mat["nrow"]
|
||||
mat["row_names"], mat["col_names"] = mat["col_names"], mat["row_names"]
|
||||
mat["data"] = mat["data"].T
|
||||
|
||||
|
||||
def _read_named_matrix(fid, node, matkind, indent=" ", transpose=False):
|
||||
"""Read named matrix from the given node.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file
|
||||
The opened file descriptor.
|
||||
node : dict
|
||||
The node in the tree.
|
||||
matkind : int
|
||||
The type of matrix.
|
||||
transpose : bool
|
||||
If True, transpose the matrix. Default is False.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
mat: dict
|
||||
The matrix data
|
||||
"""
|
||||
# Descend one level if necessary
|
||||
if node["block"] != FIFF.FIFFB_MNE_NAMED_MATRIX:
|
||||
for k in range(node["nchild"]):
|
||||
if node["children"][k]["block"] == FIFF.FIFFB_MNE_NAMED_MATRIX:
|
||||
if has_tag(node["children"][k], matkind):
|
||||
node = node["children"][k]
|
||||
break
|
||||
else:
|
||||
logger.info(
|
||||
f"{indent}Desired named matrix (kind = {matkind}) not available"
|
||||
)
|
||||
return None
|
||||
else:
|
||||
if not has_tag(node, matkind):
|
||||
logger.info(
|
||||
f"{indent}Desired named matrix (kind = {matkind}) not available"
|
||||
)
|
||||
return None
|
||||
|
||||
# Read everything we need
|
||||
tag = find_tag(fid, node, matkind)
|
||||
if tag is None:
|
||||
raise ValueError("Matrix data missing")
|
||||
else:
|
||||
data = tag.data
|
||||
|
||||
nrow, ncol = data.shape
|
||||
tag = find_tag(fid, node, FIFF.FIFF_MNE_NROW)
|
||||
if tag is not None and tag.data != nrow:
|
||||
raise ValueError(
|
||||
"Number of rows in matrix data and FIFF_MNE_NROW tag do not match"
|
||||
)
|
||||
|
||||
tag = find_tag(fid, node, FIFF.FIFF_MNE_NCOL)
|
||||
if tag is not None and tag.data != ncol:
|
||||
raise ValueError(
|
||||
"Number of columns in matrix data and FIFF_MNE_NCOL tag do not match"
|
||||
)
|
||||
|
||||
tag = find_tag(fid, node, FIFF.FIFF_MNE_ROW_NAMES)
|
||||
row_names = tag.data.split(":") if tag is not None else []
|
||||
|
||||
tag = find_tag(fid, node, FIFF.FIFF_MNE_COL_NAMES)
|
||||
col_names = tag.data.split(":") if tag is not None else []
|
||||
|
||||
mat = dict(
|
||||
nrow=nrow, ncol=ncol, row_names=row_names, col_names=col_names, data=data
|
||||
)
|
||||
if transpose:
|
||||
_transpose_named_matrix(mat)
|
||||
return mat
|
||||
|
||||
|
||||
def write_named_matrix(fid, kind, mat):
|
||||
"""Write named matrix from the given node.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file
|
||||
The opened file descriptor.
|
||||
kind : int
|
||||
The kind of the matrix.
|
||||
matkind : int
|
||||
The type of matrix.
|
||||
"""
|
||||
# let's save ourselves from disaster
|
||||
n_tot = mat["nrow"] * mat["ncol"]
|
||||
if mat["data"].size != n_tot:
|
||||
ratio = n_tot / float(mat["data"].size)
|
||||
if n_tot < mat["data"].size and ratio > 0:
|
||||
ratio = 1 / ratio
|
||||
raise ValueError(
|
||||
f"Cannot write matrix: row ({mat['nrow']}) and column ({mat['ncol']}) "
|
||||
f"total element ({n_tot}) mismatch with data size ({mat['data'].size}), "
|
||||
f"appears to be off by a factor of {ratio:g}x"
|
||||
)
|
||||
start_block(fid, FIFF.FIFFB_MNE_NAMED_MATRIX)
|
||||
write_int(fid, FIFF.FIFF_MNE_NROW, mat["nrow"])
|
||||
write_int(fid, FIFF.FIFF_MNE_NCOL, mat["ncol"])
|
||||
|
||||
if len(mat["row_names"]) > 0:
|
||||
# let's prevent unintentional stupidity
|
||||
if len(mat["row_names"]) != mat["nrow"]:
|
||||
raise ValueError('len(mat["row_names"]) != mat["nrow"]')
|
||||
write_name_list(fid, FIFF.FIFF_MNE_ROW_NAMES, mat["row_names"])
|
||||
|
||||
if len(mat["col_names"]) > 0:
|
||||
# let's prevent unintentional stupidity
|
||||
if len(mat["col_names"]) != mat["ncol"]:
|
||||
raise ValueError('len(mat["col_names"]) != mat["ncol"]')
|
||||
write_name_list(fid, FIFF.FIFF_MNE_COL_NAMES, mat["col_names"])
|
||||
|
||||
write_float_matrix(fid, kind, mat["data"])
|
||||
end_block(fid, FIFF.FIFFB_MNE_NAMED_MATRIX)
|
||||
3764
mne/_fiff/meas_info.py
Normal file
386
mne/_fiff/open.py
Normal file
@@ -0,0 +1,386 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
from gzip import GzipFile
|
||||
from io import SEEK_SET, BytesIO
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
from scipy.sparse import issparse
|
||||
|
||||
from ..utils import _check_fname, _file_like, _validate_type, logger, verbose, warn
|
||||
from .constants import FIFF
|
||||
from .tag import Tag, _call_dict_names, _matrix_info, _read_tag_header, read_tag
|
||||
from .tree import dir_tree_find, make_dir_tree
|
||||
|
||||
|
||||
class _NoCloseRead:
|
||||
"""Create a wrapper that will not close when used as a context manager."""
|
||||
|
||||
def __init__(self, fid):
|
||||
self.fid = fid
|
||||
|
||||
def __enter__(self):
|
||||
return self.fid
|
||||
|
||||
def __exit__(self, type_, value, traceback):
|
||||
return
|
||||
|
||||
def close(self):
|
||||
return
|
||||
|
||||
def seek(self, offset, whence=SEEK_SET):
|
||||
return self.fid.seek(offset, whence)
|
||||
|
||||
def read(self, size=-1):
|
||||
return self.fid.read(size)
|
||||
|
||||
|
||||
def _fiff_get_fid(fname):
|
||||
"""Open a FIF file with no additional parsing."""
|
||||
if _file_like(fname):
|
||||
logger.debug("Using file-like I/O")
|
||||
fid = _NoCloseRead(fname)
|
||||
fid.seek(0)
|
||||
else:
|
||||
_validate_type(fname, Path, "fname", extra="or file-like")
|
||||
if fname.suffixes[-1] == ".gz":
|
||||
logger.debug("Using gzip I/O")
|
||||
fid = GzipFile(fname, "rb") # Open in binary mode
|
||||
else:
|
||||
logger.debug("Using normal I/O")
|
||||
fid = open(fname, "rb") # Open in binary mode
|
||||
return fid
|
||||
|
||||
|
||||
def _get_next_fname(fid, fname, tree):
|
||||
"""Get the next filename in split files."""
|
||||
_validate_type(fname, (Path, None), "fname")
|
||||
nodes_list = dir_tree_find(tree, FIFF.FIFFB_REF)
|
||||
next_fname = None
|
||||
for nodes in nodes_list:
|
||||
next_fname = None
|
||||
for ent in nodes["directory"]:
|
||||
if ent.kind == FIFF.FIFF_REF_ROLE:
|
||||
tag = read_tag(fid, ent.pos)
|
||||
role = int(tag.data.item())
|
||||
if role != FIFF.FIFFV_ROLE_NEXT_FILE:
|
||||
next_fname = None
|
||||
break
|
||||
if ent.kind not in (FIFF.FIFF_REF_FILE_NAME, FIFF.FIFF_REF_FILE_NUM):
|
||||
continue
|
||||
# If we can't resolve it, assume/hope it's in the current directory
|
||||
if fname is None:
|
||||
fname = Path().resolve()
|
||||
if ent.kind == FIFF.FIFF_REF_FILE_NAME:
|
||||
tag = read_tag(fid, ent.pos)
|
||||
next_fname = fname.parent / tag.data
|
||||
if ent.kind == FIFF.FIFF_REF_FILE_NUM:
|
||||
# Some files don't have the name, just the number. So
|
||||
# we construct the name from the current name.
|
||||
if next_fname is not None:
|
||||
continue
|
||||
next_num = read_tag(fid, ent.pos).data.item()
|
||||
base = fname.name
|
||||
idx = base.find(".")
|
||||
idx2 = base.rfind("-")
|
||||
num_str = base[idx2 + 1 : idx]
|
||||
if not num_str.isdigit():
|
||||
idx2 = -1
|
||||
|
||||
if idx2 < 0 and next_num == 1:
|
||||
# this is the first file, which may not be numbered
|
||||
next_fname = (
|
||||
fname.parent / f"{base[:idx]}-{next_num:d}.{base[idx + 1 :]}"
|
||||
)
|
||||
continue
|
||||
|
||||
next_fname = (
|
||||
fname.parent / f"{base[:idx2]}-{next_num:d}.{base[idx + 1 :]}"
|
||||
)
|
||||
if next_fname is not None:
|
||||
break
|
||||
return next_fname
|
||||
|
||||
|
||||
@verbose
|
||||
def fiff_open(fname, preload=False, verbose=None):
|
||||
"""Open a FIF file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like | fid
|
||||
Name of the fif file, or an opened file (will seek back to 0).
|
||||
preload : bool
|
||||
If True, all data from the file is read into a memory buffer. This
|
||||
requires more memory, but can be faster for I/O operations that require
|
||||
frequent seeks.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
fid : file
|
||||
The file descriptor of the open file.
|
||||
tree : fif tree
|
||||
The tree is a complex structure filled with dictionaries,
|
||||
lists and tags.
|
||||
directory : list
|
||||
A list of tags.
|
||||
"""
|
||||
fid = _fiff_get_fid(fname)
|
||||
try:
|
||||
return _fiff_open(fname, fid, preload)
|
||||
except Exception:
|
||||
fid.close()
|
||||
raise
|
||||
|
||||
|
||||
def _fiff_open(fname, fid, preload):
|
||||
# do preloading of entire file
|
||||
if preload:
|
||||
# note that StringIO objects instantiated this way are read-only,
|
||||
# but that's okay here since we are using mode "rb" anyway
|
||||
with fid as fid_old:
|
||||
fid = BytesIO(fid_old.read())
|
||||
|
||||
tag = _read_tag_header(fid, 0)
|
||||
|
||||
# Check that this looks like a fif file
|
||||
prefix = f"file {repr(fname)} does not"
|
||||
if tag.kind != FIFF.FIFF_FILE_ID:
|
||||
raise ValueError(f"{prefix} start with a file id tag")
|
||||
|
||||
if tag.type != FIFF.FIFFT_ID_STRUCT:
|
||||
raise ValueError(f"{prefix} start with a file id tag")
|
||||
|
||||
if tag.size != 20:
|
||||
raise ValueError(f"{prefix} start with a file id tag")
|
||||
|
||||
tag = read_tag(fid, tag.next_pos)
|
||||
|
||||
if tag.kind != FIFF.FIFF_DIR_POINTER:
|
||||
raise ValueError(f"{prefix} have a directory pointer")
|
||||
|
||||
# Read or create the directory tree
|
||||
logger.debug(f" Creating tag directory for {fname}...")
|
||||
|
||||
dirpos = int(tag.data.item())
|
||||
read_slow = True
|
||||
if dirpos > 0:
|
||||
dir_tag = read_tag(fid, dirpos)
|
||||
if dir_tag is None or dir_tag.data is None:
|
||||
fid.seek(0, 2) # move to end of file
|
||||
size = fid.tell()
|
||||
extra = "" if size > dirpos else f" > file size {size}"
|
||||
warn(
|
||||
"FIF tag directory missing at the end of the file "
|
||||
f"(at byte {dirpos}{extra}), possibly corrupted file: {fname}"
|
||||
)
|
||||
else:
|
||||
directory = dir_tag.data
|
||||
read_slow = False
|
||||
if read_slow:
|
||||
pos = 0
|
||||
fid.seek(pos, 0)
|
||||
directory = list()
|
||||
while pos is not None:
|
||||
tag = _read_tag_header(fid, pos)
|
||||
if tag is None:
|
||||
break # HACK : to fix file ending with empty tag...
|
||||
pos = tag.next_pos
|
||||
directory.append(tag)
|
||||
|
||||
tree, _ = make_dir_tree(fid, directory, indent=1)
|
||||
|
||||
logger.debug("[done]")
|
||||
|
||||
# Back to the beginning
|
||||
fid.seek(0)
|
||||
|
||||
return fid, tree, directory
|
||||
|
||||
|
||||
@verbose
|
||||
def show_fiff(
|
||||
fname,
|
||||
indent=" ",
|
||||
read_limit=np.inf,
|
||||
max_str=30,
|
||||
output=str,
|
||||
tag=None,
|
||||
*,
|
||||
show_bytes=False,
|
||||
verbose=None,
|
||||
):
|
||||
"""Show FIFF information.
|
||||
|
||||
This function is similar to mne_show_fiff.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like
|
||||
Filename to evaluate.
|
||||
indent : str
|
||||
How to indent the lines.
|
||||
read_limit : int
|
||||
Max number of bytes of data to read from a tag. Can be np.inf
|
||||
to always read all data (helps test read completion).
|
||||
max_str : int
|
||||
Max number of characters of string representation to print for
|
||||
each tag's data.
|
||||
output : type
|
||||
Either str or list. str is a convenience output for printing.
|
||||
tag : int | None
|
||||
Provide information about this tag. If None (default), all information
|
||||
is shown.
|
||||
show_bytes : bool
|
||||
If True (default False), print the byte offsets of each tag.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
contents : str
|
||||
The contents of the file.
|
||||
"""
|
||||
if output not in [list, str]:
|
||||
raise ValueError("output must be list or str")
|
||||
if isinstance(tag, str): # command mne show_fiff passes string
|
||||
tag = int(tag)
|
||||
fname = _check_fname(fname, "read", True)
|
||||
f, tree, _ = fiff_open(fname)
|
||||
# This gets set to 0 (unknown) by fiff_open, but FIFFB_ROOT probably
|
||||
# makes more sense for display
|
||||
tree["block"] = FIFF.FIFFB_ROOT
|
||||
with f as fid:
|
||||
out = _show_tree(
|
||||
fid,
|
||||
tree,
|
||||
indent=indent,
|
||||
level=0,
|
||||
read_limit=read_limit,
|
||||
max_str=max_str,
|
||||
tag_id=tag,
|
||||
show_bytes=show_bytes,
|
||||
)
|
||||
if output is str:
|
||||
out = "\n".join(out)
|
||||
return out
|
||||
|
||||
|
||||
def _find_type(value, fmts=("FIFF_",), exclude=("FIFF_UNIT",)):
|
||||
"""Find matching values."""
|
||||
value = int(value)
|
||||
vals = [
|
||||
k
|
||||
for k, v in FIFF.items()
|
||||
if v == value
|
||||
and any(fmt in k for fmt in fmts)
|
||||
and not any(exc in k for exc in exclude)
|
||||
]
|
||||
if len(vals) == 0:
|
||||
vals = ["???"]
|
||||
return vals
|
||||
|
||||
|
||||
def _show_tree(
|
||||
fid,
|
||||
tree,
|
||||
indent,
|
||||
level,
|
||||
read_limit,
|
||||
max_str,
|
||||
tag_id,
|
||||
*,
|
||||
show_bytes=False,
|
||||
):
|
||||
"""Show FIFF tree."""
|
||||
this_idt = indent * level
|
||||
next_idt = indent * (level + 1)
|
||||
# print block-level information
|
||||
found_types = "/".join(_find_type(tree["block"], fmts=["FIFFB_"]))
|
||||
out = [f"{this_idt}{str(int(tree['block'])).ljust(4)} = {found_types}"]
|
||||
tag_found = False
|
||||
if tag_id is None or out[0].strip().startswith(str(tag_id)):
|
||||
tag_found = True
|
||||
|
||||
if tree["directory"] is not None:
|
||||
kinds = [ent.kind for ent in tree["directory"]] + [-1]
|
||||
types = [ent.type for ent in tree["directory"]]
|
||||
sizes = [ent.size for ent in tree["directory"]]
|
||||
poss = [ent.pos for ent in tree["directory"]]
|
||||
counter = 0
|
||||
good = True
|
||||
for k, kn, size, pos, type_ in zip(kinds[:-1], kinds[1:], sizes, poss, types):
|
||||
if not tag_found and k != tag_id:
|
||||
continue
|
||||
tag = Tag(kind=k, type=type_, size=size, next=FIFF.FIFFV_NEXT_NONE, pos=pos)
|
||||
if read_limit is None or size <= read_limit:
|
||||
try:
|
||||
tag = read_tag(fid, pos)
|
||||
except Exception:
|
||||
good = False
|
||||
|
||||
if kn == k:
|
||||
# don't print if the next item is the same type (count 'em)
|
||||
counter += 1
|
||||
else:
|
||||
if show_bytes:
|
||||
at = f" @{pos}"
|
||||
else:
|
||||
at = ""
|
||||
# find the tag type
|
||||
this_type = _find_type(k, fmts=["FIFF_"])
|
||||
# prepend a count if necessary
|
||||
prepend = "x" + str(counter + 1) + ": " if counter > 0 else ""
|
||||
postpend = ""
|
||||
# print tag data nicely
|
||||
if tag.data is not None:
|
||||
postpend = " = " + str(tag.data)[:max_str]
|
||||
if isinstance(tag.data, np.ndarray):
|
||||
if tag.data.size > 1:
|
||||
postpend += " ... array size=" + str(tag.data.size)
|
||||
elif isinstance(tag.data, dict):
|
||||
postpend += " ... dict len=" + str(len(tag.data))
|
||||
elif isinstance(tag.data, str):
|
||||
postpend += " ... str len=" + str(len(tag.data))
|
||||
elif isinstance(tag.data, list | tuple):
|
||||
postpend += " ... list len=" + str(len(tag.data))
|
||||
elif issparse(tag.data):
|
||||
postpend += (
|
||||
f" ... sparse ({tag.data.getformat()}) shape="
|
||||
f"{tag.data.shape}"
|
||||
)
|
||||
else:
|
||||
postpend += " ... type=" + str(type(tag.data))
|
||||
postpend = ">" * 20 + f"BAD @{pos}" if not good else postpend
|
||||
matrix_info = _matrix_info(tag)
|
||||
if matrix_info is not None:
|
||||
_, type_, _, _ = matrix_info
|
||||
type_ = _call_dict_names.get(type_, f"?{type_}?")
|
||||
this_type = "/".join(this_type)
|
||||
out += [
|
||||
f"{next_idt}{prepend}{str(k).ljust(4)} = "
|
||||
f"{this_type}{at} ({size}b {type_}) {postpend}"
|
||||
]
|
||||
out[-1] = out[-1].replace("\n", "¶")
|
||||
counter = 0
|
||||
good = True
|
||||
if tag_id in kinds:
|
||||
tag_found = True
|
||||
if not tag_found:
|
||||
out = [""]
|
||||
level = -1 # removes extra indent
|
||||
# deal with children
|
||||
for branch in tree["children"]:
|
||||
out += _show_tree(
|
||||
fid,
|
||||
branch,
|
||||
indent,
|
||||
level + 1,
|
||||
read_limit,
|
||||
max_str,
|
||||
tag_id,
|
||||
show_bytes=show_bytes,
|
||||
)
|
||||
return out
|
||||
1413
mne/_fiff/pick.py
Normal file
345
mne/_fiff/proc_history.py
Normal file
@@ -0,0 +1,345 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..fixes import _csc_array_cast
|
||||
from ..utils import _check_fname, warn
|
||||
from .constants import FIFF
|
||||
from .open import fiff_open, read_tag
|
||||
from .tag import _float_item, _int_item, find_tag
|
||||
from .tree import dir_tree_find
|
||||
from .write import (
|
||||
_safe_name_list,
|
||||
end_block,
|
||||
start_block,
|
||||
write_float,
|
||||
write_float_matrix,
|
||||
write_float_sparse,
|
||||
write_id,
|
||||
write_int,
|
||||
write_int_matrix,
|
||||
write_name_list_sanitized,
|
||||
write_string,
|
||||
)
|
||||
|
||||
_proc_map = dict( # ID, caster, writer
|
||||
parent_file_id=(
|
||||
FIFF.FIFF_PARENT_FILE_ID,
|
||||
dict,
|
||||
write_id,
|
||||
),
|
||||
block_id=(
|
||||
FIFF.FIFF_BLOCK_ID,
|
||||
dict,
|
||||
write_id,
|
||||
),
|
||||
parent_block_id=(
|
||||
FIFF.FIFF_PARENT_BLOCK_ID,
|
||||
dict,
|
||||
write_id,
|
||||
),
|
||||
date=(
|
||||
FIFF.FIFF_MEAS_DATE,
|
||||
lambda d: tuple(int(dd) for dd in d),
|
||||
write_int,
|
||||
),
|
||||
experimenter=(
|
||||
FIFF.FIFF_EXPERIMENTER,
|
||||
str,
|
||||
write_string,
|
||||
),
|
||||
creator=(
|
||||
FIFF.FIFF_CREATOR,
|
||||
str,
|
||||
write_string,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def _read_proc_history(fid, tree):
|
||||
"""Read processing history from fiff file.
|
||||
|
||||
This function reads the SSS info, the CTC correction and the
|
||||
calibaraions from the SSS processing logs inside af a raw file
|
||||
(C.f. Maxfilter v2.2 manual (October 2010), page 21)::
|
||||
|
||||
104 = { 900 = proc. history
|
||||
104 = { 901 = proc. record
|
||||
103 = block ID
|
||||
204 = date
|
||||
212 = scientist
|
||||
113 = creator program
|
||||
104 = { 502 = SSS info
|
||||
264 = SSS task
|
||||
263 = SSS coord frame
|
||||
265 = SSS origin
|
||||
266 = SSS ins.order
|
||||
267 = SSS outs.order
|
||||
268 = SSS nr chnls
|
||||
269 = SSS components
|
||||
278 = SSS nfree
|
||||
243 = HPI g limit 0.98
|
||||
244 = HPI dist limit 0.005
|
||||
105 = } 502 = SSS info
|
||||
104 = { 504 = MaxST info
|
||||
264 = SSS task
|
||||
272 = SSST subspace correlation
|
||||
279 = SSST buffer length
|
||||
105 = }
|
||||
104 = { 501 = CTC correction
|
||||
103 = block ID
|
||||
204 = date
|
||||
113 = creator program
|
||||
800 = CTC matrix
|
||||
3417 = proj item chs
|
||||
105 = } 501 = CTC correction
|
||||
104 = { 503 = SSS finecalib.
|
||||
270 = SSS cal chnls
|
||||
271 = SSS cal coeff
|
||||
105 = } 503 = SSS finecalib.
|
||||
105 = } 901 = proc. record
|
||||
105 = } 900 = proc. history
|
||||
"""
|
||||
proc_history = dir_tree_find(tree, FIFF.FIFFB_PROCESSING_HISTORY)
|
||||
out = list()
|
||||
if len(proc_history) > 0:
|
||||
proc_history = proc_history[0]
|
||||
proc_records = dir_tree_find(proc_history, FIFF.FIFFB_PROCESSING_RECORD)
|
||||
for proc_record in proc_records:
|
||||
record = dict()
|
||||
for i_ent in range(proc_record["nent"]):
|
||||
kind = proc_record["directory"][i_ent].kind
|
||||
pos = proc_record["directory"][i_ent].pos
|
||||
for key, (id_, cast, _) in _proc_map.items():
|
||||
if kind == id_:
|
||||
tag = read_tag(fid, pos)
|
||||
record[key] = cast(tag.data)
|
||||
break
|
||||
else:
|
||||
warn(f"Unknown processing history item {kind}")
|
||||
record["max_info"] = _read_maxfilter_record(fid, proc_record)
|
||||
iass = dir_tree_find(proc_record, FIFF.FIFFB_IAS)
|
||||
if len(iass) > 0:
|
||||
# XXX should eventually populate this
|
||||
ss = [dict() for _ in range(len(iass))]
|
||||
record["ias"] = ss
|
||||
if len(record["max_info"]) > 0:
|
||||
out.append(record)
|
||||
return out
|
||||
|
||||
|
||||
def _write_proc_history(fid, info):
|
||||
"""Write processing history to file."""
|
||||
if len(info["proc_history"]) > 0:
|
||||
start_block(fid, FIFF.FIFFB_PROCESSING_HISTORY)
|
||||
for record in info["proc_history"]:
|
||||
start_block(fid, FIFF.FIFFB_PROCESSING_RECORD)
|
||||
for key, (id_, _, writer) in _proc_map.items():
|
||||
if key in record:
|
||||
writer(fid, id_, record[key])
|
||||
_write_maxfilter_record(fid, record["max_info"])
|
||||
if "ias" in record:
|
||||
for _ in record["ias"]:
|
||||
start_block(fid, FIFF.FIFFB_IAS)
|
||||
# XXX should eventually populate this
|
||||
end_block(fid, FIFF.FIFFB_IAS)
|
||||
end_block(fid, FIFF.FIFFB_PROCESSING_RECORD)
|
||||
end_block(fid, FIFF.FIFFB_PROCESSING_HISTORY)
|
||||
|
||||
|
||||
_sss_info_keys = (
|
||||
"job",
|
||||
"frame",
|
||||
"origin",
|
||||
"in_order",
|
||||
"out_order",
|
||||
"nchan",
|
||||
"components",
|
||||
"nfree",
|
||||
"hpi_g_limit",
|
||||
"hpi_dist_limit",
|
||||
)
|
||||
_sss_info_ids = (
|
||||
FIFF.FIFF_SSS_JOB,
|
||||
FIFF.FIFF_SSS_FRAME,
|
||||
FIFF.FIFF_SSS_ORIGIN,
|
||||
FIFF.FIFF_SSS_ORD_IN,
|
||||
FIFF.FIFF_SSS_ORD_OUT,
|
||||
FIFF.FIFF_SSS_NMAG,
|
||||
FIFF.FIFF_SSS_COMPONENTS,
|
||||
FIFF.FIFF_SSS_NFREE,
|
||||
FIFF.FIFF_HPI_FIT_GOOD_LIMIT,
|
||||
FIFF.FIFF_HPI_FIT_DIST_LIMIT,
|
||||
)
|
||||
_sss_info_writers = (
|
||||
write_int,
|
||||
write_int,
|
||||
write_float,
|
||||
write_int,
|
||||
write_int,
|
||||
write_int,
|
||||
write_int,
|
||||
write_int,
|
||||
write_float,
|
||||
write_float,
|
||||
)
|
||||
_sss_info_casters = (
|
||||
_int_item,
|
||||
_int_item,
|
||||
np.array,
|
||||
_int_item,
|
||||
_int_item,
|
||||
_int_item,
|
||||
np.array,
|
||||
_int_item,
|
||||
_float_item,
|
||||
_float_item,
|
||||
)
|
||||
|
||||
_max_st_keys = ("job", "subspcorr", "buflen")
|
||||
_max_st_ids = (FIFF.FIFF_SSS_JOB, FIFF.FIFF_SSS_ST_CORR, FIFF.FIFF_SSS_ST_LENGTH)
|
||||
_max_st_writers = (write_int, write_float, write_float)
|
||||
_max_st_casters = (_int_item, _float_item, _float_item)
|
||||
|
||||
_sss_ctc_keys = ("block_id", "date", "creator", "decoupler")
|
||||
_sss_ctc_ids = (
|
||||
FIFF.FIFF_BLOCK_ID,
|
||||
FIFF.FIFF_MEAS_DATE,
|
||||
FIFF.FIFF_CREATOR,
|
||||
FIFF.FIFF_DECOUPLER_MATRIX,
|
||||
)
|
||||
_sss_ctc_writers = (write_id, write_int, write_string, write_float_sparse)
|
||||
_sss_ctc_casters = (dict, np.array, str, _csc_array_cast)
|
||||
|
||||
_sss_cal_keys = ("cal_chans", "cal_corrs")
|
||||
_sss_cal_ids = (FIFF.FIFF_SSS_CAL_CHANS, FIFF.FIFF_SSS_CAL_CORRS)
|
||||
_sss_cal_writers = (write_int_matrix, write_float_matrix)
|
||||
_sss_cal_casters = (np.array, np.array)
|
||||
|
||||
|
||||
def _read_ctc(fname):
|
||||
"""Read cross-talk correction matrix."""
|
||||
fname = _check_fname(fname, overwrite="read", must_exist=True)
|
||||
f, tree, _ = fiff_open(fname)
|
||||
with f as fid:
|
||||
sss_ctc = _read_maxfilter_record(fid, tree)["sss_ctc"]
|
||||
bad_str = f"Invalid cross-talk FIF: {fname}"
|
||||
if len(sss_ctc) == 0:
|
||||
raise ValueError(bad_str)
|
||||
node = dir_tree_find(tree, FIFF.FIFFB_DATA_CORRECTION)[0]
|
||||
comment = find_tag(fid, node, FIFF.FIFF_COMMENT).data
|
||||
if comment != "cross-talk compensation matrix":
|
||||
raise ValueError(bad_str)
|
||||
sss_ctc["creator"] = find_tag(fid, node, FIFF.FIFF_CREATOR).data
|
||||
sss_ctc["date"] = find_tag(fid, node, FIFF.FIFF_MEAS_DATE).data
|
||||
return sss_ctc
|
||||
|
||||
|
||||
def _read_maxfilter_record(fid, tree):
|
||||
"""Read maxfilter processing record from file."""
|
||||
sss_info_block = dir_tree_find(tree, FIFF.FIFFB_SSS_INFO) # 502
|
||||
sss_info = dict()
|
||||
if len(sss_info_block) > 0:
|
||||
sss_info_block = sss_info_block[0]
|
||||
for i_ent in range(sss_info_block["nent"]):
|
||||
kind = sss_info_block["directory"][i_ent].kind
|
||||
pos = sss_info_block["directory"][i_ent].pos
|
||||
for key, id_, cast in zip(_sss_info_keys, _sss_info_ids, _sss_info_casters):
|
||||
if kind == id_:
|
||||
tag = read_tag(fid, pos)
|
||||
sss_info[key] = cast(tag.data)
|
||||
break
|
||||
|
||||
max_st_block = dir_tree_find(tree, FIFF.FIFFB_SSS_ST_INFO) # 504
|
||||
max_st = dict()
|
||||
if len(max_st_block) > 0:
|
||||
max_st_block = max_st_block[0]
|
||||
for i_ent in range(max_st_block["nent"]):
|
||||
kind = max_st_block["directory"][i_ent].kind
|
||||
pos = max_st_block["directory"][i_ent].pos
|
||||
for key, id_, cast in zip(_max_st_keys, _max_st_ids, _max_st_casters):
|
||||
if kind == id_:
|
||||
tag = read_tag(fid, pos)
|
||||
max_st[key] = cast(tag.data)
|
||||
break
|
||||
|
||||
sss_ctc_block = dir_tree_find(tree, FIFF.FIFFB_CHANNEL_DECOUPLER) # 501
|
||||
sss_ctc = dict()
|
||||
if len(sss_ctc_block) > 0:
|
||||
sss_ctc_block = sss_ctc_block[0]
|
||||
for i_ent in range(sss_ctc_block["nent"]):
|
||||
kind = sss_ctc_block["directory"][i_ent].kind
|
||||
pos = sss_ctc_block["directory"][i_ent].pos
|
||||
for key, id_, cast in zip(_sss_ctc_keys, _sss_ctc_ids, _sss_ctc_casters):
|
||||
if kind == id_:
|
||||
tag = read_tag(fid, pos)
|
||||
sss_ctc[key] = cast(tag.data)
|
||||
break
|
||||
else:
|
||||
if kind == FIFF.FIFF_PROJ_ITEM_CH_NAME_LIST:
|
||||
tag = read_tag(fid, pos)
|
||||
chs = _safe_name_list(tag.data, "read", "proj_items_chs")
|
||||
# This list can null chars in the last entry, e.g.:
|
||||
# [..., 'MEG2642', 'MEG2643', 'MEG2641\x00 ... \x00']
|
||||
chs[-1] = chs[-1].split("\x00")[0]
|
||||
sss_ctc["proj_items_chs"] = chs
|
||||
|
||||
sss_cal_block = dir_tree_find(tree, FIFF.FIFFB_SSS_CAL) # 503
|
||||
sss_cal = dict()
|
||||
if len(sss_cal_block) > 0:
|
||||
sss_cal_block = sss_cal_block[0]
|
||||
for i_ent in range(sss_cal_block["nent"]):
|
||||
kind = sss_cal_block["directory"][i_ent].kind
|
||||
pos = sss_cal_block["directory"][i_ent].pos
|
||||
for key, id_, cast in zip(_sss_cal_keys, _sss_cal_ids, _sss_cal_casters):
|
||||
if kind == id_:
|
||||
tag = read_tag(fid, pos)
|
||||
sss_cal[key] = cast(tag.data)
|
||||
break
|
||||
|
||||
max_info = dict(sss_info=sss_info, sss_ctc=sss_ctc, sss_cal=sss_cal, max_st=max_st)
|
||||
return max_info
|
||||
|
||||
|
||||
def _write_maxfilter_record(fid, record):
|
||||
"""Write maxfilter processing record to file."""
|
||||
sss_info = record["sss_info"]
|
||||
if len(sss_info) > 0:
|
||||
start_block(fid, FIFF.FIFFB_SSS_INFO)
|
||||
for key, id_, writer in zip(_sss_info_keys, _sss_info_ids, _sss_info_writers):
|
||||
if key in sss_info:
|
||||
writer(fid, id_, sss_info[key])
|
||||
end_block(fid, FIFF.FIFFB_SSS_INFO)
|
||||
|
||||
max_st = record["max_st"]
|
||||
if len(max_st) > 0:
|
||||
start_block(fid, FIFF.FIFFB_SSS_ST_INFO)
|
||||
for key, id_, writer in zip(_max_st_keys, _max_st_ids, _max_st_writers):
|
||||
if key in max_st:
|
||||
writer(fid, id_, max_st[key])
|
||||
end_block(fid, FIFF.FIFFB_SSS_ST_INFO)
|
||||
|
||||
sss_ctc = record["sss_ctc"]
|
||||
if len(sss_ctc) > 0: # dict has entries
|
||||
start_block(fid, FIFF.FIFFB_CHANNEL_DECOUPLER)
|
||||
for key, id_, writer in zip(_sss_ctc_keys, _sss_ctc_ids, _sss_ctc_writers):
|
||||
if key in sss_ctc:
|
||||
writer(fid, id_, sss_ctc[key])
|
||||
if "proj_items_chs" in sss_ctc:
|
||||
write_name_list_sanitized(
|
||||
fid,
|
||||
FIFF.FIFF_PROJ_ITEM_CH_NAME_LIST,
|
||||
sss_ctc["proj_items_chs"],
|
||||
"proj_items_chs",
|
||||
)
|
||||
end_block(fid, FIFF.FIFFB_CHANNEL_DECOUPLER)
|
||||
|
||||
sss_cal = record["sss_cal"]
|
||||
if len(sss_cal) > 0:
|
||||
start_block(fid, FIFF.FIFFB_SSS_CAL)
|
||||
for key, id_, writer in zip(_sss_cal_keys, _sss_cal_ids, _sss_cal_writers):
|
||||
if key in sss_cal:
|
||||
writer(fid, id_, sss_cal[key])
|
||||
end_block(fid, FIFF.FIFFB_SSS_CAL)
|
||||
1189
mne/_fiff/proj.py
Normal file
738
mne/_fiff/reference.py
Normal file
@@ -0,0 +1,738 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..defaults import DEFAULTS
|
||||
from ..utils import (
|
||||
_check_option,
|
||||
_check_preload,
|
||||
_on_missing,
|
||||
_validate_type,
|
||||
fill_doc,
|
||||
logger,
|
||||
pinv,
|
||||
verbose,
|
||||
warn,
|
||||
)
|
||||
from .constants import FIFF
|
||||
from .meas_info import _check_ch_keys
|
||||
from .pick import _ELECTRODE_CH_TYPES, pick_channels, pick_channels_forward, pick_types
|
||||
from .proj import _has_eeg_average_ref_proj, make_eeg_average_ref_proj, setup_proj
|
||||
|
||||
|
||||
def _check_before_reference(inst, ref_from, ref_to, ch_type):
|
||||
"""Prepare instance for referencing."""
|
||||
# Check to see that data is preloaded
|
||||
_check_preload(inst, "Applying a reference")
|
||||
|
||||
ch_type = _get_ch_type(inst, ch_type)
|
||||
ch_dict = {**{type_: True for type_ in ch_type}, "meg": False, "ref_meg": False}
|
||||
eeg_idx = pick_types(inst.info, **ch_dict)
|
||||
|
||||
if ref_to is None:
|
||||
ref_to = [inst.ch_names[i] for i in eeg_idx]
|
||||
extra = "EEG channels found"
|
||||
else:
|
||||
extra = "channels supplied"
|
||||
if len(ref_to) == 0:
|
||||
raise ValueError(f"No {extra} to apply the reference to")
|
||||
|
||||
_check_ssp(inst, ref_from + ref_to)
|
||||
|
||||
# If the reference touches EEG/ECoG/sEEG/DBS electrodes, note in the
|
||||
# info that a non-CAR has been applied.
|
||||
ref_to_channels = pick_channels(inst.ch_names, ref_to, ordered=True)
|
||||
if len(np.intersect1d(ref_to_channels, eeg_idx)) > 0:
|
||||
with inst.info._unlock():
|
||||
inst.info["custom_ref_applied"] = FIFF.FIFFV_MNE_CUSTOM_REF_ON
|
||||
|
||||
return ref_to
|
||||
|
||||
|
||||
def _check_ssp(inst, ref_items):
|
||||
"""Check for SSPs that may block re-referencing."""
|
||||
projs_to_remove = []
|
||||
for i, proj in enumerate(inst.info["projs"]):
|
||||
# Remove any average reference projections
|
||||
if (
|
||||
proj["desc"] == "Average EEG reference"
|
||||
or proj["kind"] == FIFF.FIFFV_PROJ_ITEM_EEG_AVREF
|
||||
):
|
||||
logger.info("Removing existing average EEG reference projection.")
|
||||
# Don't remove the projection right away, but do this at the end of
|
||||
# this loop.
|
||||
projs_to_remove.append(i)
|
||||
|
||||
# Inactive SSPs may block re-referencing
|
||||
elif (
|
||||
not proj["active"]
|
||||
and len([ch for ch in ref_items if ch in proj["data"]["col_names"]]) > 0
|
||||
):
|
||||
raise RuntimeError(
|
||||
"Inactive signal space projection (SSP) operators are "
|
||||
"present that operate on sensors involved in the desired "
|
||||
"referencing scheme. These projectors need to be applied "
|
||||
"using the apply_proj() method function before the desired "
|
||||
"reference can be set."
|
||||
)
|
||||
|
||||
for i in projs_to_remove:
|
||||
del inst.info["projs"][i]
|
||||
|
||||
# Need to call setup_proj after changing the projs:
|
||||
inst._projector, _ = setup_proj(inst.info, add_eeg_ref=False, activate=False)
|
||||
|
||||
|
||||
def _check_before_dict_reference(inst, ref_dict):
|
||||
"""Prepare instance for dict-based referencing."""
|
||||
# Check to see that data is preloaded
|
||||
_check_preload(inst, "Applying a reference")
|
||||
|
||||
# Promote all values to list-like. This simplifies our logic and also helps catch
|
||||
# self-referencing cases like `{"Cz": ["Cz"]}`
|
||||
_refdict = {k: [v] if isinstance(v, str) else list(v) for k, v in ref_dict.items()}
|
||||
|
||||
# Check that keys are strings and values are lists-of-strings
|
||||
key_types = {type(k) for k in _refdict}
|
||||
value_types = {type(v) for val in _refdict.values() for v in val}
|
||||
for elem_name, elem in dict(key=key_types, value=value_types).items():
|
||||
if bad_elem := elem - {str}:
|
||||
raise TypeError(
|
||||
f"{elem_name.capitalize()}s in the ref_channels dict must be strings. "
|
||||
f"Your dict has {elem_name}s of type "
|
||||
f'{", ".join(map(lambda x: x.__name__, bad_elem))}.'
|
||||
)
|
||||
|
||||
# Check that keys are valid channels and values are lists-of-valid-channels
|
||||
ch_set = set(inst.ch_names)
|
||||
bad_ch_set = set(inst.info["bads"])
|
||||
keys = set(_refdict)
|
||||
values = set(sum(_refdict.values(), []))
|
||||
for elem_name, elem in dict(key=keys, value=values).items():
|
||||
if bad_elem := elem - ch_set:
|
||||
raise ValueError(
|
||||
f'ref_channels dict contains invalid {elem_name}(s) '
|
||||
f'({", ".join(bad_elem)}) '
|
||||
"that are not names of channels in the instance."
|
||||
)
|
||||
# Check that values are not bad channels
|
||||
if bad_elem := elem.intersection(bad_ch_set):
|
||||
warn(
|
||||
f"ref_channels dict contains {elem_name}(s) "
|
||||
f"({', '.join(bad_elem)}) "
|
||||
"that are marked as bad channels."
|
||||
)
|
||||
|
||||
_check_ssp(inst, keys.union(values))
|
||||
|
||||
# Check for self-referencing
|
||||
self_ref = [[k] == v for k, v in _refdict.items()]
|
||||
if any(self_ref):
|
||||
which = np.array(list(_refdict))[np.nonzero(self_ref)]
|
||||
for ch in which:
|
||||
warn(f"Channel {ch} is self-referenced, which will nullify the channel.")
|
||||
|
||||
# Check that channel types match. First unpack list-like vals into separate items:
|
||||
pairs = [(k, v) for k in _refdict for v in _refdict[k]]
|
||||
ch_type_map = dict(zip(inst.ch_names, inst.get_channel_types()))
|
||||
mismatch = [ch_type_map[k] != ch_type_map[v] for k, v in pairs]
|
||||
if any(mismatch):
|
||||
mismatch_pairs = np.array(pairs)[mismatch]
|
||||
for k, v in mismatch_pairs:
|
||||
warn(
|
||||
f"Channel {k} ({ch_type_map[k]}) is referenced to channel {v} which is "
|
||||
f"a different channel type ({ch_type_map[v]})."
|
||||
)
|
||||
|
||||
# convert channel names to indices
|
||||
keys_ix = pick_channels(inst.ch_names, list(_refdict), ordered=True)
|
||||
vals_ix = (pick_channels(inst.ch_names, v, ordered=True) for v in _refdict.values())
|
||||
return dict(zip(keys_ix, vals_ix))
|
||||
|
||||
|
||||
def _apply_reference(inst, ref_from, ref_to=None, forward=None, ch_type="auto"):
|
||||
"""Apply a custom EEG referencing scheme."""
|
||||
ref_to = _check_before_reference(inst, ref_from, ref_to, ch_type)
|
||||
|
||||
# Compute reference
|
||||
if len(ref_from) > 0:
|
||||
# this is guaranteed below, but we should avoid the crazy pick_channels
|
||||
# behavior that [] gives all. Also use ordered=True just to make sure
|
||||
# that all supplied channels actually exist.
|
||||
assert len(ref_to) > 0
|
||||
ref_names = ref_from
|
||||
ref_from = pick_channels(inst.ch_names, ref_from, ordered=True)
|
||||
ref_to = pick_channels(inst.ch_names, ref_to, ordered=True)
|
||||
|
||||
data = inst._data
|
||||
ref_data = data[..., ref_from, :].mean(-2, keepdims=True)
|
||||
data[..., ref_to, :] -= ref_data
|
||||
ref_data = ref_data[..., 0, :]
|
||||
|
||||
# REST
|
||||
if forward is not None:
|
||||
# use ch_sel and the given forward
|
||||
forward = pick_channels_forward(forward, ref_names, ordered=True)
|
||||
# 1-3. Compute a forward (G) and avg-ref'ed data (done above)
|
||||
G = forward["sol"]["data"]
|
||||
assert G.shape[0] == len(ref_names)
|
||||
# 4. Compute the forward (G) and average-reference it (Ga):
|
||||
Ga = G - np.mean(G, axis=0, keepdims=True)
|
||||
# 5. Compute the Ga_inv by SVD
|
||||
Ga_inv = pinv(Ga, rtol=1e-6)
|
||||
# 6. Compute Ra = (G @ Ga_inv) in eq (8) from G and Ga_inv
|
||||
Ra = G @ Ga_inv
|
||||
# 7-8. Compute Vp = Ra @ Va; then Vpa=average(Vp)
|
||||
Vpa = np.mean(Ra @ data[..., ref_from, :], axis=-2, keepdims=True)
|
||||
data[..., ref_to, :] += Vpa
|
||||
else:
|
||||
ref_data = None
|
||||
|
||||
return inst, ref_data
|
||||
|
||||
|
||||
def _apply_dict_reference(inst, ref_dict):
|
||||
"""Apply a dict-based custom EEG referencing scheme."""
|
||||
# this converts all keys to channel indices and all values to arrays of ch. indices:
|
||||
ref_dict = _check_before_dict_reference(inst, ref_dict)
|
||||
|
||||
data = inst._data
|
||||
orig_data = data.copy()
|
||||
for ref_to, ref_from in ref_dict.items():
|
||||
ref_data = orig_data[..., ref_from, :].mean(-2, keepdims=True)
|
||||
data[..., [ref_to], :] -= ref_data
|
||||
|
||||
with inst.info._unlock():
|
||||
inst.info["custom_ref_applied"] = FIFF.FIFFV_MNE_CUSTOM_REF_ON
|
||||
return inst, None
|
||||
|
||||
|
||||
@fill_doc
|
||||
def add_reference_channels(inst, ref_channels, copy=True):
|
||||
"""Add reference channels to data that consists of all zeros.
|
||||
|
||||
Adds reference channels to data that were not included during recording.
|
||||
This is useful when you need to re-reference your data to different
|
||||
channels. These added channels will consist of all zeros.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
inst : instance of Raw | Epochs | Evoked
|
||||
Instance of Raw or Epochs with EEG channels and reference channel(s).
|
||||
%(ref_channels)s
|
||||
copy : bool
|
||||
Specifies whether the data will be copied (True) or modified in-place
|
||||
(False). Defaults to True.
|
||||
|
||||
Returns
|
||||
-------
|
||||
inst : instance of Raw | Epochs | Evoked
|
||||
Data with added EEG reference channels.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. warning::
|
||||
When :ref:`re-referencing <tut-set-eeg-ref>`,
|
||||
make sure to apply the montage using :meth:`mne.io.Raw.set_montage`
|
||||
only after calling this function. Applying a montage will only set
|
||||
locations of channels that exist at the time it is applied.
|
||||
"""
|
||||
from ..epochs import BaseEpochs
|
||||
from ..evoked import Evoked
|
||||
from ..io import BaseRaw
|
||||
|
||||
# Check to see that data is preloaded
|
||||
_check_preload(inst, "add_reference_channels")
|
||||
_validate_type(ref_channels, (list, tuple, str), "ref_channels")
|
||||
if isinstance(ref_channels, str):
|
||||
ref_channels = [ref_channels]
|
||||
for ch in ref_channels:
|
||||
if ch in inst.info["ch_names"]:
|
||||
raise ValueError(f"Channel {ch} already specified in inst.")
|
||||
|
||||
# Once CAR is applied (active), don't allow adding channels
|
||||
if _has_eeg_average_ref_proj(inst.info, check_active=True):
|
||||
raise RuntimeError("Average reference already applied to data.")
|
||||
|
||||
if copy:
|
||||
inst = inst.copy()
|
||||
|
||||
if isinstance(inst, BaseRaw | Evoked):
|
||||
data = inst._data
|
||||
refs = np.zeros((len(ref_channels), data.shape[1]))
|
||||
data = np.vstack((data, refs))
|
||||
inst._data = data
|
||||
elif isinstance(inst, BaseEpochs):
|
||||
data = inst._data
|
||||
x, y, z = data.shape
|
||||
refs = np.zeros((x * len(ref_channels), z))
|
||||
data = np.vstack((data.reshape((x * y, z), order="F"), refs))
|
||||
data = data.reshape(x, y + len(ref_channels), z, order="F")
|
||||
inst._data = data
|
||||
else:
|
||||
raise TypeError(
|
||||
f"inst should be Raw, Epochs, or Evoked instead of {type(inst)}."
|
||||
)
|
||||
nchan = len(inst.info["ch_names"])
|
||||
|
||||
if inst.info.get("dig", None) is not None:
|
||||
# A montage has been set. Try to infer location of reference channels.
|
||||
# "zeroth" EEG electrode dig points is reference
|
||||
ref_dig_loc = [
|
||||
dl
|
||||
for dl in inst.info["dig"]
|
||||
if (dl["kind"] == FIFF.FIFFV_POINT_EEG and dl["ident"] == 0)
|
||||
]
|
||||
if len(ref_channels) > 1 or len(ref_dig_loc) != len(ref_channels):
|
||||
ref_dig_array = np.full(12, np.nan)
|
||||
warn(
|
||||
"Location for this channel is unknown or ambiguous; consider calling "
|
||||
"set_montage() after adding new reference channels if needed. "
|
||||
"Applying a montage will only set locations of channels that "
|
||||
"exist at the time it is applied."
|
||||
)
|
||||
else: # n_ref_channels == 1 and a single ref digitization exists
|
||||
ref_dig_array = np.concatenate(
|
||||
(ref_dig_loc[0]["r"], ref_dig_loc[0]["r"], np.zeros(6))
|
||||
)
|
||||
# Replace the (possibly new) Ref location for each channel
|
||||
for idx in pick_types(inst.info, meg=False, eeg=True, exclude=[]):
|
||||
inst.info["chs"][idx]["loc"][3:6] = ref_dig_loc[0]["r"]
|
||||
else:
|
||||
# If no montage has ever been set, we cannot even try to infer a location.
|
||||
ref_dig_array = np.full(12, np.nan)
|
||||
|
||||
for ch in ref_channels:
|
||||
chan_info = {
|
||||
"ch_name": ch,
|
||||
"coil_type": FIFF.FIFFV_COIL_EEG,
|
||||
"kind": FIFF.FIFFV_EEG_CH,
|
||||
"logno": nchan + 1,
|
||||
"scanno": nchan + 1,
|
||||
"cal": 1,
|
||||
"range": 1.0,
|
||||
"unit_mul": FIFF.FIFF_UNITM_NONE,
|
||||
"unit": FIFF.FIFF_UNIT_V,
|
||||
"coord_frame": FIFF.FIFFV_COORD_HEAD,
|
||||
"loc": ref_dig_array,
|
||||
}
|
||||
inst.info["chs"].append(chan_info)
|
||||
inst.info._update_redundant()
|
||||
range_ = np.arange(1, len(ref_channels) + 1)
|
||||
if isinstance(inst, BaseRaw):
|
||||
inst._cals = np.hstack((inst._cals, [1] * len(ref_channels)))
|
||||
for pi, picks in enumerate(inst._read_picks):
|
||||
inst._read_picks[pi] = np.concatenate([picks, np.max(picks) + range_])
|
||||
elif isinstance(inst, BaseEpochs):
|
||||
picks = inst.picks
|
||||
inst.picks = np.concatenate([picks, np.max(picks) + range_])
|
||||
inst.info._check_consistency()
|
||||
set_eeg_reference(inst, ref_channels=ref_channels, copy=False, verbose=False)
|
||||
return inst
|
||||
|
||||
|
||||
_ref_dict = {
|
||||
FIFF.FIFFV_MNE_CUSTOM_REF_ON: "on",
|
||||
FIFF.FIFFV_MNE_CUSTOM_REF_OFF: "off",
|
||||
FIFF.FIFFV_MNE_CUSTOM_REF_CSD: "CSD",
|
||||
}
|
||||
|
||||
|
||||
def _check_can_reref(inst):
|
||||
from ..epochs import BaseEpochs
|
||||
from ..evoked import Evoked
|
||||
from ..io import BaseRaw
|
||||
|
||||
_validate_type(inst, (BaseRaw, BaseEpochs, Evoked), "Instance")
|
||||
current_custom = inst.info["custom_ref_applied"]
|
||||
if current_custom not in (
|
||||
FIFF.FIFFV_MNE_CUSTOM_REF_ON,
|
||||
FIFF.FIFFV_MNE_CUSTOM_REF_OFF,
|
||||
):
|
||||
raise RuntimeError(
|
||||
"Cannot set new reference on data with custom reference type "
|
||||
f"{_ref_dict[current_custom]!r}"
|
||||
)
|
||||
|
||||
|
||||
@verbose
|
||||
def set_eeg_reference(
|
||||
inst,
|
||||
ref_channels="average",
|
||||
copy=True,
|
||||
projection=False,
|
||||
ch_type="auto",
|
||||
forward=None,
|
||||
*,
|
||||
joint=False,
|
||||
verbose=None,
|
||||
):
|
||||
"""Specify which reference to use for EEG data.
|
||||
|
||||
Use this function to explicitly specify the desired reference for EEG.
|
||||
This can be either an existing electrode or a new virtual channel.
|
||||
This function will re-reference the data according to the desired
|
||||
reference.
|
||||
|
||||
Note that it is also possible to re-reference the signal using a
|
||||
Laplacian (LAP) "reference-free" transformation using the
|
||||
:func:`.compute_current_source_density` function.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
inst : instance of Raw | Epochs | Evoked
|
||||
Instance of Raw or Epochs with EEG channels and reference channel(s).
|
||||
%(ref_channels_set_eeg_reference)s
|
||||
copy : bool
|
||||
Specifies whether the data will be copied (True) or modified in-place
|
||||
(False). Defaults to True.
|
||||
%(projection_set_eeg_reference)s
|
||||
%(ch_type_set_eeg_reference)s
|
||||
%(forward_set_eeg_reference)s
|
||||
%(joint_set_eeg_reference)s
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
inst : instance of Raw | Epochs | Evoked
|
||||
Data with EEG channels re-referenced. If ``ref_channels="average"`` and
|
||||
``projection=True`` a projection will be added instead of directly
|
||||
re-referencing the data.
|
||||
ref_data : array
|
||||
Array of reference data subtracted from EEG channels. This will be
|
||||
``None`` if ``projection=True``, or if ``ref_channels`` is ``"REST"`` or a
|
||||
:class:`dict`.
|
||||
%(set_eeg_reference_see_also_notes)s
|
||||
"""
|
||||
from ..forward import Forward
|
||||
|
||||
_check_can_reref(inst)
|
||||
|
||||
if isinstance(ref_channels, dict):
|
||||
logger.info("Applying a custom dict-based reference.")
|
||||
return _apply_dict_reference(inst, ref_channels)
|
||||
|
||||
ch_type = _get_ch_type(inst, ch_type)
|
||||
|
||||
if projection: # average reference projector
|
||||
if ref_channels != "average":
|
||||
raise ValueError(
|
||||
'Setting projection=True is only supported for ref_channels="average", '
|
||||
f"got {ref_channels!r}."
|
||||
)
|
||||
# We need verbose='error' here in case we add projs sequentially
|
||||
if _has_eeg_average_ref_proj(inst.info, ch_type=ch_type, verbose="error"):
|
||||
warn(
|
||||
"An average reference projection was already added. The data "
|
||||
"has been left untouched."
|
||||
)
|
||||
else:
|
||||
# Creating an average reference may fail. In this case, make
|
||||
# sure that the custom_ref_applied flag is left untouched.
|
||||
custom_ref_applied = inst.info["custom_ref_applied"]
|
||||
|
||||
try:
|
||||
with inst.info._unlock():
|
||||
inst.info["custom_ref_applied"] = FIFF.FIFFV_MNE_CUSTOM_REF_OFF
|
||||
if joint:
|
||||
inst.add_proj(
|
||||
make_eeg_average_ref_proj(
|
||||
inst.info, ch_type=ch_type, activate=False
|
||||
)
|
||||
)
|
||||
else:
|
||||
for this_ch_type in ch_type:
|
||||
inst.add_proj(
|
||||
make_eeg_average_ref_proj(
|
||||
inst.info, ch_type=this_ch_type, activate=False
|
||||
)
|
||||
)
|
||||
except Exception:
|
||||
with inst.info._unlock():
|
||||
inst.info["custom_ref_applied"] = custom_ref_applied
|
||||
raise
|
||||
# If the data has been preloaded, projections will no
|
||||
# longer be automatically applied.
|
||||
if inst.preload:
|
||||
logger.info(
|
||||
"Average reference projection was added, "
|
||||
"but has not been applied yet. Use the "
|
||||
"apply_proj method to apply it."
|
||||
)
|
||||
return inst, None
|
||||
del projection # not used anymore
|
||||
|
||||
inst = inst.copy() if copy else inst
|
||||
ch_dict = {**{type_: True for type_ in ch_type}, "meg": False, "ref_meg": False}
|
||||
ch_sel = [inst.ch_names[i] for i in pick_types(inst.info, **ch_dict)]
|
||||
|
||||
if ref_channels == "REST":
|
||||
_validate_type(forward, Forward, 'forward when ref_channels="REST"')
|
||||
else:
|
||||
forward = None # signal to _apply_reference not to do REST
|
||||
|
||||
if ref_channels in ("average", "REST"):
|
||||
logger.info(f"Applying {ref_channels} reference.")
|
||||
ref_channels = ch_sel
|
||||
|
||||
if ref_channels == []:
|
||||
logger.info("EEG data marked as already having the desired reference.")
|
||||
else:
|
||||
logger.info(
|
||||
"Applying a custom "
|
||||
f"{tuple(DEFAULTS['titles'][type_] for type_ in ch_type)} "
|
||||
"reference."
|
||||
)
|
||||
|
||||
return _apply_reference(inst, ref_channels, ch_sel, forward, ch_type=ch_type)
|
||||
|
||||
|
||||
def _get_ch_type(inst, ch_type):
|
||||
_validate_type(ch_type, (str, list, tuple), "ch_type")
|
||||
valid_ch_types = ("auto",) + _ELECTRODE_CH_TYPES
|
||||
if isinstance(ch_type, str):
|
||||
_check_option("ch_type", ch_type, valid_ch_types)
|
||||
if ch_type != "auto":
|
||||
ch_type = [ch_type]
|
||||
elif isinstance(ch_type, list | tuple):
|
||||
for type_ in ch_type:
|
||||
_validate_type(type_, str, "ch_type")
|
||||
_check_option("ch_type", type_, valid_ch_types[1:])
|
||||
ch_type = list(ch_type)
|
||||
|
||||
# if ch_type is 'auto', search through list to find first reasonable
|
||||
# reference-able channel type.
|
||||
if ch_type == "auto":
|
||||
for type_ in _ELECTRODE_CH_TYPES:
|
||||
if type_ in inst:
|
||||
ch_type = [type_]
|
||||
logger.info(
|
||||
f"{DEFAULTS['titles'][type_]} channel type selected for "
|
||||
"re-referencing"
|
||||
)
|
||||
break
|
||||
# if auto comes up empty, or the user specifies a bad ch_type.
|
||||
else:
|
||||
raise ValueError("No EEG, ECoG, sEEG or DBS channels found to rereference.")
|
||||
return ch_type
|
||||
|
||||
|
||||
@verbose
|
||||
def set_bipolar_reference(
|
||||
inst,
|
||||
anode,
|
||||
cathode,
|
||||
ch_name=None,
|
||||
ch_info=None,
|
||||
drop_refs=True,
|
||||
copy=True,
|
||||
on_bad="warn",
|
||||
verbose=None,
|
||||
):
|
||||
"""Re-reference selected channels using a bipolar referencing scheme.
|
||||
|
||||
A bipolar reference takes the difference between two channels (the anode
|
||||
minus the cathode) and adds it as a new virtual channel. The original
|
||||
channels will be dropped by default.
|
||||
|
||||
Multiple anodes and cathodes can be specified, in which case multiple
|
||||
virtual channels will be created. The 1st cathode will be subtracted
|
||||
from the 1st anode, the 2nd cathode from the 2nd anode, etc.
|
||||
|
||||
By default, the virtual channels will be annotated with channel-info and
|
||||
-location of the anodes and coil types will be set to EEG_BIPOLAR.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
inst : instance of Raw | Epochs | Evoked
|
||||
Data containing the unreferenced channels.
|
||||
anode : str | list of str
|
||||
The name(s) of the channel(s) to use as anode in the bipolar reference.
|
||||
cathode : str | list of str
|
||||
The name(s) of the channel(s) to use as cathode in the bipolar
|
||||
reference.
|
||||
ch_name : str | list of str | None
|
||||
The channel name(s) for the virtual channel(s) containing the resulting
|
||||
signal. By default, bipolar channels are named after the anode and
|
||||
cathode, but it is recommended to supply a more meaningful name.
|
||||
ch_info : dict | list of dict | None
|
||||
This parameter can be used to supply a dictionary (or a dictionary for
|
||||
each bipolar channel) containing channel information to merge in,
|
||||
overwriting the default values. Defaults to None.
|
||||
drop_refs : bool
|
||||
Whether to drop the anode/cathode channels from the instance.
|
||||
copy : bool
|
||||
Whether to operate on a copy of the data (True) or modify it in-place
|
||||
(False). Defaults to True.
|
||||
on_bad : str
|
||||
If a bipolar channel is created from a bad anode or a bad cathode, mne
|
||||
warns if on_bad="warns", raises ValueError if on_bad="raise", and does
|
||||
nothing if on_bad="ignore". For "warn" and "ignore", the new bipolar
|
||||
channel will be marked as bad. Defaults to on_bad="warns".
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
inst : instance of Raw | Epochs | Evoked
|
||||
Data with the specified channels re-referenced.
|
||||
|
||||
See Also
|
||||
--------
|
||||
set_eeg_reference : Convenience function for creating an EEG reference.
|
||||
|
||||
Notes
|
||||
-----
|
||||
1. If the anodes contain any EEG channels, this function removes
|
||||
any pre-existing average reference projections.
|
||||
|
||||
2. During source localization, the EEG signal should have an average
|
||||
reference.
|
||||
|
||||
3. The data must be preloaded.
|
||||
|
||||
.. versionadded:: 0.9.0
|
||||
"""
|
||||
from ..epochs import BaseEpochs, EpochsArray
|
||||
from ..evoked import EvokedArray
|
||||
from ..io import BaseRaw, RawArray
|
||||
from .meas_info import create_info
|
||||
|
||||
_check_can_reref(inst)
|
||||
if not isinstance(anode, list):
|
||||
anode = [anode]
|
||||
|
||||
if not isinstance(cathode, list):
|
||||
cathode = [cathode]
|
||||
|
||||
if len(anode) != len(cathode):
|
||||
raise ValueError(
|
||||
f"Number of anodes (got {len(anode)}) must equal the number "
|
||||
f"of cathodes (got {len(cathode)})."
|
||||
)
|
||||
|
||||
if ch_name is None:
|
||||
ch_name = [f"{a}-{c}" for (a, c) in zip(anode, cathode)]
|
||||
elif not isinstance(ch_name, list):
|
||||
ch_name = [ch_name]
|
||||
if len(ch_name) != len(anode):
|
||||
raise ValueError(
|
||||
"Number of channel names must equal the number of "
|
||||
f"anodes/cathodes (got {len(ch_name)})."
|
||||
)
|
||||
|
||||
# Check for duplicate channel names (it is allowed to give the name of the
|
||||
# anode or cathode channel, as they will be replaced).
|
||||
for ch, a, c in zip(ch_name, anode, cathode):
|
||||
if ch not in [a, c] and ch in inst.ch_names:
|
||||
raise ValueError(
|
||||
f'There is already a channel named "{ch}", please '
|
||||
"specify a different name for the bipolar "
|
||||
"channel using the ch_name parameter."
|
||||
)
|
||||
|
||||
if ch_info is None:
|
||||
ch_info = [{} for _ in anode]
|
||||
elif not isinstance(ch_info, list):
|
||||
ch_info = [ch_info]
|
||||
if len(ch_info) != len(anode):
|
||||
raise ValueError(
|
||||
"Number of channel info dictionaries must equal the "
|
||||
"number of anodes/cathodes."
|
||||
)
|
||||
|
||||
if copy:
|
||||
inst = inst.copy()
|
||||
|
||||
anode = _check_before_reference(
|
||||
inst, ref_from=cathode, ref_to=anode, ch_type="auto"
|
||||
)
|
||||
|
||||
# Create bipolar reference channels by multiplying the data
|
||||
# (channels x time) with a matrix (n_virtual_channels x channels)
|
||||
# and add them to the instance.
|
||||
multiplier = np.zeros((len(anode), len(inst.ch_names)))
|
||||
for idx, (a, c) in enumerate(zip(anode, cathode)):
|
||||
multiplier[idx, inst.ch_names.index(a)] = 1
|
||||
multiplier[idx, inst.ch_names.index(c)] = -1
|
||||
|
||||
ref_info = create_info(
|
||||
ch_names=ch_name,
|
||||
sfreq=inst.info["sfreq"],
|
||||
ch_types=inst.get_channel_types(picks=anode),
|
||||
)
|
||||
|
||||
# Update "chs" in Reference-Info.
|
||||
for ch_idx, (an, info) in enumerate(zip(anode, ch_info)):
|
||||
_check_ch_keys(info, ch_idx, name="ch_info", check_min=False)
|
||||
an_idx = inst.ch_names.index(an)
|
||||
# Copy everything from anode (except ch_name).
|
||||
an_chs = {k: v for k, v in inst.info["chs"][an_idx].items() if k != "ch_name"}
|
||||
ref_info["chs"][ch_idx].update(an_chs)
|
||||
# Set coil-type to bipolar.
|
||||
ref_info["chs"][ch_idx]["coil_type"] = FIFF.FIFFV_COIL_EEG_BIPOLAR
|
||||
# Update with info from ch_info-parameter.
|
||||
ref_info["chs"][ch_idx].update(info)
|
||||
|
||||
# Set other info-keys from original instance.
|
||||
pick_info = {
|
||||
k: v
|
||||
for k, v in inst.info.items()
|
||||
if k not in ["chs", "ch_names", "bads", "nchan", "sfreq"]
|
||||
}
|
||||
|
||||
with ref_info._unlock():
|
||||
ref_info.update(pick_info)
|
||||
|
||||
# Rereferencing of data.
|
||||
ref_data = multiplier @ inst._data
|
||||
|
||||
if isinstance(inst, BaseRaw):
|
||||
ref_inst = RawArray(ref_data, ref_info, first_samp=inst.first_samp, copy=None)
|
||||
elif isinstance(inst, BaseEpochs):
|
||||
ref_inst = EpochsArray(
|
||||
ref_data,
|
||||
ref_info,
|
||||
events=inst.events,
|
||||
tmin=inst.tmin,
|
||||
event_id=inst.event_id,
|
||||
metadata=inst.metadata,
|
||||
)
|
||||
else:
|
||||
ref_inst = EvokedArray(
|
||||
ref_data,
|
||||
ref_info,
|
||||
tmin=inst.tmin,
|
||||
comment=inst.comment,
|
||||
nave=inst.nave,
|
||||
kind="average",
|
||||
)
|
||||
|
||||
# Add referenced instance to original instance.
|
||||
inst.add_channels([ref_inst], force_update_info=True)
|
||||
|
||||
# Handle bad channels.
|
||||
bad_bipolar_chs = []
|
||||
for ch_idx, (a, c) in enumerate(zip(anode, cathode)):
|
||||
if a in inst.info["bads"] or c in inst.info["bads"]:
|
||||
bad_bipolar_chs.append(ch_name[ch_idx])
|
||||
|
||||
# Add warnings if bad channels are present.
|
||||
if bad_bipolar_chs:
|
||||
msg = f"Bipolar channels are based on bad channels: {bad_bipolar_chs}."
|
||||
_on_missing(on_bad, msg)
|
||||
inst.info["bads"] += bad_bipolar_chs
|
||||
|
||||
added_channels = ", ".join([name for name in ch_name])
|
||||
logger.info(f"Added the following bipolar channels:\n{added_channels}")
|
||||
|
||||
for attr_name in ["picks", "_projector"]:
|
||||
setattr(inst, attr_name, None)
|
||||
|
||||
# Drop remaining channels.
|
||||
if drop_refs:
|
||||
drop_channels = list((set(anode) | set(cathode)) & set(inst.ch_names))
|
||||
inst.drop_channels(drop_channels)
|
||||
|
||||
return inst
|
||||
523
mne/_fiff/tag.py
Normal file
@@ -0,0 +1,523 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import html
|
||||
import re
|
||||
import struct
|
||||
from dataclasses import dataclass
|
||||
from functools import partial
|
||||
from typing import Any
|
||||
|
||||
import numpy as np
|
||||
from scipy.sparse import csc_array, csr_array
|
||||
|
||||
from ..utils import _check_option, warn
|
||||
from ..utils.numerics import _julian_to_date
|
||||
from .constants import (
|
||||
FIFF,
|
||||
_ch_coil_type_named,
|
||||
_ch_kind_named,
|
||||
_ch_unit_mul_named,
|
||||
_ch_unit_named,
|
||||
_dig_cardinal_named,
|
||||
_dig_kind_named,
|
||||
)
|
||||
|
||||
##############################################################################
|
||||
# HELPERS
|
||||
|
||||
|
||||
@dataclass
|
||||
class Tag:
|
||||
"""Tag in FIF tree structure."""
|
||||
|
||||
kind: int
|
||||
type: int
|
||||
size: int
|
||||
next: int
|
||||
pos: int
|
||||
data: Any = None
|
||||
|
||||
def __eq__(self, tag): # noqa: D105
|
||||
return int(
|
||||
self.kind == tag.kind
|
||||
and self.type == tag.type
|
||||
and self.size == tag.size
|
||||
and self.next == tag.next
|
||||
and self.pos == tag.pos
|
||||
and self.data == tag.data
|
||||
)
|
||||
|
||||
@property
|
||||
def next_pos(self):
|
||||
"""The next tag position."""
|
||||
if self.next == FIFF.FIFFV_NEXT_SEQ: # 0
|
||||
return self.pos + 16 + self.size
|
||||
elif self.next > 0:
|
||||
return self.next
|
||||
else: # self.next should be -1 if we get here
|
||||
return None # safest to return None so that things like fid.seek die
|
||||
|
||||
|
||||
def _frombuffer_rows(fid, tag_size, dtype=None, shape=None, rlims=None):
|
||||
"""Get a range of rows from a large tag."""
|
||||
if shape is not None:
|
||||
item_size = np.dtype(dtype).itemsize
|
||||
if not len(shape) == 2:
|
||||
raise ValueError("Only implemented for 2D matrices")
|
||||
want_shape = np.prod(shape)
|
||||
have_shape = tag_size // item_size
|
||||
if want_shape != have_shape:
|
||||
raise ValueError(
|
||||
f"Wrong shape specified, requested {want_shape} but got "
|
||||
f"{have_shape}"
|
||||
)
|
||||
if not len(rlims) == 2:
|
||||
raise ValueError("rlims must have two elements")
|
||||
n_row_out = rlims[1] - rlims[0]
|
||||
if n_row_out <= 0:
|
||||
raise ValueError("rlims must yield at least one output")
|
||||
row_size = item_size * shape[1]
|
||||
# # of bytes to skip at the beginning, # to read, where to end
|
||||
start_skip = int(rlims[0] * row_size)
|
||||
read_size = int(n_row_out * row_size)
|
||||
end_pos = int(fid.tell() + tag_size)
|
||||
# Move the pointer ahead to the read point
|
||||
fid.seek(start_skip, 1)
|
||||
# Do the reading
|
||||
out = np.frombuffer(fid.read(read_size), dtype=dtype)
|
||||
# Move the pointer ahead to the end of the tag
|
||||
fid.seek(end_pos)
|
||||
else:
|
||||
out = np.frombuffer(fid.read(tag_size), dtype=dtype)
|
||||
return out
|
||||
|
||||
|
||||
def _loc_to_coil_trans(loc):
|
||||
"""Convert loc vector to coil_trans."""
|
||||
assert loc.shape[-1] == 12
|
||||
coil_trans = np.zeros(loc.shape[:-1] + (4, 4))
|
||||
coil_trans[..., :3, 3] = loc[..., :3]
|
||||
coil_trans[..., :3, :3] = np.reshape(
|
||||
loc[..., 3:], loc.shape[:-1] + (3, 3)
|
||||
).swapaxes(-1, -2)
|
||||
coil_trans[..., -1, -1] = 1.0
|
||||
return coil_trans
|
||||
|
||||
|
||||
def _coil_trans_to_loc(coil_trans):
|
||||
"""Convert coil_trans to loc."""
|
||||
coil_trans = coil_trans.astype(np.float64)
|
||||
return np.roll(coil_trans.T[:, :3], 1, 0).flatten()
|
||||
|
||||
|
||||
def _loc_to_eeg_loc(loc):
|
||||
"""Convert a loc to an EEG loc."""
|
||||
if not np.isfinite(loc[:3]).all():
|
||||
raise RuntimeError("Missing EEG channel location")
|
||||
if np.isfinite(loc[3:6]).all() and (loc[3:6]).any():
|
||||
return np.array([loc[0:3], loc[3:6]]).T
|
||||
else:
|
||||
return loc[0:3][:, np.newaxis].copy()
|
||||
|
||||
|
||||
##############################################################################
|
||||
# READING FUNCTIONS
|
||||
|
||||
# None of these functions have docstring because it's more compact that way,
|
||||
# and hopefully it's clear what they do by their names and variable values.
|
||||
# See ``read_tag`` for variable descriptions. Return values are implied
|
||||
# by the function names.
|
||||
|
||||
|
||||
def _read_tag_header(fid, pos):
|
||||
"""Read only the header of a Tag."""
|
||||
fid.seek(pos, 0)
|
||||
s = fid.read(16)
|
||||
if len(s) != 16:
|
||||
where = fid.tell() - len(s)
|
||||
extra = f" in file {fid.name}" if hasattr(fid, "name") else ""
|
||||
warn(f"Invalid tag with only {len(s)}/16 bytes at position {where}{extra}")
|
||||
return None
|
||||
# struct.unpack faster than np.frombuffer, saves ~10% of time some places
|
||||
kind, type_, size, next_ = struct.unpack(">iIii", s)
|
||||
return Tag(kind, type_, size, next_, pos)
|
||||
|
||||
|
||||
def _read_matrix(fid, tag, shape, rlims):
|
||||
"""Read a matrix (dense or sparse) tag."""
|
||||
# This should be easy to implement (see _frombuffer_rows)
|
||||
# if we need it, but for now, it's not...
|
||||
if shape is not None or rlims is not None:
|
||||
raise ValueError("Row reading not implemented for matrices yet")
|
||||
|
||||
matrix_coding, matrix_type, bit, dtype = _matrix_info(tag)
|
||||
|
||||
pos = tag.pos + 16
|
||||
fid.seek(pos + tag.size - 4, 0)
|
||||
if matrix_coding == "dense":
|
||||
# Find dimensions and return to the beginning of tag data
|
||||
ndim = int(np.frombuffer(fid.read(4), dtype=">i4").item())
|
||||
fid.seek(-(ndim + 1) * 4, 1)
|
||||
dims = np.frombuffer(fid.read(4 * ndim), dtype=">i4")[::-1]
|
||||
#
|
||||
# Back to where the data start
|
||||
#
|
||||
fid.seek(pos, 0)
|
||||
|
||||
if ndim > 3:
|
||||
raise Exception(
|
||||
"Only 2 or 3-dimensional matrices are supported at this time"
|
||||
)
|
||||
|
||||
data = fid.read(int(bit * dims.prod()))
|
||||
data = np.frombuffer(data, dtype=dtype)
|
||||
# Note: we need the non-conjugate transpose here
|
||||
if matrix_type == FIFF.FIFFT_COMPLEX_FLOAT:
|
||||
data = data.view(">c8")
|
||||
elif matrix_type == FIFF.FIFFT_COMPLEX_DOUBLE:
|
||||
data = data.view(">c16")
|
||||
data.shape = dims
|
||||
else:
|
||||
# Find dimensions and return to the beginning of tag data
|
||||
ndim = int(np.frombuffer(fid.read(4), dtype=">i4").item())
|
||||
fid.seek(-(ndim + 2) * 4, 1)
|
||||
dims = np.frombuffer(fid.read(4 * (ndim + 1)), dtype=">i4")
|
||||
if ndim != 2:
|
||||
raise Exception("Only two-dimensional matrices are supported at this time")
|
||||
|
||||
# Back to where the data start
|
||||
fid.seek(pos, 0)
|
||||
nnz = int(dims[0])
|
||||
nrow = int(dims[1])
|
||||
ncol = int(dims[2])
|
||||
# We need to make a copy so that we can own the data, otherwise we get:
|
||||
# _sparsetools.csr_sort_indices(len(self.indptr) - 1, self.indptr,
|
||||
# E ValueError: WRITEBACKIFCOPY base is read-only
|
||||
data = np.frombuffer(fid.read(bit * nnz), dtype=dtype).astype(np.float32)
|
||||
shape = (dims[1], dims[2])
|
||||
if matrix_coding == "sparse CCS":
|
||||
tmp_indices = fid.read(4 * nnz)
|
||||
indices = np.frombuffer(tmp_indices, dtype=">i4")
|
||||
tmp_ptr = fid.read(4 * (ncol + 1))
|
||||
indptr = np.frombuffer(tmp_ptr, dtype=">i4")
|
||||
swap = nrow
|
||||
klass = csc_array
|
||||
else:
|
||||
assert matrix_coding == "sparse RCS", matrix_coding
|
||||
tmp_indices = fid.read(4 * nnz)
|
||||
indices = np.frombuffer(tmp_indices, dtype=">i4")
|
||||
tmp_ptr = fid.read(4 * (nrow + 1))
|
||||
indptr = np.frombuffer(tmp_ptr, dtype=">i4")
|
||||
swap = ncol
|
||||
klass = csr_array
|
||||
if indptr[-1] > len(indices) or np.any(indptr < 0):
|
||||
# There was a bug in MNE-C that caused some data to be
|
||||
# stored without byte swapping
|
||||
indices = np.concatenate(
|
||||
(
|
||||
np.frombuffer(tmp_indices[: 4 * (swap + 1)], dtype=">i4"),
|
||||
np.frombuffer(tmp_indices[4 * (swap + 1) :], dtype="<i4"),
|
||||
)
|
||||
)
|
||||
indptr = np.frombuffer(tmp_ptr, dtype="<i4")
|
||||
data = klass((data, indices, indptr), shape=shape)
|
||||
return data
|
||||
|
||||
|
||||
def _read_simple(fid, tag, shape, rlims, dtype):
|
||||
"""Read simple datatypes from tag (typically used with partial)."""
|
||||
return _frombuffer_rows(fid, tag.size, dtype=dtype, shape=shape, rlims=rlims)
|
||||
|
||||
|
||||
def _read_string(fid, tag, shape, rlims):
|
||||
"""Read a string tag."""
|
||||
# Always decode to ISO 8859-1 / latin1 (FIFF standard).
|
||||
d = _frombuffer_rows(fid, tag.size, dtype=">c", shape=shape, rlims=rlims)
|
||||
string = str(d.tobytes().decode("latin1", "ignore"))
|
||||
if re.search(r"&#[0-9a-fA-F]{6};", string):
|
||||
string = html.unescape(string)
|
||||
return string
|
||||
|
||||
|
||||
def _read_complex_float(fid, tag, shape, rlims):
|
||||
"""Read complex float tag."""
|
||||
# data gets stored twice as large
|
||||
if shape is not None:
|
||||
shape = (shape[0], shape[1] * 2)
|
||||
d = _frombuffer_rows(fid, tag.size, dtype=">f4", shape=shape, rlims=rlims)
|
||||
d = d.view(">c8")
|
||||
return d
|
||||
|
||||
|
||||
def _read_complex_double(fid, tag, shape, rlims):
|
||||
"""Read complex double tag."""
|
||||
# data gets stored twice as large
|
||||
if shape is not None:
|
||||
shape = (shape[0], shape[1] * 2)
|
||||
d = _frombuffer_rows(fid, tag.size, dtype=">f8", shape=shape, rlims=rlims)
|
||||
d = d.view(">c16")
|
||||
return d
|
||||
|
||||
|
||||
def _read_id_struct(fid, tag, shape, rlims):
|
||||
"""Read ID struct tag."""
|
||||
return dict(
|
||||
version=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
machid=np.frombuffer(fid.read(8), dtype=">i4"),
|
||||
secs=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
usecs=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
)
|
||||
|
||||
|
||||
def _read_dig_point_struct(fid, tag, shape, rlims):
|
||||
"""Read dig point struct tag."""
|
||||
kind = int(np.frombuffer(fid.read(4), dtype=">i4").item())
|
||||
kind = _dig_kind_named.get(kind, kind)
|
||||
ident = int(np.frombuffer(fid.read(4), dtype=">i4").item())
|
||||
if kind == FIFF.FIFFV_POINT_CARDINAL:
|
||||
ident = _dig_cardinal_named.get(ident, ident)
|
||||
return dict(
|
||||
kind=kind,
|
||||
ident=ident,
|
||||
r=np.frombuffer(fid.read(12), dtype=">f4"),
|
||||
coord_frame=FIFF.FIFFV_COORD_UNKNOWN,
|
||||
)
|
||||
|
||||
|
||||
def _read_coord_trans_struct(fid, tag, shape, rlims):
|
||||
"""Read coord trans struct tag."""
|
||||
from ..transforms import Transform
|
||||
|
||||
fro = int(np.frombuffer(fid.read(4), dtype=">i4").item())
|
||||
to = int(np.frombuffer(fid.read(4), dtype=">i4").item())
|
||||
rot = np.frombuffer(fid.read(36), dtype=">f4").reshape(3, 3)
|
||||
move = np.frombuffer(fid.read(12), dtype=">f4")
|
||||
trans = np.r_[np.c_[rot, move], np.array([[0], [0], [0], [1]]).T]
|
||||
data = Transform(fro, to, trans)
|
||||
fid.seek(48, 1) # Skip over the inverse transformation
|
||||
return data
|
||||
|
||||
|
||||
_ch_coord_dict = {
|
||||
FIFF.FIFFV_MEG_CH: FIFF.FIFFV_COORD_DEVICE,
|
||||
FIFF.FIFFV_REF_MEG_CH: FIFF.FIFFV_COORD_DEVICE,
|
||||
FIFF.FIFFV_EEG_CH: FIFF.FIFFV_COORD_HEAD,
|
||||
FIFF.FIFFV_ECOG_CH: FIFF.FIFFV_COORD_HEAD,
|
||||
FIFF.FIFFV_SEEG_CH: FIFF.FIFFV_COORD_HEAD,
|
||||
FIFF.FIFFV_DBS_CH: FIFF.FIFFV_COORD_HEAD,
|
||||
FIFF.FIFFV_FNIRS_CH: FIFF.FIFFV_COORD_HEAD,
|
||||
}
|
||||
|
||||
|
||||
def _read_ch_info_struct(fid, tag, shape, rlims):
|
||||
"""Read channel info struct tag."""
|
||||
d = dict(
|
||||
scanno=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
logno=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
kind=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
range=float(np.frombuffer(fid.read(4), dtype=">f4").item()),
|
||||
cal=float(np.frombuffer(fid.read(4), dtype=">f4").item()),
|
||||
coil_type=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
# deal with really old OSX Anaconda bug by casting to float64
|
||||
loc=np.frombuffer(fid.read(48), dtype=">f4").astype(np.float64),
|
||||
# unit and exponent
|
||||
unit=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
unit_mul=int(np.frombuffer(fid.read(4), dtype=">i4").item()),
|
||||
)
|
||||
# channel name
|
||||
ch_name = np.frombuffer(fid.read(16), dtype=">c")
|
||||
ch_name = ch_name[: np.argmax(ch_name == b"")].tobytes()
|
||||
d["ch_name"] = ch_name.decode()
|
||||
# coil coordinate system definition
|
||||
_update_ch_info_named(d)
|
||||
return d
|
||||
|
||||
|
||||
def _update_ch_info_named(d):
|
||||
d["coord_frame"] = _ch_coord_dict.get(d["kind"], FIFF.FIFFV_COORD_UNKNOWN)
|
||||
d["kind"] = _ch_kind_named.get(d["kind"], d["kind"])
|
||||
d["coil_type"] = _ch_coil_type_named.get(d["coil_type"], d["coil_type"])
|
||||
d["unit"] = _ch_unit_named.get(d["unit"], d["unit"])
|
||||
d["unit_mul"] = _ch_unit_mul_named.get(d["unit_mul"], d["unit_mul"])
|
||||
|
||||
|
||||
def _read_old_pack(fid, tag, shape, rlims):
|
||||
"""Read old pack tag."""
|
||||
offset = float(np.frombuffer(fid.read(4), dtype=">f4").item())
|
||||
scale = float(np.frombuffer(fid.read(4), dtype=">f4").item())
|
||||
data = np.frombuffer(fid.read(tag.size - 8), dtype=">i2")
|
||||
data = data * scale # to float64
|
||||
data += offset
|
||||
return data
|
||||
|
||||
|
||||
def _read_dir_entry_struct(fid, tag, shape, rlims):
|
||||
"""Read dir entry struct tag."""
|
||||
pos = tag.pos + 16
|
||||
entries = list()
|
||||
for offset in range(1, tag.size // 16):
|
||||
ent = _read_tag_header(fid, pos + offset * 16)
|
||||
# The position of the real tag on disk is stored in the "next" entry within the
|
||||
# directory, so we need to overwrite ent.pos. For safety let's also overwrite
|
||||
# ent.next to point nowhere
|
||||
ent.pos, ent.next = ent.next, FIFF.FIFFV_NEXT_NONE
|
||||
entries.append(ent)
|
||||
return entries
|
||||
|
||||
|
||||
def _read_julian(fid, tag, shape, rlims):
|
||||
"""Read julian tag."""
|
||||
return _julian_to_date(int(np.frombuffer(fid.read(4), dtype=">i4").item()))
|
||||
|
||||
|
||||
# Read types call dict
|
||||
_call_dict = {
|
||||
FIFF.FIFFT_STRING: _read_string,
|
||||
FIFF.FIFFT_COMPLEX_FLOAT: _read_complex_float,
|
||||
FIFF.FIFFT_COMPLEX_DOUBLE: _read_complex_double,
|
||||
FIFF.FIFFT_ID_STRUCT: _read_id_struct,
|
||||
FIFF.FIFFT_DIG_POINT_STRUCT: _read_dig_point_struct,
|
||||
FIFF.FIFFT_COORD_TRANS_STRUCT: _read_coord_trans_struct,
|
||||
FIFF.FIFFT_CH_INFO_STRUCT: _read_ch_info_struct,
|
||||
FIFF.FIFFT_OLD_PACK: _read_old_pack,
|
||||
FIFF.FIFFT_DIR_ENTRY_STRUCT: _read_dir_entry_struct,
|
||||
FIFF.FIFFT_JULIAN: _read_julian,
|
||||
}
|
||||
_call_dict_names = {
|
||||
FIFF.FIFFT_STRING: "str",
|
||||
FIFF.FIFFT_COMPLEX_FLOAT: "c8",
|
||||
FIFF.FIFFT_COMPLEX_DOUBLE: "c16",
|
||||
FIFF.FIFFT_ID_STRUCT: "ids",
|
||||
FIFF.FIFFT_DIG_POINT_STRUCT: "dps",
|
||||
FIFF.FIFFT_COORD_TRANS_STRUCT: "cts",
|
||||
FIFF.FIFFT_CH_INFO_STRUCT: "cis",
|
||||
FIFF.FIFFT_OLD_PACK: "op_",
|
||||
FIFF.FIFFT_DIR_ENTRY_STRUCT: "dir",
|
||||
FIFF.FIFFT_JULIAN: "jul",
|
||||
FIFF.FIFFT_VOID: "nul", # 0
|
||||
}
|
||||
|
||||
# Append the simple types
|
||||
_simple_dict = {
|
||||
FIFF.FIFFT_BYTE: ">B",
|
||||
FIFF.FIFFT_SHORT: ">i2",
|
||||
FIFF.FIFFT_INT: ">i4",
|
||||
FIFF.FIFFT_USHORT: ">u2",
|
||||
FIFF.FIFFT_UINT: ">u4",
|
||||
FIFF.FIFFT_FLOAT: ">f4",
|
||||
FIFF.FIFFT_DOUBLE: ">f8",
|
||||
FIFF.FIFFT_DAU_PACK16: ">i2",
|
||||
}
|
||||
for key, dtype in _simple_dict.items():
|
||||
_call_dict[key] = partial(_read_simple, dtype=dtype)
|
||||
_call_dict_names[key] = dtype
|
||||
|
||||
|
||||
def read_tag(fid, pos, shape=None, rlims=None):
|
||||
"""Read a Tag from a file at a given position.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file
|
||||
The open FIF file descriptor.
|
||||
pos : int
|
||||
The position of the Tag in the file.
|
||||
shape : tuple | None
|
||||
If tuple, the shape of the stored matrix. Only to be used with
|
||||
data stored as a vector (not implemented for matrices yet).
|
||||
rlims : tuple | None
|
||||
If tuple, the first (inclusive) and last (exclusive) rows to retrieve.
|
||||
Note that data are assumed to be stored row-major in the file. Only to
|
||||
be used with data stored as a vector (not implemented for matrices
|
||||
yet).
|
||||
|
||||
Returns
|
||||
-------
|
||||
tag : Tag
|
||||
The Tag read.
|
||||
"""
|
||||
tag = _read_tag_header(fid, pos)
|
||||
if tag is None:
|
||||
return tag
|
||||
if tag.size > 0:
|
||||
if _matrix_info(tag) is not None:
|
||||
tag.data = _read_matrix(fid, tag, shape, rlims)
|
||||
else:
|
||||
# All other data types
|
||||
try:
|
||||
fun = _call_dict[tag.type]
|
||||
except KeyError:
|
||||
raise Exception(f"Unimplemented tag data type {tag.type}") from None
|
||||
tag.data = fun(fid, tag, shape, rlims)
|
||||
return tag
|
||||
|
||||
|
||||
def find_tag(fid, node, findkind):
|
||||
"""Find Tag in an open FIF file descriptor.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fid : file-like
|
||||
Open file.
|
||||
node : dict
|
||||
Node to search.
|
||||
findkind : int
|
||||
Tag kind to find.
|
||||
|
||||
Returns
|
||||
-------
|
||||
tag : instance of Tag
|
||||
The first tag found.
|
||||
"""
|
||||
if node["directory"] is not None:
|
||||
for subnode in node["directory"]:
|
||||
if subnode.kind == findkind:
|
||||
return read_tag(fid, subnode.pos)
|
||||
return None
|
||||
|
||||
|
||||
def has_tag(node, kind):
|
||||
"""Check if the node contains a Tag of a given kind."""
|
||||
for d in node["directory"]:
|
||||
if d.kind == kind:
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _rename_list(bads, ch_names_mapping):
|
||||
return [ch_names_mapping.get(bad, bad) for bad in bads]
|
||||
|
||||
|
||||
def _int_item(x):
|
||||
return int(x.item())
|
||||
|
||||
|
||||
def _float_item(x):
|
||||
return float(x.item())
|
||||
|
||||
|
||||
def _matrix_info(tag):
|
||||
matrix_coding = tag.type & 0xFFFF0000
|
||||
if matrix_coding == 0 or tag.size == 0:
|
||||
return None
|
||||
matrix_type = tag.type & 0x0000FFFF
|
||||
matrix_coding_dict = {
|
||||
FIFF.FIFFT_MATRIX: "dense",
|
||||
FIFF.FIFFT_MATRIX | FIFF.FIFFT_SPARSE_CCS_MATRIX: "sparse CCS",
|
||||
FIFF.FIFFT_MATRIX | FIFF.FIFFT_SPARSE_RCS_MATRIX: "sparse RCS",
|
||||
}
|
||||
_check_option("matrix_coding", matrix_coding, list(matrix_coding_dict))
|
||||
matrix_coding = matrix_coding_dict[matrix_coding]
|
||||
matrix_bit_dtype = {
|
||||
FIFF.FIFFT_INT: (4, ">i4"),
|
||||
FIFF.FIFFT_JULIAN: (4, ">i4"),
|
||||
FIFF.FIFFT_FLOAT: (4, ">f4"),
|
||||
FIFF.FIFFT_DOUBLE: (8, ">f8"),
|
||||
FIFF.FIFFT_COMPLEX_FLOAT: (8, ">f4"),
|
||||
FIFF.FIFFT_COMPLEX_DOUBLE: (16, ">f8"),
|
||||
}
|
||||
_check_option("matrix_type", matrix_type, list(matrix_bit_dtype))
|
||||
bit, dtype = matrix_bit_dtype[matrix_type]
|
||||
return matrix_coding, matrix_type, bit, dtype
|
||||
108
mne/_fiff/tree.py
Normal file
@@ -0,0 +1,108 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
|
||||
from ..utils import logger, verbose
|
||||
from .constants import FIFF
|
||||
from .tag import read_tag
|
||||
|
||||
|
||||
def dir_tree_find(tree, kind):
|
||||
"""Find nodes of the given kind from a directory tree structure.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
tree : dict
|
||||
Directory tree.
|
||||
kind : int
|
||||
Kind to find.
|
||||
|
||||
Returns
|
||||
-------
|
||||
nodes : list
|
||||
List of matching nodes.
|
||||
"""
|
||||
nodes = []
|
||||
|
||||
if isinstance(tree, list):
|
||||
for t in tree:
|
||||
nodes += dir_tree_find(t, kind)
|
||||
else:
|
||||
# Am I desirable myself?
|
||||
if tree["block"] == kind:
|
||||
nodes.append(tree)
|
||||
|
||||
# Search the subtrees
|
||||
for child in tree["children"]:
|
||||
nodes += dir_tree_find(child, kind)
|
||||
return nodes
|
||||
|
||||
|
||||
@verbose
|
||||
def make_dir_tree(fid, directory, start=0, indent=0, verbose=None):
|
||||
"""Create the directory tree structure."""
|
||||
if directory[start].kind == FIFF.FIFF_BLOCK_START:
|
||||
tag = read_tag(fid, directory[start].pos)
|
||||
block = tag.data.item()
|
||||
else:
|
||||
block = 0
|
||||
|
||||
start_separate = False
|
||||
|
||||
this = start
|
||||
|
||||
tree = dict()
|
||||
tree["block"] = block
|
||||
tree["id"] = None
|
||||
tree["parent_id"] = None
|
||||
tree["nent"] = 0
|
||||
tree["nchild"] = 0
|
||||
tree["directory"] = directory[this]
|
||||
tree["children"] = []
|
||||
|
||||
while this < len(directory):
|
||||
if directory[this].kind == FIFF.FIFF_BLOCK_START:
|
||||
if this != start:
|
||||
if not start_separate:
|
||||
start_separate = True
|
||||
logger.debug(" " * indent + f"start {{ {block}")
|
||||
child, this = make_dir_tree(fid, directory, this, indent + 1)
|
||||
tree["nchild"] += 1
|
||||
tree["children"].append(child)
|
||||
elif directory[this].kind == FIFF.FIFF_BLOCK_END:
|
||||
tag = read_tag(fid, directory[start].pos)
|
||||
if tag.data == block:
|
||||
break
|
||||
else:
|
||||
tree["nent"] += 1
|
||||
if tree["nent"] == 1:
|
||||
tree["directory"] = list()
|
||||
tree["directory"].append(directory[this])
|
||||
|
||||
# Add the id information if available
|
||||
if block == 0:
|
||||
if directory[this].kind == FIFF.FIFF_FILE_ID:
|
||||
tag = read_tag(fid, directory[this].pos)
|
||||
tree["id"] = tag.data
|
||||
else:
|
||||
if directory[this].kind == FIFF.FIFF_BLOCK_ID:
|
||||
tag = read_tag(fid, directory[this].pos)
|
||||
tree["id"] = tag.data
|
||||
elif directory[this].kind == FIFF.FIFF_PARENT_BLOCK_ID:
|
||||
tag = read_tag(fid, directory[this].pos)
|
||||
tree["parent_id"] = tag.data
|
||||
|
||||
this += 1
|
||||
|
||||
# Eliminate the empty directory
|
||||
if tree["nent"] == 0:
|
||||
tree["directory"] = None
|
||||
|
||||
content = f"block = {tree['block']} nent = {tree['nent']} nchild = {tree['nchild']}"
|
||||
if start_separate:
|
||||
logger.debug(" " * indent + f"end }} {content}")
|
||||
else:
|
||||
logger.debug(" " * indent + content)
|
||||
last = this
|
||||
return tree, last
|
||||
331
mne/_fiff/utils.py
Normal file
@@ -0,0 +1,331 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import os
|
||||
import os.path as op
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .constants import FIFF
|
||||
from .meas_info import _get_valid_units
|
||||
|
||||
|
||||
def _check_orig_units(orig_units):
|
||||
"""Check original units from a raw file.
|
||||
|
||||
Units that are close to a valid_unit but not equal can be remapped to fit
|
||||
into the valid_units. All other units that are not valid will be replaced
|
||||
with "n/a".
|
||||
|
||||
Parameters
|
||||
----------
|
||||
orig_units : dict
|
||||
Dictionary mapping channel names to their units as specified in
|
||||
the header file. Example: {'FC1': 'nV'}
|
||||
|
||||
Returns
|
||||
-------
|
||||
orig_units_remapped : dict
|
||||
Dictionary mapping channel names to their VALID units as specified in
|
||||
the header file. Invalid units are now labeled "n/a".
|
||||
Example: {'FC1': 'nV', 'Hfp3erz': 'n/a'}
|
||||
"""
|
||||
if orig_units is None:
|
||||
return
|
||||
valid_units = _get_valid_units()
|
||||
valid_units_lowered = [unit.lower() for unit in valid_units]
|
||||
orig_units_remapped = dict(orig_units)
|
||||
for ch_name, unit in orig_units.items():
|
||||
# Be lenient: we ignore case for now.
|
||||
if unit.lower() in valid_units_lowered:
|
||||
continue
|
||||
|
||||
# Common "invalid units" can be remapped to their valid equivalent
|
||||
remap_dict = dict()
|
||||
remap_dict["uv"] = "µV"
|
||||
remap_dict["μv"] = "µV" # greek letter mu vs micro sign. use micro
|
||||
remap_dict["\x83\xeav"] = "µV" # for shift-jis mu, use micro
|
||||
if unit.lower() in remap_dict:
|
||||
orig_units_remapped[ch_name] = remap_dict[unit.lower()]
|
||||
continue
|
||||
|
||||
# Some units cannot be saved, they are invalid: assign "n/a"
|
||||
orig_units_remapped[ch_name] = "n/a"
|
||||
|
||||
return orig_units_remapped
|
||||
|
||||
|
||||
def _find_channels(ch_names, ch_type="EOG"):
|
||||
"""Find EOG channel."""
|
||||
substrings = (ch_type,)
|
||||
substrings = [s.upper() for s in substrings]
|
||||
if ch_type == "EOG":
|
||||
substrings = ("EOG", "EYE")
|
||||
eog_idx = [
|
||||
idx
|
||||
for idx, ch in enumerate(ch_names)
|
||||
if any(substring in ch.upper() for substring in substrings)
|
||||
]
|
||||
return eog_idx
|
||||
|
||||
|
||||
def _mult_cal_one(data_view, one, idx, cals, mult):
|
||||
"""Take a chunk of raw data, multiply by mult or cals, and store."""
|
||||
one = np.asarray(one, dtype=data_view.dtype)
|
||||
assert data_view.shape[1] == one.shape[1], (
|
||||
data_view.shape[1],
|
||||
one.shape[1],
|
||||
) # noqa: E501
|
||||
if mult is not None:
|
||||
assert mult.ndim == one.ndim == 2
|
||||
data_view[:] = mult @ one[idx]
|
||||
else:
|
||||
assert cals is not None
|
||||
if isinstance(idx, slice):
|
||||
data_view[:] = one[idx]
|
||||
else:
|
||||
# faster than doing one = one[idx]
|
||||
np.take(one, idx, axis=0, out=data_view)
|
||||
data_view *= cals
|
||||
|
||||
|
||||
def _blk_read_lims(start, stop, buf_len):
|
||||
"""Deal with indexing in the middle of a data block.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
start : int
|
||||
Starting index.
|
||||
stop : int
|
||||
Ending index (exclusive).
|
||||
buf_len : int
|
||||
Buffer size in samples.
|
||||
|
||||
Returns
|
||||
-------
|
||||
block_start_idx : int
|
||||
The first block to start reading from.
|
||||
r_lims : list
|
||||
The read limits.
|
||||
d_lims : list
|
||||
The write limits.
|
||||
|
||||
Notes
|
||||
-----
|
||||
Consider this example::
|
||||
|
||||
>>> start, stop, buf_len = 2, 27, 10
|
||||
|
||||
+---------+---------+---------
|
||||
File structure: | buf0 | buf1 | buf2 |
|
||||
+---------+---------+---------
|
||||
File time: 0 10 20 30
|
||||
+---------+---------+---------
|
||||
Requested time: 2 27
|
||||
|
||||
| |
|
||||
blockstart blockstop
|
||||
| |
|
||||
start stop
|
||||
|
||||
We need 27 - 2 = 25 samples (per channel) to store our data, and
|
||||
we need to read from 3 buffers (30 samples) to get all of our data.
|
||||
|
||||
On all reads but the first, the data we read starts at
|
||||
the first sample of the buffer. On all reads but the last,
|
||||
the data we read ends on the last sample of the buffer.
|
||||
|
||||
We call ``this_data`` the variable that stores the current buffer's data,
|
||||
and ``data`` the variable that stores the total output.
|
||||
|
||||
On the first read, we need to do this::
|
||||
|
||||
>>> data[0:buf_len-2] = this_data[2:buf_len] # doctest: +SKIP
|
||||
|
||||
On the second read, we need to do::
|
||||
|
||||
>>> data[1*buf_len-2:2*buf_len-2] = this_data[0:buf_len] # doctest: +SKIP
|
||||
|
||||
On the final read, we need to do::
|
||||
|
||||
>>> data[2*buf_len-2:3*buf_len-2-3] = this_data[0:buf_len-3] # doctest: +SKIP
|
||||
|
||||
This function encapsulates this logic to allow a loop over blocks, where
|
||||
data is stored using the following limits::
|
||||
|
||||
>>> data[d_lims[ii, 0]:d_lims[ii, 1]] = this_data[r_lims[ii, 0]:r_lims[ii, 1]] # doctest: +SKIP
|
||||
|
||||
""" # noqa: E501
|
||||
# this is used to deal with indexing in the middle of a sampling period
|
||||
assert all(isinstance(x, int) for x in (start, stop, buf_len))
|
||||
block_start_idx = start // buf_len
|
||||
block_start = block_start_idx * buf_len
|
||||
last_used_samp = stop - 1
|
||||
block_stop = last_used_samp - last_used_samp % buf_len + buf_len
|
||||
read_size = block_stop - block_start
|
||||
n_blk = read_size // buf_len + (read_size % buf_len != 0)
|
||||
start_offset = start - block_start
|
||||
end_offset = block_stop - stop
|
||||
d_lims = np.empty((n_blk, 2), int)
|
||||
r_lims = np.empty((n_blk, 2), int)
|
||||
for bi in range(n_blk):
|
||||
# Triage start (sidx) and end (eidx) indices for
|
||||
# data (d) and read (r)
|
||||
if bi == 0:
|
||||
d_sidx = 0
|
||||
r_sidx = start_offset
|
||||
else:
|
||||
d_sidx = bi * buf_len - start_offset
|
||||
r_sidx = 0
|
||||
if bi == n_blk - 1:
|
||||
d_eidx = stop - start
|
||||
r_eidx = buf_len - end_offset
|
||||
else:
|
||||
d_eidx = (bi + 1) * buf_len - start_offset
|
||||
r_eidx = buf_len
|
||||
d_lims[bi] = [d_sidx, d_eidx]
|
||||
r_lims[bi] = [r_sidx, r_eidx]
|
||||
return block_start_idx, r_lims, d_lims
|
||||
|
||||
|
||||
def _file_size(fname):
|
||||
"""Get the file size in bytes."""
|
||||
with open(fname, "rb") as f:
|
||||
f.seek(0, os.SEEK_END)
|
||||
return f.tell()
|
||||
|
||||
|
||||
def _read_segments_file(
|
||||
raw,
|
||||
data,
|
||||
idx,
|
||||
fi,
|
||||
start,
|
||||
stop,
|
||||
cals,
|
||||
mult,
|
||||
dtype,
|
||||
n_channels=None,
|
||||
offset=0,
|
||||
trigger_ch=None,
|
||||
):
|
||||
"""Read a chunk of raw data."""
|
||||
if n_channels is None:
|
||||
n_channels = raw._raw_extras[fi]["orig_nchan"]
|
||||
|
||||
n_bytes = np.dtype(dtype).itemsize
|
||||
# data_offset and data_left count data samples (channels x time points),
|
||||
# not bytes.
|
||||
data_offset = n_channels * start * n_bytes + offset
|
||||
data_left = (stop - start) * n_channels
|
||||
|
||||
# Read up to 100 MB of data at a time, block_size is in data samples
|
||||
block_size = ((int(100e6) // n_bytes) // n_channels) * n_channels
|
||||
block_size = min(data_left, block_size)
|
||||
with open(raw.filenames[fi], "rb", buffering=0) as fid:
|
||||
fid.seek(data_offset)
|
||||
# extract data in chunks
|
||||
for sample_start in np.arange(0, data_left, block_size) // n_channels:
|
||||
count = min(block_size, data_left - sample_start * n_channels)
|
||||
block = np.fromfile(fid, dtype, count)
|
||||
if block.size != count:
|
||||
raise RuntimeError(
|
||||
f"Incorrect number of samples ({block.size} != {count}), please "
|
||||
"report this error to MNE-Python developers"
|
||||
)
|
||||
block = block.reshape(n_channels, -1, order="F")
|
||||
n_samples = block.shape[1] # = count // n_channels
|
||||
sample_stop = sample_start + n_samples
|
||||
if trigger_ch is not None:
|
||||
stim_ch = trigger_ch[start:stop][sample_start:sample_stop]
|
||||
block = np.vstack((block, stim_ch))
|
||||
data_view = data[:, sample_start:sample_stop]
|
||||
_mult_cal_one(data_view, block, idx, cals, mult)
|
||||
|
||||
|
||||
def read_str(fid, count=1):
|
||||
"""Read string from a binary file in a python version compatible way."""
|
||||
dtype = np.dtype(f">S{count}")
|
||||
string = fid.read(dtype.itemsize)
|
||||
data = np.frombuffer(string, dtype=dtype)[0]
|
||||
bytestr = b"".join([data[0 : data.index(b"\x00") if b"\x00" in data else count]])
|
||||
|
||||
return str(bytestr.decode("ascii")) # Return native str type for Py2/3
|
||||
|
||||
|
||||
def _create_chs(ch_names, cals, ch_coil, ch_kind, eog, ecg, emg, misc):
|
||||
"""Initialize info['chs'] for eeg channels."""
|
||||
chs = list()
|
||||
for idx, ch_name in enumerate(ch_names):
|
||||
if ch_name in eog or idx in eog:
|
||||
coil_type = FIFF.FIFFV_COIL_NONE
|
||||
kind = FIFF.FIFFV_EOG_CH
|
||||
elif ch_name in ecg or idx in ecg:
|
||||
coil_type = FIFF.FIFFV_COIL_NONE
|
||||
kind = FIFF.FIFFV_ECG_CH
|
||||
elif ch_name in emg or idx in emg:
|
||||
coil_type = FIFF.FIFFV_COIL_NONE
|
||||
kind = FIFF.FIFFV_EMG_CH
|
||||
elif ch_name in misc or idx in misc:
|
||||
coil_type = FIFF.FIFFV_COIL_NONE
|
||||
kind = FIFF.FIFFV_MISC_CH
|
||||
else:
|
||||
coil_type = ch_coil
|
||||
kind = ch_kind
|
||||
|
||||
chan_info = {
|
||||
"cal": cals[idx],
|
||||
"logno": idx + 1,
|
||||
"scanno": idx + 1,
|
||||
"range": 1.0,
|
||||
"unit_mul": FIFF.FIFF_UNITM_NONE,
|
||||
"ch_name": ch_name,
|
||||
"unit": FIFF.FIFF_UNIT_V,
|
||||
"coord_frame": FIFF.FIFFV_COORD_HEAD,
|
||||
"coil_type": coil_type,
|
||||
"kind": kind,
|
||||
"loc": np.zeros(12),
|
||||
}
|
||||
if coil_type == FIFF.FIFFV_COIL_EEG:
|
||||
chan_info["loc"][:3] = np.nan
|
||||
chs.append(chan_info)
|
||||
return chs
|
||||
|
||||
|
||||
def _construct_bids_filename(base, ext, part_idx, validate=True):
|
||||
"""Construct a BIDS compatible filename for split files."""
|
||||
# insert index in filename
|
||||
dirname = op.dirname(base)
|
||||
base = op.basename(base)
|
||||
deconstructed_base = base.split("_")
|
||||
if len(deconstructed_base) < 2 and validate:
|
||||
raise ValueError(
|
||||
"Filename base must end with an underscore followed "
|
||||
f"by the modality (e.g., _eeg or _meg), got {base}"
|
||||
)
|
||||
suffix = deconstructed_base[-1]
|
||||
base = "_".join(deconstructed_base[:-1])
|
||||
use_fname = f"{base}_split-{part_idx + 1:02}_{suffix}{ext}"
|
||||
if dirname:
|
||||
use_fname = op.join(dirname, use_fname)
|
||||
return use_fname
|
||||
|
||||
|
||||
def _make_split_fnames(fname, n_splits, split_naming):
|
||||
"""Make a list of split filenames."""
|
||||
if n_splits == 1:
|
||||
fname = Path(fname)
|
||||
return [fname]
|
||||
res = []
|
||||
base, ext = op.splitext(fname)
|
||||
for i in range(n_splits):
|
||||
if split_naming == "neuromag":
|
||||
path = Path(f"{base}-{i:d}{ext}" if i else fname)
|
||||
res.append(path)
|
||||
else:
|
||||
assert split_naming == "bids"
|
||||
path = Path(_construct_bids_filename(base, ext, i))
|
||||
res.append(path)
|
||||
return res
|
||||
70
mne/_fiff/what.py
Normal file
@@ -0,0 +1,70 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
from collections import OrderedDict
|
||||
from inspect import signature
|
||||
|
||||
from ..utils import _check_fname, logger
|
||||
|
||||
|
||||
def what(fname):
|
||||
"""Try to determine the type of the FIF file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like
|
||||
The filename. Should end in ``.fif`` or ``.fif.gz``.
|
||||
|
||||
Returns
|
||||
-------
|
||||
what : str | None
|
||||
The type of the file. Will be 'unknown' if it could not be determined.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 0.19
|
||||
"""
|
||||
from ..bem import read_bem_solution, read_bem_surfaces
|
||||
from ..cov import read_cov
|
||||
from ..epochs import read_epochs
|
||||
from ..event import read_events
|
||||
from ..evoked import read_evokeds
|
||||
from ..forward import read_forward_solution
|
||||
from ..io import read_raw_fif
|
||||
from ..minimum_norm import read_inverse_operator
|
||||
from ..preprocessing import read_ica
|
||||
from ..proj import read_proj
|
||||
from ..source_space import read_source_spaces
|
||||
from ..transforms import read_trans
|
||||
from .meas_info import read_fiducials
|
||||
|
||||
fname = _check_fname(fname, overwrite="read", must_exist=True)
|
||||
checks = OrderedDict()
|
||||
checks["raw"] = read_raw_fif
|
||||
checks["ica"] = read_ica
|
||||
checks["epochs"] = read_epochs
|
||||
checks["evoked"] = read_evokeds
|
||||
checks["forward"] = read_forward_solution
|
||||
checks["inverse"] = read_inverse_operator
|
||||
checks["src"] = read_source_spaces
|
||||
checks["bem solution"] = read_bem_solution
|
||||
checks["bem surfaces"] = read_bem_surfaces
|
||||
checks["cov"] = read_cov
|
||||
checks["transform"] = read_trans
|
||||
checks["events"] = read_events
|
||||
checks["fiducials"] = read_fiducials
|
||||
checks["proj"] = read_proj
|
||||
for what, func in checks.items():
|
||||
args = signature(func).parameters
|
||||
assert "verbose" in args, func
|
||||
kwargs = dict(verbose="error")
|
||||
if "preload" in args:
|
||||
kwargs["preload"] = False
|
||||
try:
|
||||
func(fname, **kwargs)
|
||||
except Exception as exp:
|
||||
logger.debug(f"Not {what}: {exp}")
|
||||
else:
|
||||
return what
|
||||
return "unknown"
|
||||
454
mne/_fiff/write.py
Normal file
@@ -0,0 +1,454 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import datetime
|
||||
import os.path as op
|
||||
import re
|
||||
import time
|
||||
import uuid
|
||||
from contextlib import contextmanager
|
||||
from gzip import GzipFile
|
||||
|
||||
import numpy as np
|
||||
from scipy.sparse import csc_array, csr_array
|
||||
|
||||
from ..utils import _file_like, _validate_type, logger
|
||||
from ..utils.numerics import _date_to_julian
|
||||
from .constants import FIFF
|
||||
|
||||
# We choose a "magic" date to store (because meas_date is obligatory)
|
||||
# to treat as meas_date=None. This one should be impossible for systems
|
||||
# to write -- the second field is microseconds, so anything >= 1e6
|
||||
# should be moved into the first field (seconds).
|
||||
DATE_NONE = (0, 2**31 - 1)
|
||||
|
||||
|
||||
def _write(fid, data, kind, data_size, FIFFT_TYPE, dtype):
|
||||
"""Write data."""
|
||||
if isinstance(data, np.ndarray):
|
||||
data_size *= data.size
|
||||
|
||||
# XXX for string types the data size is used as
|
||||
# computed in ``write_string``.
|
||||
|
||||
fid.write(np.array(kind, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFFT_TYPE, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data, dtype=dtype).tobytes())
|
||||
|
||||
|
||||
def _get_split_size(split_size):
|
||||
"""Convert human-readable bytes to machine-readable bytes."""
|
||||
if isinstance(split_size, str):
|
||||
exp = dict(MB=20, GB=30).get(split_size[-2:], None)
|
||||
if exp is None:
|
||||
raise ValueError('split_size has to end with either "MB" or "GB"')
|
||||
split_size = int(float(split_size[:-2]) * 2**exp)
|
||||
|
||||
if split_size > 2147483648:
|
||||
raise ValueError("split_size cannot be larger than 2GB")
|
||||
return split_size
|
||||
|
||||
|
||||
_NEXT_FILE_BUFFER = 1048576 # 2 ** 20 extra cushion for last post-data tags
|
||||
|
||||
|
||||
def write_nop(fid, last=False):
|
||||
"""Write a FIFF_NOP."""
|
||||
fid.write(np.array(FIFF.FIFF_NOP, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFT_VOID, dtype=">i4").tobytes())
|
||||
fid.write(np.array(0, dtype=">i4").tobytes())
|
||||
next_ = FIFF.FIFFV_NEXT_NONE if last else FIFF.FIFFV_NEXT_SEQ
|
||||
fid.write(np.array(next_, dtype=">i4").tobytes())
|
||||
|
||||
|
||||
INT32_MAX = 2147483647
|
||||
|
||||
|
||||
def write_int(fid, kind, data):
|
||||
"""Write a 32-bit integer tag to a fif file."""
|
||||
data_size = 4
|
||||
data = np.asarray(data)
|
||||
if data.dtype.kind not in "uib" and data.size > 0:
|
||||
raise TypeError(
|
||||
f"Cannot safely write data kind {kind} with dtype {data.dtype} as int",
|
||||
)
|
||||
max_val = data.max() if data.size > 0 else 0
|
||||
if max_val > INT32_MAX:
|
||||
raise TypeError(
|
||||
f"Value {max_val} exceeds maximum allowed ({INT32_MAX}) for tag {kind}"
|
||||
)
|
||||
data = data.astype(">i4").T
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_INT, ">i4")
|
||||
|
||||
|
||||
def write_double(fid, kind, data):
|
||||
"""Write a double-precision floating point tag to a fif file."""
|
||||
data_size = 8
|
||||
data = np.array(data, dtype=">f8").T
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_DOUBLE, ">f8")
|
||||
|
||||
|
||||
def write_float(fid, kind, data):
|
||||
"""Write a single-precision floating point tag to a fif file."""
|
||||
data_size = 4
|
||||
data = np.array(data, dtype=">f4").T
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_FLOAT, ">f4")
|
||||
|
||||
|
||||
def write_dau_pack16(fid, kind, data):
|
||||
"""Write a dau_pack16 tag to a fif file."""
|
||||
data_size = 2
|
||||
data = np.array(data, dtype=">i2").T
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_DAU_PACK16, ">i2")
|
||||
|
||||
|
||||
def write_complex64(fid, kind, data):
|
||||
"""Write a 64 bit complex floating point tag to a fif file."""
|
||||
data_size = 8
|
||||
data = np.array(data, dtype=">c8").T
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_COMPLEX_FLOAT, ">c8")
|
||||
|
||||
|
||||
def write_complex128(fid, kind, data):
|
||||
"""Write a 128 bit complex floating point tag to a fif file."""
|
||||
data_size = 16
|
||||
data = np.array(data, dtype=">c16").T
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_COMPLEX_FLOAT, ">c16")
|
||||
|
||||
|
||||
def write_julian(fid, kind, data):
|
||||
"""Write a Julian-formatted date to a FIF file."""
|
||||
assert isinstance(data, datetime.date), type(data)
|
||||
data_size = 4
|
||||
jd = _date_to_julian(data)
|
||||
data = np.array(jd, dtype=">i4")
|
||||
_write(fid, data, kind, data_size, FIFF.FIFFT_JULIAN, ">i4")
|
||||
|
||||
|
||||
def write_string(fid, kind, data):
|
||||
"""Write a string tag."""
|
||||
try:
|
||||
str_data = str(data).encode("latin1")
|
||||
except UnicodeEncodeError:
|
||||
str_data = str(data).encode("latin1", errors="xmlcharrefreplace")
|
||||
data_size = len(str_data) # therefore compute size here
|
||||
if data_size > 0:
|
||||
_write(fid, str_data, kind, data_size, FIFF.FIFFT_STRING, ">S")
|
||||
|
||||
|
||||
def write_name_list(fid, kind, data):
|
||||
"""Write a colon-separated list of names.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
data : list of strings
|
||||
"""
|
||||
write_string(fid, kind, ":".join(data))
|
||||
|
||||
|
||||
def write_name_list_sanitized(fid, kind, lst, name):
|
||||
"""Write a sanitized, colon-separated list of names."""
|
||||
write_string(fid, kind, _safe_name_list(lst, "write", name))
|
||||
|
||||
|
||||
def _safe_name_list(lst, operation, name):
|
||||
if operation == "write":
|
||||
assert isinstance(lst, list | tuple | np.ndarray), type(lst)
|
||||
if any("{COLON}" in val for val in lst):
|
||||
raise ValueError(f'The substring "{{COLON}}" in {name} not supported.')
|
||||
return ":".join(val.replace(":", "{COLON}") for val in lst)
|
||||
else:
|
||||
# take a sanitized string and return a list of strings
|
||||
assert operation == "read"
|
||||
assert lst is None or isinstance(lst, str)
|
||||
if not lst: # None or empty string
|
||||
return []
|
||||
return [val.replace("{COLON}", ":") for val in lst.split(":")]
|
||||
|
||||
|
||||
def write_float_matrix(fid, kind, mat):
|
||||
"""Write a single-precision floating-point matrix tag."""
|
||||
_write_matrix_data(fid, kind, mat, FIFF.FIFFT_FLOAT)
|
||||
|
||||
|
||||
def write_double_matrix(fid, kind, mat):
|
||||
"""Write a double-precision floating-point matrix tag."""
|
||||
_write_matrix_data(fid, kind, mat, FIFF.FIFFT_DOUBLE)
|
||||
|
||||
|
||||
def write_int_matrix(fid, kind, mat):
|
||||
"""Write integer 32 matrix tag."""
|
||||
_write_matrix_data(fid, kind, mat, FIFF.FIFFT_INT)
|
||||
|
||||
|
||||
def write_complex_float_matrix(fid, kind, mat):
|
||||
"""Write complex 64 matrix tag."""
|
||||
_write_matrix_data(fid, kind, mat, FIFF.FIFFT_COMPLEX_FLOAT)
|
||||
|
||||
|
||||
def write_complex_double_matrix(fid, kind, mat):
|
||||
"""Write complex 128 matrix tag."""
|
||||
_write_matrix_data(fid, kind, mat, FIFF.FIFFT_COMPLEX_DOUBLE)
|
||||
|
||||
|
||||
def _write_matrix_data(fid, kind, mat, data_type):
|
||||
dtype = {
|
||||
FIFF.FIFFT_FLOAT: ">f4",
|
||||
FIFF.FIFFT_DOUBLE: ">f8",
|
||||
FIFF.FIFFT_COMPLEX_FLOAT: ">c8",
|
||||
FIFF.FIFFT_COMPLEX_DOUBLE: ">c16",
|
||||
FIFF.FIFFT_INT: ">i4",
|
||||
}[data_type]
|
||||
dtype = np.dtype(dtype)
|
||||
data_size = dtype.itemsize * mat.size + 4 * (mat.ndim + 1)
|
||||
matrix_type = data_type | FIFF.FIFFT_MATRIX
|
||||
fid.write(np.array(kind, dtype=">i4").tobytes())
|
||||
fid.write(np.array(matrix_type, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, dtype=">i4").tobytes())
|
||||
fid.write(np.array(mat, dtype=dtype).tobytes())
|
||||
dims = np.empty(mat.ndim + 1, dtype=np.int32)
|
||||
dims[: mat.ndim] = mat.shape[::-1]
|
||||
dims[-1] = mat.ndim
|
||||
fid.write(np.array(dims, dtype=">i4").tobytes())
|
||||
check_fiff_length(fid)
|
||||
|
||||
|
||||
def get_machid():
|
||||
"""Get (mostly) unique machine ID.
|
||||
|
||||
Returns
|
||||
-------
|
||||
ids : array (length 2, int32)
|
||||
The machine identifier used in MNE.
|
||||
"""
|
||||
mac = f"{uuid.getnode():012x}".encode() # byte conversion for Py3
|
||||
mac = re.findall(b"..", mac) # split string
|
||||
mac += [b"00", b"00"] # add two more fields
|
||||
|
||||
# Convert to integer in reverse-order (for some reason)
|
||||
from codecs import encode
|
||||
|
||||
mac = b"".join([encode(h, "hex_codec") for h in mac[::-1]])
|
||||
ids = np.flipud(np.frombuffer(mac, np.int32, count=2))
|
||||
return ids
|
||||
|
||||
|
||||
def get_new_file_id():
|
||||
"""Create a new file ID tag."""
|
||||
secs, usecs = divmod(time.time(), 1.0)
|
||||
secs, usecs = int(secs), int(usecs * 1e6)
|
||||
return {
|
||||
"machid": get_machid(),
|
||||
"version": FIFF.FIFFC_VERSION,
|
||||
"secs": secs,
|
||||
"usecs": usecs,
|
||||
}
|
||||
|
||||
|
||||
def write_id(fid, kind, id_=None):
|
||||
"""Write fiff id."""
|
||||
id_ = _generate_meas_id() if id_ is None else id_
|
||||
|
||||
data_size = 5 * 4 # The id comprises five integers
|
||||
fid.write(np.array(kind, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFT_ID_STRUCT, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, dtype=">i4").tobytes())
|
||||
|
||||
# Collect the bits together for one write
|
||||
arr = np.array(
|
||||
[id_["version"], id_["machid"][0], id_["machid"][1], id_["secs"], id_["usecs"]],
|
||||
dtype=">i4",
|
||||
)
|
||||
fid.write(arr.tobytes())
|
||||
|
||||
|
||||
def start_block(fid, kind):
|
||||
"""Write a FIFF_BLOCK_START tag."""
|
||||
write_int(fid, FIFF.FIFF_BLOCK_START, kind)
|
||||
|
||||
|
||||
def end_block(fid, kind):
|
||||
"""Write a FIFF_BLOCK_END tag."""
|
||||
write_int(fid, FIFF.FIFF_BLOCK_END, kind)
|
||||
|
||||
|
||||
def start_file(fname, id_=None):
|
||||
"""Open a fif file for writing and writes the compulsory header tags.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like | fid
|
||||
The name of the file to open. It is recommended
|
||||
that the name ends with .fif or .fif.gz. Can also be an
|
||||
already opened file.
|
||||
id_ : dict | None
|
||||
ID to use for the FIFF_FILE_ID.
|
||||
"""
|
||||
if _file_like(fname):
|
||||
logger.debug(f"Writing using {type(fname)} I/O")
|
||||
fid = fname
|
||||
fid.seek(0)
|
||||
else:
|
||||
fname = str(fname)
|
||||
if op.splitext(fname)[1].lower() == ".gz":
|
||||
logger.debug("Writing using gzip")
|
||||
# defaults to compression level 9, which is barely smaller but much
|
||||
# slower. 2 offers a good compromise.
|
||||
fid = GzipFile(fname, "wb", compresslevel=2)
|
||||
else:
|
||||
logger.debug("Writing using normal I/O")
|
||||
fid = open(fname, "wb")
|
||||
# Write the compulsory items
|
||||
write_id(fid, FIFF.FIFF_FILE_ID, id_)
|
||||
write_int(fid, FIFF.FIFF_DIR_POINTER, -1)
|
||||
write_int(fid, FIFF.FIFF_FREE_LIST, -1)
|
||||
return fid
|
||||
|
||||
|
||||
@contextmanager
|
||||
def start_and_end_file(fname, id_=None):
|
||||
"""Start and (if successfully written) close the file."""
|
||||
with start_file(fname, id_=id_) as fid:
|
||||
yield fid
|
||||
end_file(fid) # we only hit this line if the yield does not err
|
||||
|
||||
|
||||
def check_fiff_length(fid, close=True):
|
||||
"""Ensure our file hasn't grown too large to work properly."""
|
||||
if fid.tell() > 2147483648: # 2 ** 31, FIFF uses signed 32-bit locations
|
||||
if close:
|
||||
fid.close()
|
||||
raise OSError(
|
||||
"FIFF file exceeded 2GB limit, please split file, reduce"
|
||||
" split_size (if possible), or save to a different "
|
||||
"format"
|
||||
)
|
||||
|
||||
|
||||
def end_file(fid):
|
||||
"""Write the closing tags to a fif file and closes the file."""
|
||||
write_nop(fid, last=True)
|
||||
check_fiff_length(fid)
|
||||
fid.close()
|
||||
|
||||
|
||||
def write_coord_trans(fid, trans):
|
||||
"""Write a coordinate transformation structure."""
|
||||
data_size = 4 * 2 * 12 + 4 * 2
|
||||
fid.write(np.array(FIFF.FIFF_COORD_TRANS, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFT_COORD_TRANS_STRUCT, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, dtype=">i4").tobytes())
|
||||
fid.write(np.array(trans["from"], dtype=">i4").tobytes())
|
||||
fid.write(np.array(trans["to"], dtype=">i4").tobytes())
|
||||
|
||||
# The transform...
|
||||
rot = trans["trans"][:3, :3]
|
||||
move = trans["trans"][:3, 3]
|
||||
fid.write(np.array(rot, dtype=">f4").tobytes())
|
||||
fid.write(np.array(move, dtype=">f4").tobytes())
|
||||
|
||||
# ...and its inverse
|
||||
trans_inv = np.linalg.inv(trans["trans"])
|
||||
rot = trans_inv[:3, :3]
|
||||
move = trans_inv[:3, 3]
|
||||
fid.write(np.array(rot, dtype=">f4").tobytes())
|
||||
fid.write(np.array(move, dtype=">f4").tobytes())
|
||||
|
||||
|
||||
def write_ch_info(fid, ch):
|
||||
"""Write a channel information record to a fif file."""
|
||||
data_size = 4 * 13 + 4 * 7 + 16
|
||||
|
||||
fid.write(np.array(FIFF.FIFF_CH_INFO, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFT_CH_INFO_STRUCT, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, dtype=">i4").tobytes())
|
||||
|
||||
# Start writing fiffChInfoRec
|
||||
fid.write(np.array(ch["scanno"], dtype=">i4").tobytes())
|
||||
fid.write(np.array(ch["logno"], dtype=">i4").tobytes())
|
||||
fid.write(np.array(ch["kind"], dtype=">i4").tobytes())
|
||||
fid.write(np.array(ch["range"], dtype=">f4").tobytes())
|
||||
fid.write(np.array(ch["cal"], dtype=">f4").tobytes())
|
||||
fid.write(np.array(ch["coil_type"], dtype=">i4").tobytes())
|
||||
fid.write(np.array(ch["loc"], dtype=">f4").tobytes()) # writing 12 values
|
||||
|
||||
# unit and unit multiplier
|
||||
fid.write(np.array(ch["unit"], dtype=">i4").tobytes())
|
||||
fid.write(np.array(ch["unit_mul"], dtype=">i4").tobytes())
|
||||
|
||||
# Finally channel name
|
||||
ch_name = ch["ch_name"][:15]
|
||||
fid.write(np.array(ch_name, dtype=">c").tobytes())
|
||||
fid.write(b"\0" * (16 - len(ch_name)))
|
||||
|
||||
|
||||
def write_dig_points(fid, dig, block=False, coord_frame=None, *, ch_names=None):
|
||||
"""Write a set of digitizer data points into a fif file."""
|
||||
if dig is not None:
|
||||
data_size = 5 * 4
|
||||
if block:
|
||||
start_block(fid, FIFF.FIFFB_ISOTRAK)
|
||||
if coord_frame is not None:
|
||||
write_int(fid, FIFF.FIFF_MNE_COORD_FRAME, coord_frame)
|
||||
for d in dig:
|
||||
fid.write(np.array(FIFF.FIFF_DIG_POINT, ">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFT_DIG_POINT_STRUCT, ">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, ">i4").tobytes())
|
||||
# Start writing fiffDigPointRec
|
||||
fid.write(np.array(d["kind"], ">i4").tobytes())
|
||||
fid.write(np.array(d["ident"], ">i4").tobytes())
|
||||
fid.write(np.array(d["r"][:3], ">f4").tobytes())
|
||||
if ch_names is not None:
|
||||
write_name_list_sanitized(
|
||||
fid, FIFF.FIFF_MNE_CH_NAME_LIST, ch_names, "ch_names"
|
||||
)
|
||||
if block:
|
||||
end_block(fid, FIFF.FIFFB_ISOTRAK)
|
||||
|
||||
|
||||
def write_float_sparse_rcs(fid, kind, mat):
|
||||
"""Write a single-precision sparse compressed row matrix tag."""
|
||||
return write_float_sparse(fid, kind, mat, fmt="csr")
|
||||
|
||||
|
||||
def write_float_sparse(fid, kind, mat, fmt="auto"):
|
||||
"""Write a single-precision floating-point sparse matrix tag."""
|
||||
if fmt == "auto":
|
||||
fmt = "csr" if isinstance(mat, csr_array) else "csc"
|
||||
need = csr_array if fmt == "csr" else csc_array
|
||||
matrix_type = getattr(FIFF, f"FIFFT_SPARSE_{fmt[-1].upper()}CS_MATRIX")
|
||||
_validate_type(mat, need, "sparse")
|
||||
matrix_type = matrix_type | FIFF.FIFFT_MATRIX | FIFF.FIFFT_FLOAT
|
||||
nnzm = mat.nnz
|
||||
nrow = mat.shape[0]
|
||||
data_size = 4 * nnzm + 4 * nnzm + 4 * (nrow + 1) + 4 * 4
|
||||
|
||||
fid.write(np.array(kind, dtype=">i4").tobytes())
|
||||
fid.write(np.array(matrix_type, dtype=">i4").tobytes())
|
||||
fid.write(np.array(data_size, dtype=">i4").tobytes())
|
||||
fid.write(np.array(FIFF.FIFFV_NEXT_SEQ, dtype=">i4").tobytes())
|
||||
|
||||
fid.write(np.array(mat.data, dtype=">f4").tobytes())
|
||||
fid.write(np.array(mat.indices, dtype=">i4").tobytes())
|
||||
fid.write(np.array(mat.indptr, dtype=">i4").tobytes())
|
||||
|
||||
dims = [nnzm, mat.shape[0], mat.shape[1], 2]
|
||||
fid.write(np.array(dims, dtype=">i4").tobytes())
|
||||
check_fiff_length(fid)
|
||||
|
||||
|
||||
def _generate_meas_id():
|
||||
"""Generate a new meas_id dict."""
|
||||
id_ = dict()
|
||||
id_["version"] = FIFF.FIFFC_VERSION
|
||||
id_["machid"] = get_machid()
|
||||
id_["secs"], id_["usecs"] = DATE_NONE
|
||||
return id_
|
||||
854
mne/_freesurfer.py
Normal file
@@ -0,0 +1,854 @@
|
||||
"""Freesurfer handling functions."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import os.path as op
|
||||
from gzip import GzipFile
|
||||
from pathlib import Path
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ._fiff.constants import FIFF
|
||||
from ._fiff.meas_info import read_fiducials
|
||||
from .surface import _read_mri_surface, read_surface
|
||||
from .transforms import (
|
||||
Transform,
|
||||
_ensure_trans,
|
||||
apply_trans,
|
||||
combine_transforms,
|
||||
invert_transform,
|
||||
read_ras_mni_t,
|
||||
)
|
||||
from .utils import (
|
||||
_check_fname,
|
||||
_check_option,
|
||||
_import_nibabel,
|
||||
_validate_type,
|
||||
get_subjects_dir,
|
||||
logger,
|
||||
verbose,
|
||||
)
|
||||
|
||||
|
||||
def _check_subject_dir(subject, subjects_dir):
|
||||
"""Check that the Freesurfer subject directory is as expected."""
|
||||
subjects_dir = Path(get_subjects_dir(subjects_dir, raise_error=True))
|
||||
for img_name in ("T1", "brain", "aseg"):
|
||||
if not (subjects_dir / subject / "mri" / f"{img_name}.mgz").is_file():
|
||||
raise ValueError(
|
||||
"Freesurfer recon-all subject folder "
|
||||
"is incorrect or improperly formatted, "
|
||||
f"got {subjects_dir / subject}"
|
||||
)
|
||||
return subjects_dir / subject
|
||||
|
||||
|
||||
def _get_aseg(aseg, subject, subjects_dir):
|
||||
"""Check that the anatomical segmentation file exists and load it."""
|
||||
nib = _import_nibabel("load aseg")
|
||||
subjects_dir = Path(get_subjects_dir(subjects_dir, raise_error=True))
|
||||
if aseg == "auto": # use aparc+aseg if auto
|
||||
aseg = _check_fname(
|
||||
subjects_dir / subject / "mri" / "aparc+aseg.mgz",
|
||||
overwrite="read",
|
||||
must_exist=False,
|
||||
)
|
||||
if not aseg: # if doesn't exist use wmparc
|
||||
aseg = subjects_dir / subject / "mri" / "wmparc.mgz"
|
||||
else:
|
||||
aseg = subjects_dir / subject / "mri" / f"{aseg}.mgz"
|
||||
_check_fname(aseg, overwrite="read", must_exist=True)
|
||||
aseg = nib.load(aseg)
|
||||
aseg_data = np.array(aseg.dataobj)
|
||||
return aseg, aseg_data
|
||||
|
||||
|
||||
def _reorient_image(img, axcodes="RAS"):
|
||||
"""Reorient an image to a given orientation.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
img : instance of SpatialImage
|
||||
The MRI image.
|
||||
axcodes : tuple | str
|
||||
The axis codes specifying the orientation, e.g. "RAS".
|
||||
See :func:`nibabel.orientations.aff2axcodes`.
|
||||
|
||||
Returns
|
||||
-------
|
||||
img_data : ndarray
|
||||
The reoriented image data.
|
||||
vox_ras_t : ndarray
|
||||
The new transform from the new voxels to surface RAS.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 0.24
|
||||
"""
|
||||
nib = _import_nibabel("reorient MRI image")
|
||||
orig_data = np.array(img.dataobj).astype(np.float32)
|
||||
# reorient data to RAS
|
||||
ornt = nib.orientations.axcodes2ornt(
|
||||
nib.orientations.aff2axcodes(img.affine)
|
||||
).astype(int)
|
||||
ras_ornt = nib.orientations.axcodes2ornt(axcodes)
|
||||
ornt_trans = nib.orientations.ornt_transform(ornt, ras_ornt)
|
||||
img_data = nib.orientations.apply_orientation(orig_data, ornt_trans)
|
||||
orig_mgh = nib.MGHImage(orig_data, img.affine)
|
||||
aff_trans = nib.orientations.inv_ornt_aff(ornt_trans, img.shape)
|
||||
vox_ras_t = np.dot(orig_mgh.header.get_vox2ras_tkr(), aff_trans)
|
||||
return img_data, vox_ras_t
|
||||
|
||||
|
||||
def _mri_orientation(orientation):
|
||||
"""Get MRI orientation information from an image.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
orientation : str
|
||||
Orientation that you want. Can be "axial", "sagittal", or "coronal".
|
||||
|
||||
Returns
|
||||
-------
|
||||
axis : int
|
||||
The dimension of the axis to take slices over when plotting.
|
||||
x : int
|
||||
The dimension of the x axis.
|
||||
y : int
|
||||
The dimension of the y axis.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 0.21
|
||||
.. versionchanged:: 0.24
|
||||
"""
|
||||
_check_option("orientation", orientation, ("coronal", "axial", "sagittal"))
|
||||
axis = dict(coronal=1, axial=2, sagittal=0)[orientation]
|
||||
x, y = sorted(set([0, 1, 2]).difference(set([axis])))
|
||||
return axis, x, y
|
||||
|
||||
|
||||
def _get_mri_info_data(mri, data):
|
||||
# Read the segmentation data using nibabel
|
||||
if data:
|
||||
_import_nibabel("load MRI atlas data")
|
||||
out = dict()
|
||||
_, out["vox_mri_t"], out["mri_ras_t"], dims, _, mgz = _read_mri_info(
|
||||
mri, return_img=True
|
||||
)
|
||||
out.update(
|
||||
mri_width=dims[0], mri_height=dims[1], mri_depth=dims[1], mri_volume_name=mri
|
||||
)
|
||||
if data:
|
||||
assert mgz is not None
|
||||
out["mri_vox_t"] = invert_transform(out["vox_mri_t"])
|
||||
out["data"] = np.asarray(mgz.dataobj)
|
||||
return out
|
||||
|
||||
|
||||
def _get_mgz_header(fname):
|
||||
"""Adapted from nibabel to quickly extract header info."""
|
||||
fname = _check_fname(fname, overwrite="read", must_exist=True, name="MRI image")
|
||||
if fname.suffix != ".mgz":
|
||||
raise OSError("Filename must end with .mgz")
|
||||
header_dtd = [
|
||||
("version", ">i4"),
|
||||
("dims", ">i4", (4,)),
|
||||
("type", ">i4"),
|
||||
("dof", ">i4"),
|
||||
("goodRASFlag", ">i2"),
|
||||
("delta", ">f4", (3,)),
|
||||
("Mdc", ">f4", (3, 3)),
|
||||
("Pxyz_c", ">f4", (3,)),
|
||||
]
|
||||
header_dtype = np.dtype(header_dtd)
|
||||
with GzipFile(fname, "rb") as fid:
|
||||
hdr_str = fid.read(header_dtype.itemsize)
|
||||
header = np.ndarray(shape=(), dtype=header_dtype, buffer=hdr_str)
|
||||
# dims
|
||||
dims = header["dims"].astype(int)
|
||||
dims = dims[:3] if len(dims) == 4 else dims
|
||||
# vox2ras_tkr
|
||||
delta = header["delta"]
|
||||
ds = np.array(delta, float)
|
||||
ns = np.array(dims * ds) / 2.0
|
||||
v2rtkr = np.array(
|
||||
[
|
||||
[-ds[0], 0, 0, ns[0]],
|
||||
[0, 0, ds[2], -ns[2]],
|
||||
[0, -ds[1], 0, ns[1]],
|
||||
[0, 0, 0, 1],
|
||||
],
|
||||
dtype=np.float32,
|
||||
)
|
||||
# ras2vox
|
||||
d = np.diag(delta)
|
||||
pcrs_c = dims / 2.0
|
||||
Mdc = header["Mdc"].T
|
||||
pxyz_0 = header["Pxyz_c"] - np.dot(Mdc, np.dot(d, pcrs_c))
|
||||
M = np.eye(4, 4)
|
||||
M[0:3, 0:3] = np.dot(Mdc, d)
|
||||
M[0:3, 3] = pxyz_0.T
|
||||
header = dict(dims=dims, vox2ras_tkr=v2rtkr, vox2ras=M, zooms=header["delta"])
|
||||
return header
|
||||
|
||||
|
||||
def _get_atlas_values(vol_info, rr):
|
||||
# Transform MRI coordinates (where our surfaces live) to voxels
|
||||
rr_vox = apply_trans(vol_info["mri_vox_t"], rr)
|
||||
good = (
|
||||
(rr_vox >= -0.5) & (rr_vox < np.array(vol_info["data"].shape, int) - 0.5)
|
||||
).all(-1)
|
||||
idx = np.round(rr_vox[good].T).astype(np.int64)
|
||||
values = np.full(rr.shape[0], np.nan)
|
||||
values[good] = vol_info["data"][tuple(idx)]
|
||||
return values
|
||||
|
||||
|
||||
def get_volume_labels_from_aseg(mgz_fname, return_colors=False, atlas_ids=None):
|
||||
"""Return a list of names and colors of segmented volumes.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
mgz_fname : path-like
|
||||
Filename to read. Typically ``aseg.mgz`` or some variant in the
|
||||
freesurfer pipeline.
|
||||
return_colors : bool
|
||||
If True returns also the labels colors.
|
||||
atlas_ids : dict | None
|
||||
A lookup table providing a mapping from region names (str) to ID values
|
||||
(int). Can be None to use the standard Freesurfer LUT.
|
||||
|
||||
.. versionadded:: 0.21.0
|
||||
|
||||
Returns
|
||||
-------
|
||||
label_names : list of str
|
||||
The names of segmented volumes included in this mgz file.
|
||||
label_colors : list of str
|
||||
The RGB colors of the labels included in this mgz file.
|
||||
|
||||
See Also
|
||||
--------
|
||||
read_freesurfer_lut
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionchanged:: 0.21.0
|
||||
The label names are now sorted in the same order as their corresponding
|
||||
values in the MRI file.
|
||||
|
||||
.. versionadded:: 0.9.0
|
||||
"""
|
||||
nib = _import_nibabel("load MRI atlas data")
|
||||
mgz_fname = _check_fname(
|
||||
mgz_fname, overwrite="read", must_exist=True, name="mgz_fname"
|
||||
)
|
||||
atlas = nib.load(mgz_fname)
|
||||
data = np.asarray(atlas.dataobj) # don't need float here
|
||||
want = np.unique(data)
|
||||
if atlas_ids is None:
|
||||
atlas_ids, colors = read_freesurfer_lut()
|
||||
elif return_colors:
|
||||
raise ValueError("return_colors must be False if atlas_ids are provided")
|
||||
# restrict to the ones in the MRI, sorted by label name
|
||||
keep = np.isin(list(atlas_ids.values()), want)
|
||||
keys = sorted(
|
||||
(key for ki, key in enumerate(atlas_ids.keys()) if keep[ki]),
|
||||
key=lambda x: atlas_ids[x],
|
||||
)
|
||||
if return_colors:
|
||||
colors = [colors[k] for k in keys]
|
||||
out = keys, colors
|
||||
else:
|
||||
out = keys
|
||||
return out
|
||||
|
||||
|
||||
##############################################################################
|
||||
# Head to MRI volume conversion
|
||||
|
||||
|
||||
@verbose
|
||||
def head_to_mri(
|
||||
pos,
|
||||
subject,
|
||||
mri_head_t,
|
||||
subjects_dir=None,
|
||||
*,
|
||||
kind="mri",
|
||||
unscale=False,
|
||||
verbose=None,
|
||||
):
|
||||
"""Convert pos from head coordinate system to MRI ones.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
pos : array, shape (n_pos, 3)
|
||||
The coordinates (in m) in head coordinate system.
|
||||
%(subject)s
|
||||
mri_head_t : instance of Transform
|
||||
MRI<->Head coordinate transformation.
|
||||
%(subjects_dir)s
|
||||
kind : str
|
||||
The MRI coordinate frame kind, can be ``'mri'`` (default) for
|
||||
FreeSurfer surface RAS or ``'ras'`` (default in 1.2) to use MRI RAS
|
||||
(scanner RAS).
|
||||
|
||||
.. versionadded:: 1.2
|
||||
unscale : bool
|
||||
For surrogate MRIs (e.g., scaled using ``mne coreg``), if True
|
||||
(default False), use the MRI scaling parameters to obtain points in
|
||||
the original/surrogate subject's MRI space.
|
||||
|
||||
.. versionadded:: 1.2
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
coordinates : array, shape (n_pos, 3)
|
||||
The MRI RAS coordinates (in mm) of pos.
|
||||
|
||||
Notes
|
||||
-----
|
||||
This function requires nibabel.
|
||||
"""
|
||||
from .coreg import read_mri_cfg
|
||||
|
||||
_validate_type(kind, str, "kind")
|
||||
_check_option("kind", kind, ("ras", "mri"))
|
||||
subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
|
||||
t1_fname = subjects_dir / subject / "mri" / "T1.mgz"
|
||||
head_mri_t = _ensure_trans(mri_head_t, "head", "mri")
|
||||
if kind == "ras":
|
||||
_, _, mri_ras_t, _, _ = _read_mri_info(t1_fname)
|
||||
head_ras_t = combine_transforms(head_mri_t, mri_ras_t, "head", "ras")
|
||||
head_dest_t = head_ras_t
|
||||
else:
|
||||
assert kind == "mri"
|
||||
head_dest_t = head_mri_t
|
||||
pos_dest = apply_trans(head_dest_t, pos)
|
||||
# unscale if requested
|
||||
if unscale:
|
||||
params = read_mri_cfg(subject, subjects_dir)
|
||||
pos_dest /= params["scale"]
|
||||
pos_dest *= 1e3 # mm
|
||||
return pos_dest
|
||||
|
||||
|
||||
##############################################################################
|
||||
# Surface to MNI conversion
|
||||
|
||||
|
||||
@verbose
|
||||
def vertex_to_mni(vertices, hemis, subject, subjects_dir=None, verbose=None):
|
||||
"""Convert the array of vertices for a hemisphere to MNI coordinates.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
vertices : int, or list of int
|
||||
Vertex number(s) to convert.
|
||||
hemis : int, or list of int
|
||||
Hemisphere(s) the vertices belong to.
|
||||
%(subject)s
|
||||
subjects_dir : str, or None
|
||||
Path to ``SUBJECTS_DIR`` if it is not set in the environment.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
coordinates : array, shape (n_vertices, 3)
|
||||
The MNI coordinates (in mm) of the vertices.
|
||||
"""
|
||||
singleton = False
|
||||
if not isinstance(vertices, list) and not isinstance(vertices, np.ndarray):
|
||||
singleton = True
|
||||
vertices = [vertices]
|
||||
|
||||
if not isinstance(hemis, list) and not isinstance(hemis, np.ndarray):
|
||||
hemis = [hemis] * len(vertices)
|
||||
|
||||
if not len(hemis) == len(vertices):
|
||||
raise ValueError("hemi and vertices must match in length")
|
||||
|
||||
subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
|
||||
|
||||
surfs = [subjects_dir / subject / "surf" / f"{h}.white" for h in ["lh", "rh"]]
|
||||
|
||||
# read surface locations in MRI space
|
||||
rr = [read_surface(s)[0] for s in surfs]
|
||||
|
||||
# take point locations in MRI space and convert to MNI coordinates
|
||||
xfm = read_talxfm(subject, subjects_dir)
|
||||
xfm["trans"][:3, 3] *= 1000.0 # m->mm
|
||||
data = np.array([rr[h][v, :] for h, v in zip(hemis, vertices)])
|
||||
if singleton:
|
||||
data = data[0]
|
||||
return apply_trans(xfm["trans"], data)
|
||||
|
||||
|
||||
##############################################################################
|
||||
# Volume to MNI conversion
|
||||
|
||||
|
||||
@verbose
|
||||
def head_to_mni(pos, subject, mri_head_t, subjects_dir=None, verbose=None):
|
||||
"""Convert pos from head coordinate system to MNI ones.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
pos : array, shape (n_pos, 3)
|
||||
The coordinates (in m) in head coordinate system.
|
||||
%(subject)s
|
||||
mri_head_t : instance of Transform
|
||||
MRI<->Head coordinate transformation.
|
||||
%(subjects_dir)s
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
coordinates : array, shape (n_pos, 3)
|
||||
The MNI coordinates (in mm) of pos.
|
||||
|
||||
Notes
|
||||
-----
|
||||
This function requires either nibabel.
|
||||
"""
|
||||
subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
|
||||
|
||||
# before we go from head to MRI (surface RAS)
|
||||
head_mni_t = combine_transforms(
|
||||
_ensure_trans(mri_head_t, "head", "mri"),
|
||||
read_talxfm(subject, subjects_dir),
|
||||
"head",
|
||||
"mni_tal",
|
||||
)
|
||||
return apply_trans(head_mni_t, pos) * 1000.0
|
||||
|
||||
|
||||
@verbose
|
||||
def get_mni_fiducials(subject, subjects_dir=None, verbose=None):
|
||||
"""Estimate fiducials for a subject.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
%(subject)s
|
||||
%(subjects_dir)s
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
fids_mri : list
|
||||
List of estimated fiducials (each point in a dict), in the order
|
||||
LPA, nasion, RPA.
|
||||
|
||||
Notes
|
||||
-----
|
||||
This takes the ``fsaverage-fiducials.fif`` file included with MNE—which
|
||||
contain the LPA, nasion, and RPA for the ``fsaverage`` subject—and
|
||||
transforms them to the given FreeSurfer subject's MRI space.
|
||||
The MRI of ``fsaverage`` is already in MNI Talairach space, so applying
|
||||
the inverse of the given subject's MNI Talairach affine transformation
|
||||
(``$SUBJECTS_DIR/$SUBJECT/mri/transforms/talairach.xfm``) is used
|
||||
to estimate the subject's fiducial locations.
|
||||
|
||||
For more details about the coordinate systems and transformations involved,
|
||||
see https://surfer.nmr.mgh.harvard.edu/fswiki/CoordinateSystems and
|
||||
:ref:`tut-source-alignment`.
|
||||
"""
|
||||
# Eventually we might want to allow using the MNI Talairach with-skull
|
||||
# transformation rather than the standard brain-based MNI Talaranch
|
||||
# transformation, and/or project the points onto the head surface
|
||||
# (if available).
|
||||
fname_fids_fs = (
|
||||
Path(__file__).parent / "data" / "fsaverage" / "fsaverage-fiducials.fif"
|
||||
)
|
||||
|
||||
# Read fsaverage fiducials file and subject Talairach.
|
||||
fids, coord_frame = read_fiducials(fname_fids_fs)
|
||||
assert coord_frame == FIFF.FIFFV_COORD_MRI
|
||||
if subject == "fsaverage":
|
||||
return fids # special short-circuit for fsaverage
|
||||
mni_mri_t = invert_transform(read_talxfm(subject, subjects_dir))
|
||||
for f in fids:
|
||||
f["r"] = apply_trans(mni_mri_t, f["r"])
|
||||
return fids
|
||||
|
||||
|
||||
@verbose
|
||||
def estimate_head_mri_t(subject, subjects_dir=None, verbose=None):
|
||||
"""Estimate the head->mri transform from fsaverage fiducials.
|
||||
|
||||
A subject's fiducials can be estimated given a Freesurfer ``recon-all``
|
||||
by transforming ``fsaverage`` fiducials using the inverse Talairach
|
||||
transform, see :func:`mne.coreg.get_mni_fiducials`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
%(subject)s
|
||||
%(subjects_dir)s
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
%(trans_not_none)s
|
||||
"""
|
||||
from .channels.montage import compute_native_head_t, make_dig_montage
|
||||
|
||||
subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
|
||||
lpa, nasion, rpa = get_mni_fiducials(subject, subjects_dir)
|
||||
montage = make_dig_montage(
|
||||
lpa=lpa["r"], nasion=nasion["r"], rpa=rpa["r"], coord_frame="mri"
|
||||
)
|
||||
return invert_transform(compute_native_head_t(montage))
|
||||
|
||||
|
||||
def _get_affine_from_lta_info(lines):
|
||||
"""Get the vox2ras affine from lta file info."""
|
||||
volume_data = np.loadtxt([line.split("=")[1] for line in lines])
|
||||
# get the size of the volume (number of voxels), slice resolution.
|
||||
# the matrix of directional cosines and the ras at the center of the bore
|
||||
dims, deltas, dir_cos, center_ras = (
|
||||
volume_data[0],
|
||||
volume_data[1],
|
||||
volume_data[2:5],
|
||||
volume_data[5],
|
||||
)
|
||||
dir_cos_delta = dir_cos.T * deltas
|
||||
vol_center = (dir_cos_delta @ dims[:3]) / 2
|
||||
affine = np.eye(4)
|
||||
affine[:3, :3] = dir_cos_delta
|
||||
affine[:3, 3] = center_ras - vol_center
|
||||
return affine
|
||||
|
||||
|
||||
@verbose
|
||||
def read_lta(fname, verbose=None):
|
||||
"""Read a Freesurfer linear transform array file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like
|
||||
The transform filename.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
affine : ndarray
|
||||
The affine transformation described by the lta file.
|
||||
"""
|
||||
_check_fname(fname, "read", must_exist=True)
|
||||
with open(fname) as fid:
|
||||
lines = fid.readlines()
|
||||
# 0 is linear vox2vox, 1 is linear ras2ras
|
||||
trans_type = int(lines[0].split("=")[1].strip()[0])
|
||||
assert trans_type in (0, 1)
|
||||
affine = np.loadtxt(lines[5:9])
|
||||
if trans_type == 1:
|
||||
return affine
|
||||
|
||||
src_affine = _get_affine_from_lta_info(lines[12:18])
|
||||
dst_affine = _get_affine_from_lta_info(lines[21:27])
|
||||
|
||||
# don't compute if src and dst are already identical
|
||||
if np.allclose(src_affine, dst_affine):
|
||||
return affine
|
||||
|
||||
ras2ras = src_affine @ np.linalg.inv(affine) @ np.linalg.inv(dst_affine)
|
||||
affine = np.linalg.inv(np.linalg.inv(src_affine) @ ras2ras @ src_affine)
|
||||
return affine
|
||||
|
||||
|
||||
@verbose
|
||||
def read_talxfm(subject, subjects_dir=None, verbose=None):
|
||||
"""Compute MRI-to-MNI transform from FreeSurfer talairach.xfm file.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
%(subject)s
|
||||
%(subjects_dir)s
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
mri_mni_t : instance of Transform
|
||||
The affine transformation from MRI to MNI space for the subject.
|
||||
"""
|
||||
# Adapted from freesurfer m-files. Altered to deal with Norig
|
||||
# and Torig correctly
|
||||
subjects_dir = get_subjects_dir(subjects_dir)
|
||||
# Setup the RAS to MNI transform
|
||||
ras_mni_t = read_ras_mni_t(subject, subjects_dir)
|
||||
ras_mni_t["trans"][:3, 3] /= 1000.0 # mm->m
|
||||
|
||||
# We want to get from Freesurfer surface RAS ('mri') to MNI ('mni_tal').
|
||||
# This file only gives us RAS (non-zero origin) ('ras') to MNI ('mni_tal').
|
||||
# Se we need to get the ras->mri transform from the MRI headers.
|
||||
|
||||
# To do this, we get Norig and Torig
|
||||
# (i.e. vox_ras_t and vox_mri_t, respectively)
|
||||
path = subjects_dir / subject / "mri" / "orig.mgz"
|
||||
if not path.is_file():
|
||||
path = subjects_dir / subject / "mri" / "T1.mgz"
|
||||
if not path.is_file():
|
||||
raise OSError(f"mri not found: {path}")
|
||||
_, _, mri_ras_t, _, _ = _read_mri_info(path)
|
||||
mri_mni_t = combine_transforms(mri_ras_t, ras_mni_t, "mri", "mni_tal")
|
||||
return mri_mni_t
|
||||
|
||||
|
||||
def _check_mri(mri, subject, subjects_dir) -> str:
|
||||
"""Check whether an mri exists in the Freesurfer subject directory."""
|
||||
_validate_type(mri, "path-like", mri)
|
||||
mri = Path(mri)
|
||||
if mri.is_file() and mri.name != mri:
|
||||
return str(mri)
|
||||
elif not mri.is_file():
|
||||
if subject is None:
|
||||
raise FileNotFoundError(
|
||||
f"MRI file {mri!r} not found and no subject provided."
|
||||
)
|
||||
subjects_dir = get_subjects_dir(subjects_dir, raise_error=True)
|
||||
mri = subjects_dir / subject / "mri" / mri
|
||||
if not mri.is_file():
|
||||
raise FileNotFoundError(
|
||||
f"MRI file {mri!r} not found in the subjects directory "
|
||||
f"{subjects_dir!r} for subject {subject}."
|
||||
)
|
||||
if mri.name == mri:
|
||||
raise OSError(
|
||||
f"Ambiguous filename - found {mri!r} in current folder. "
|
||||
"If this is correct prefix name with relative or absolute path."
|
||||
)
|
||||
return str(mri)
|
||||
|
||||
|
||||
def _read_mri_info(path, units="m", return_img=False, use_nibabel=False):
|
||||
# This is equivalent but 100x slower, so only use nibabel if we need to
|
||||
# (later):
|
||||
if use_nibabel:
|
||||
nib = _import_nibabel()
|
||||
hdr = nib.load(path).header
|
||||
n_orig = hdr.get_vox2ras()
|
||||
t_orig = hdr.get_vox2ras_tkr()
|
||||
dims = hdr.get_data_shape()
|
||||
zooms = hdr.get_zooms()[:3]
|
||||
else:
|
||||
hdr = _get_mgz_header(path)
|
||||
n_orig = hdr["vox2ras"]
|
||||
t_orig = hdr["vox2ras_tkr"]
|
||||
dims = hdr["dims"]
|
||||
zooms = hdr["zooms"]
|
||||
|
||||
# extract the MRI_VOXEL to RAS (non-zero origin) transform
|
||||
vox_ras_t = Transform("mri_voxel", "ras", n_orig)
|
||||
|
||||
# extract the MRI_VOXEL to MRI transform
|
||||
vox_mri_t = Transform("mri_voxel", "mri", t_orig)
|
||||
|
||||
# construct the MRI to RAS (non-zero origin) transform
|
||||
mri_ras_t = combine_transforms(invert_transform(vox_mri_t), vox_ras_t, "mri", "ras")
|
||||
|
||||
assert units in ("m", "mm")
|
||||
if units == "m":
|
||||
conv = np.array([[1e-3, 1e-3, 1e-3, 1]]).T
|
||||
# scaling and translation terms
|
||||
vox_ras_t["trans"] *= conv
|
||||
vox_mri_t["trans"] *= conv
|
||||
# just the translation term
|
||||
mri_ras_t["trans"][:, 3:4] *= conv
|
||||
|
||||
out = (vox_ras_t, vox_mri_t, mri_ras_t, dims, zooms)
|
||||
if return_img:
|
||||
nibabel = _import_nibabel()
|
||||
out += (nibabel.load(path),)
|
||||
return out
|
||||
|
||||
|
||||
def read_freesurfer_lut(fname=None):
|
||||
"""Read a Freesurfer-formatted LUT.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like | None
|
||||
The filename. Can be None to read the standard Freesurfer LUT.
|
||||
|
||||
Returns
|
||||
-------
|
||||
atlas_ids : dict
|
||||
Mapping from label names to IDs.
|
||||
colors : dict
|
||||
Mapping from label names to colors.
|
||||
"""
|
||||
lut = _get_lut(fname)
|
||||
names, ids = lut["name"], lut["id"]
|
||||
colors = np.array([lut["R"], lut["G"], lut["B"], lut["A"]], float).T
|
||||
atlas_ids = dict(zip(names, ids))
|
||||
colors = dict(zip(names, colors))
|
||||
return atlas_ids, colors
|
||||
|
||||
|
||||
def _get_lut(fname=None):
|
||||
"""Get a FreeSurfer LUT."""
|
||||
if fname is None:
|
||||
fname = Path(__file__).parent / "data" / "FreeSurferColorLUT.txt"
|
||||
_check_fname(fname, "read", must_exist=True)
|
||||
dtype = [
|
||||
("id", "<i8"),
|
||||
("name", "U"),
|
||||
("R", "<i8"),
|
||||
("G", "<i8"),
|
||||
("B", "<i8"),
|
||||
("A", "<i8"),
|
||||
]
|
||||
lut = {d[0]: list() for d in dtype}
|
||||
with open(fname) as fid:
|
||||
for line in fid:
|
||||
line = line.strip()
|
||||
if line.startswith("#") or not line:
|
||||
continue
|
||||
line = line.split()
|
||||
if len(line) != len(dtype):
|
||||
raise RuntimeError(f"LUT is improperly formatted: {fname}")
|
||||
for d, part in zip(dtype, line):
|
||||
lut[d[0]].append(part)
|
||||
lut = {d[0]: np.array(lut[d[0]], dtype=d[1]) for d in dtype}
|
||||
assert len(lut["name"]) > 0
|
||||
lut["name"] = [str(name) for name in lut["name"]]
|
||||
return lut
|
||||
|
||||
|
||||
@verbose
|
||||
def _get_head_surface(surf, subject, subjects_dir, bem=None, verbose=None):
|
||||
"""Get a head surface from the Freesurfer subject directory.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
surf : str
|
||||
The name of the surface 'auto', 'head', 'outer_skin', 'head-dense'
|
||||
or 'seghead'.
|
||||
%(subject)s
|
||||
%(subjects_dir)s
|
||||
bem : mne.bem.ConductorModel | None
|
||||
The conductor model that stores information about the head surface.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
head_surf : dict | None
|
||||
A dictionary with keys 'rr', 'tris', 'ntri', 'use_tris', 'np'
|
||||
and 'coord_frame' that store information for mesh plotting and other
|
||||
useful information about the head surface.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded: 0.24
|
||||
"""
|
||||
from .bem import _bem_find_surface, read_bem_surfaces
|
||||
|
||||
_check_option("surf", surf, ("auto", "head", "outer_skin", "head-dense", "seghead"))
|
||||
if surf in ("auto", "head", "outer_skin"):
|
||||
if bem is not None:
|
||||
try:
|
||||
return _bem_find_surface(bem, "head")
|
||||
except RuntimeError:
|
||||
logger.info(
|
||||
"Could not find the surface for "
|
||||
"head in the provided BEM model, "
|
||||
"looking in the subject directory."
|
||||
)
|
||||
if subject is None:
|
||||
if surf == "auto":
|
||||
return
|
||||
raise ValueError(
|
||||
"To plot the head surface, the BEM/sphere"
|
||||
" model must contain a head surface "
|
||||
'or "subject" must be provided (got '
|
||||
"None)"
|
||||
)
|
||||
subject_dir = op.join(get_subjects_dir(subjects_dir, raise_error=True), subject)
|
||||
if surf in ("head-dense", "seghead"):
|
||||
try_fnames = [
|
||||
op.join(subject_dir, "bem", f"{subject}-head-dense.fif"),
|
||||
op.join(subject_dir, "surf", "lh.seghead"),
|
||||
]
|
||||
else:
|
||||
try_fnames = [
|
||||
op.join(subject_dir, "bem", "outer_skin.surf"),
|
||||
op.join(subject_dir, "bem", "flash", "outer_skin.surf"),
|
||||
op.join(subject_dir, "bem", f"{subject}-head-sparse.fif"),
|
||||
op.join(subject_dir, "bem", f"{subject}-head.fif"),
|
||||
]
|
||||
for fname in try_fnames:
|
||||
if op.exists(fname):
|
||||
logger.info(f"Using {op.basename(fname)} for head surface.")
|
||||
if op.splitext(fname)[-1] == ".fif":
|
||||
return read_bem_surfaces(fname, on_defects="warn")[0]
|
||||
else:
|
||||
return _read_mri_surface(fname)
|
||||
raise OSError(
|
||||
"No head surface found for subject "
|
||||
f"{subject} after trying:\n" + "\n".join(try_fnames)
|
||||
)
|
||||
|
||||
|
||||
@verbose
|
||||
def _get_skull_surface(surf, subject, subjects_dir, bem=None, verbose=None):
|
||||
"""Get a skull surface from the Freesurfer subject directory.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
surf : str
|
||||
The name of the surface 'outer' or 'inner'.
|
||||
%(subject)s
|
||||
%(subjects_dir)s
|
||||
bem : mne.bem.ConductorModel | None
|
||||
The conductor model that stores information about the skull surface.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
skull_surf : dict | None
|
||||
A dictionary with keys 'rr', 'tris', 'ntri', 'use_tris', 'np'
|
||||
and 'coord_frame' that store information for mesh plotting and other
|
||||
useful information about the head surface.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded: 0.24
|
||||
"""
|
||||
from .bem import _bem_find_surface
|
||||
|
||||
if bem is not None:
|
||||
try:
|
||||
return _bem_find_surface(bem, surf + "_skull")
|
||||
except RuntimeError:
|
||||
logger.info(
|
||||
"Could not find the surface for "
|
||||
"skull in the provided BEM model, "
|
||||
"looking in the subject directory."
|
||||
)
|
||||
subjects_dir = Path(get_subjects_dir(subjects_dir, raise_error=True))
|
||||
fname = _check_fname(
|
||||
subjects_dir / subject / "bem" / (surf + "_skull.surf"),
|
||||
overwrite="read",
|
||||
must_exist=True,
|
||||
name=f"{surf} skull surface",
|
||||
)
|
||||
return _read_mri_surface(fname)
|
||||
|
||||
|
||||
def _estimate_talxfm_rigid(subject, subjects_dir):
|
||||
from .coreg import _trans_from_params, fit_matched_points
|
||||
|
||||
xfm = read_talxfm(subject, subjects_dir)
|
||||
# XYZ+origin + halfway
|
||||
pts_tal = np.concatenate([np.eye(4)[:, :3], np.eye(3) * 0.5])
|
||||
pts_subj = apply_trans(invert_transform(xfm), pts_tal)
|
||||
# we fit with scaling enabled, but then discard it (we just need
|
||||
# the rigid-body components)
|
||||
params = fit_matched_points(pts_subj, pts_tal, scale=3, out="params")
|
||||
rigid = _trans_from_params((True, True, False), params[:6])
|
||||
return rigid
|
||||
463
mne/_ola.py
Normal file
@@ -0,0 +1,463 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
from scipy.signal import get_window
|
||||
|
||||
from .utils import _ensure_int, logger, verbose
|
||||
|
||||
###############################################################################
|
||||
# Class for interpolation between adjacent points
|
||||
|
||||
|
||||
class _Interp2:
|
||||
r"""Interpolate between two points.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
control_points : array, shape (n_changes,)
|
||||
The control points (indices) to use.
|
||||
values : callable | array, shape (n_changes, ...)
|
||||
Callable that takes the control point and returns a list of
|
||||
arrays that must be interpolated.
|
||||
interp : str
|
||||
Can be 'zero', 'linear', 'hann', or 'cos2' (same as hann).
|
||||
|
||||
Notes
|
||||
-----
|
||||
This will process data using overlapping windows of potentially
|
||||
different sizes to achieve a constant output value using different
|
||||
2-point interpolation schemes. For example, for linear interpolation,
|
||||
and window sizes of 6 and 17, this would look like::
|
||||
|
||||
1 _ _
|
||||
|\ / '-. .-'
|
||||
| \ / '-. .-'
|
||||
| x |-.-|
|
||||
| / \ .-' '-.
|
||||
|/ \_.-' '-.
|
||||
0 +----|----|----|----|---
|
||||
0 5 10 15 20 25
|
||||
|
||||
"""
|
||||
|
||||
def __init__(self, control_points, values, interp="hann"):
|
||||
# set up interpolation
|
||||
self.control_points = np.array(control_points, int).ravel()
|
||||
if not np.array_equal(np.unique(self.control_points), self.control_points):
|
||||
raise ValueError("Control points must be sorted and unique")
|
||||
if len(self.control_points) == 0:
|
||||
raise ValueError("Must be at least one control point")
|
||||
if not (self.control_points >= 0).all():
|
||||
raise ValueError(
|
||||
f"All control points must be positive (got {self.control_points[:3]})"
|
||||
)
|
||||
if isinstance(values, np.ndarray):
|
||||
values = [values]
|
||||
if isinstance(values, list | tuple):
|
||||
for v in values:
|
||||
if not (v is None or isinstance(v, np.ndarray)):
|
||||
raise TypeError(
|
||||
'All entries in "values" must be ndarray or None, got '
|
||||
f"{type(v)}"
|
||||
)
|
||||
if v is not None and v.shape[0] != len(self.control_points):
|
||||
raise ValueError(
|
||||
"Values, if provided, must be the same length as the number of "
|
||||
f"control points ({len(self.control_points)}), got {v.shape[0]}"
|
||||
)
|
||||
use_values = values
|
||||
|
||||
def val(pt):
|
||||
idx = np.where(control_points == pt)[0][0]
|
||||
return [v[idx] if v is not None else None for v in use_values]
|
||||
|
||||
values = val
|
||||
self.values = values
|
||||
self.n_last = None
|
||||
self._position = 0 # start at zero
|
||||
self._left_idx = 0
|
||||
self._left = self._right = self._use_interp = None
|
||||
known_types = ("cos2", "linear", "zero", "hann")
|
||||
if interp not in known_types:
|
||||
raise ValueError(f'interp must be one of {known_types}, got "{interp}"')
|
||||
self._interp = interp
|
||||
|
||||
def feed_generator(self, n_pts):
|
||||
"""Feed data and get interpolators as a generator."""
|
||||
self.n_last = 0
|
||||
n_pts = _ensure_int(n_pts, "n_pts")
|
||||
original_position = self._position
|
||||
stop = self._position + n_pts
|
||||
logger.debug(f"Feed {n_pts} ({self._position}-{stop})")
|
||||
used = np.zeros(n_pts, bool)
|
||||
if self._left is None: # first one
|
||||
logger.debug(f" Eval @ 0 ({self.control_points[0]})")
|
||||
self._left = self.values(self.control_points[0])
|
||||
if len(self.control_points) == 1:
|
||||
self._right = self._left
|
||||
n_used = 0
|
||||
|
||||
# Left zero-order hold condition
|
||||
if self._position < self.control_points[self._left_idx]:
|
||||
n_use = min(self.control_points[self._left_idx] - self._position, n_pts)
|
||||
logger.debug(f" Left ZOH {n_use}")
|
||||
this_sl = slice(None, n_use)
|
||||
assert used[this_sl].size == n_use
|
||||
assert not used[this_sl].any()
|
||||
used[this_sl] = True
|
||||
yield [this_sl, self._left, None, None]
|
||||
self._position += n_use
|
||||
n_used += n_use
|
||||
self.n_last += 1
|
||||
|
||||
# Standard interpolation condition
|
||||
stop_right_idx = np.where(self.control_points >= stop)[0]
|
||||
if len(stop_right_idx) == 0:
|
||||
stop_right_idx = [len(self.control_points) - 1]
|
||||
stop_right_idx = stop_right_idx[0]
|
||||
left_idxs = np.arange(self._left_idx, stop_right_idx)
|
||||
self.n_last += max(len(left_idxs) - 1, 0)
|
||||
for bi, left_idx in enumerate(left_idxs):
|
||||
if left_idx != self._left_idx or self._right is None:
|
||||
if self._right is not None:
|
||||
assert left_idx == self._left_idx + 1
|
||||
self._left = self._right
|
||||
self._left_idx += 1
|
||||
self._use_interp = None # need to recreate it
|
||||
eval_pt = self.control_points[self._left_idx + 1]
|
||||
logger.debug(f" Eval @ {self._left_idx + 1} ({eval_pt})")
|
||||
self._right = self.values(eval_pt)
|
||||
assert self._right is not None
|
||||
left_point = self.control_points[self._left_idx]
|
||||
right_point = self.control_points[self._left_idx + 1]
|
||||
if self._use_interp is None:
|
||||
interp_span = right_point - left_point
|
||||
if self._interp == "zero":
|
||||
self._use_interp = None
|
||||
elif self._interp == "linear":
|
||||
self._use_interp = np.linspace(
|
||||
1.0, 0.0, interp_span, endpoint=False
|
||||
)
|
||||
else: # self._interp in ('cos2', 'hann'):
|
||||
self._use_interp = np.cos(
|
||||
np.linspace(0, np.pi / 2.0, interp_span, endpoint=False)
|
||||
)
|
||||
self._use_interp *= self._use_interp
|
||||
n_use = min(stop, right_point) - self._position
|
||||
if n_use > 0:
|
||||
logger.debug(
|
||||
f" Interp {self._interp} {n_use} ({left_point}-{right_point})"
|
||||
)
|
||||
interp_start = self._position - left_point
|
||||
assert interp_start >= 0
|
||||
if self._use_interp is None:
|
||||
this_interp = None
|
||||
else:
|
||||
this_interp = self._use_interp[interp_start : interp_start + n_use]
|
||||
assert this_interp.size == n_use
|
||||
this_sl = slice(n_used, n_used + n_use)
|
||||
assert used[this_sl].size == n_use
|
||||
assert not used[this_sl].any()
|
||||
used[this_sl] = True
|
||||
yield [this_sl, self._left, self._right, this_interp]
|
||||
self._position += n_use
|
||||
n_used += n_use
|
||||
|
||||
# Right zero-order hold condition
|
||||
if self.control_points[self._left_idx] <= self._position:
|
||||
n_use = stop - self._position
|
||||
if n_use > 0:
|
||||
logger.debug(f" Right ZOH {n_use}")
|
||||
this_sl = slice(n_pts - n_use, None)
|
||||
assert not used[this_sl].any()
|
||||
used[this_sl] = True
|
||||
assert self._right is not None
|
||||
yield [this_sl, self._right, None, None]
|
||||
self._position += n_use
|
||||
n_used += n_use
|
||||
self.n_last += 1
|
||||
assert self._position == stop
|
||||
assert n_used == n_pts
|
||||
assert used.all()
|
||||
assert self._position == original_position + n_pts
|
||||
|
||||
def feed(self, n_pts):
|
||||
"""Feed data and get interpolated values."""
|
||||
# Convenience function for assembly
|
||||
out_arrays = None
|
||||
for o in self.feed_generator(n_pts):
|
||||
if out_arrays is None:
|
||||
out_arrays = [
|
||||
np.empty(v.shape + (n_pts,)) if v is not None else None
|
||||
for v in o[1]
|
||||
]
|
||||
for ai, arr in enumerate(out_arrays):
|
||||
if arr is not None:
|
||||
if o[3] is None:
|
||||
arr[..., o[0]] = o[1][ai][..., np.newaxis]
|
||||
else:
|
||||
arr[..., o[0]] = o[1][ai][..., np.newaxis] * o[3] + o[2][ai][
|
||||
..., np.newaxis
|
||||
] * (1.0 - o[3])
|
||||
assert out_arrays is not None
|
||||
return out_arrays
|
||||
|
||||
|
||||
###############################################################################
|
||||
# Constant overlap-add processing class
|
||||
|
||||
|
||||
def _check_store(store):
|
||||
if isinstance(store, np.ndarray):
|
||||
store = [store]
|
||||
if isinstance(store, list | tuple) and all(
|
||||
isinstance(s, np.ndarray) for s in store
|
||||
):
|
||||
store = _Storer(*store)
|
||||
if not callable(store):
|
||||
raise TypeError(f"store must be callable, got type {type(store)}")
|
||||
return store
|
||||
|
||||
|
||||
class _COLA:
|
||||
r"""Constant overlap-add processing helper.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
process : callable
|
||||
A function that takes a chunk of input data with shape
|
||||
``(n_channels, n_samples)`` and processes it.
|
||||
store : callable | ndarray
|
||||
A function that takes a completed chunk of output data.
|
||||
Can also be an ``ndarray``, in which case it is treated as the
|
||||
output data in which to store the results.
|
||||
n_total : int
|
||||
The total number of samples.
|
||||
n_samples : int
|
||||
The number of samples per window.
|
||||
n_overlap : int
|
||||
The overlap between windows.
|
||||
window : str
|
||||
The window to use. Default is "hann".
|
||||
tol : float
|
||||
The tolerance for COLA checking.
|
||||
|
||||
Notes
|
||||
-----
|
||||
This will process data using overlapping windows to achieve a constant
|
||||
output value. For example, for ``n_total=27``, ``n_samples=10``,
|
||||
``n_overlap=5`` and ``window='triang'``::
|
||||
|
||||
1 _____ _______
|
||||
| \ /\ /\ /
|
||||
| \ / \ / \ /
|
||||
| x x x
|
||||
| / \ / \ / \
|
||||
| / \/ \/ \
|
||||
0 +----|----|----|----|----|-
|
||||
0 5 10 15 20 25
|
||||
|
||||
This produces four windows: the first three are the requested length
|
||||
(10 samples) and the last one is longer (12 samples). The first and last
|
||||
window are asymmetric.
|
||||
"""
|
||||
|
||||
@verbose
|
||||
def __init__(
|
||||
self,
|
||||
process,
|
||||
store,
|
||||
n_total,
|
||||
n_samples,
|
||||
n_overlap,
|
||||
sfreq,
|
||||
window="hann",
|
||||
tol=1e-10,
|
||||
*,
|
||||
verbose=None,
|
||||
):
|
||||
n_samples = _ensure_int(n_samples, "n_samples")
|
||||
n_overlap = _ensure_int(n_overlap, "n_overlap")
|
||||
n_total = _ensure_int(n_total, "n_total")
|
||||
if n_samples <= 0:
|
||||
raise ValueError(f"n_samples must be > 0, got {n_samples}")
|
||||
if n_overlap < 0:
|
||||
raise ValueError(f"n_overlap must be >= 0, got {n_overlap}")
|
||||
if n_total < 0:
|
||||
raise ValueError(f"n_total must be >= 0, got {n_total}")
|
||||
self._n_samples = int(n_samples)
|
||||
self._n_overlap = int(n_overlap)
|
||||
del n_samples, n_overlap
|
||||
if n_total < self._n_samples:
|
||||
raise ValueError(
|
||||
f"Number of samples per window ({self._n_samples}) must be at "
|
||||
f"most the total number of samples ({n_total})"
|
||||
)
|
||||
if not callable(process):
|
||||
raise TypeError(f"process must be callable, got type {type(process)}")
|
||||
self._process = process
|
||||
self._step = self._n_samples - self._n_overlap
|
||||
self._store = _check_store(store)
|
||||
self._idx = 0
|
||||
self._in_buffers = self._out_buffers = None
|
||||
|
||||
# Create our window boundaries
|
||||
window_name = window if isinstance(window, str) else "custom"
|
||||
self._window = get_window(
|
||||
window, self._n_samples, fftbins=(self._n_samples - 1) % 2
|
||||
)
|
||||
self._window /= _check_cola(
|
||||
self._window, self._n_samples, self._step, window_name, tol=tol
|
||||
)
|
||||
self.starts = np.arange(0, n_total - self._n_samples + 1, self._step)
|
||||
self.stops = self.starts + self._n_samples
|
||||
delta = n_total - self.stops[-1]
|
||||
self.stops[-1] = n_total
|
||||
sfreq = float(sfreq)
|
||||
pl = "s" if len(self.starts) != 1 else ""
|
||||
logger.info(
|
||||
f" Processing {len(self.starts):4d} data chunk{pl} of (at least) "
|
||||
f"{self._n_samples / sfreq:0.1f} s with "
|
||||
f"{self._n_overlap / sfreq:0.1f} s overlap and {window_name} windowing"
|
||||
)
|
||||
del window, window_name
|
||||
if delta > 0:
|
||||
logger.info(
|
||||
f" The final {delta / sfreq} s will be lumped into the final window"
|
||||
)
|
||||
|
||||
@property
|
||||
def _in_offset(self):
|
||||
"""Compute from current processing window start and buffer len."""
|
||||
return self.starts[self._idx] + self._in_buffers[0].shape[-1]
|
||||
|
||||
@verbose
|
||||
def feed(self, *datas, verbose=None, **kwargs):
|
||||
"""Pass in a chunk of data."""
|
||||
# Append to our input buffer
|
||||
if self._in_buffers is None:
|
||||
self._in_buffers = [None] * len(datas)
|
||||
if len(datas) != len(self._in_buffers):
|
||||
raise ValueError(
|
||||
f"Got {len(datas)} array(s), needed {len(self._in_buffers)}"
|
||||
)
|
||||
for di, data in enumerate(datas):
|
||||
if not isinstance(data, np.ndarray) or data.ndim < 1:
|
||||
raise TypeError(
|
||||
f"data entry {di} must be an 2D ndarray, got {type(data)}"
|
||||
)
|
||||
if self._in_buffers[di] is None:
|
||||
# In practice, users can give large chunks, so we use
|
||||
# dynamic allocation of the in buffer. We could save some
|
||||
# memory allocation by only ever processing max_len at once,
|
||||
# but this would increase code complexity.
|
||||
self._in_buffers[di] = np.empty(data.shape[:-1] + (0,), data.dtype)
|
||||
if (
|
||||
data.shape[:-1] != self._in_buffers[di].shape[:-1]
|
||||
or self._in_buffers[di].dtype != data.dtype
|
||||
):
|
||||
raise TypeError(
|
||||
f"data must dtype {self._in_buffers[di].dtype} and "
|
||||
f"shape[:-1]=={self._in_buffers[di].shape[:-1]}, got dtype "
|
||||
f"{data.dtype} shape[:-1]={data.shape[:-1]}"
|
||||
)
|
||||
logger.debug(
|
||||
f" + Appending {self._in_offset:d}->"
|
||||
f"{self._in_offset + data.shape[-1]:d}"
|
||||
)
|
||||
self._in_buffers[di] = np.concatenate([self._in_buffers[di], data], -1)
|
||||
if self._in_offset > self.stops[-1]:
|
||||
raise ValueError(
|
||||
f"data (shape {data.shape}) exceeded expected total buffer size ("
|
||||
f"{self._in_offset} > {self.stops[-1]})"
|
||||
)
|
||||
# Check to see if we can process the next chunk and dump outputs
|
||||
while self._idx < len(self.starts) and self._in_offset >= self.stops[self._idx]:
|
||||
start, stop = self.starts[self._idx], self.stops[self._idx]
|
||||
this_len = stop - start
|
||||
this_window = self._window.copy()
|
||||
if self._idx == len(self.starts) - 1:
|
||||
this_window = np.pad(
|
||||
self._window, (0, this_len - len(this_window)), "constant"
|
||||
)
|
||||
for offset in range(self._step, len(this_window), self._step):
|
||||
n_use = len(this_window) - offset
|
||||
this_window[offset:] += self._window[:n_use]
|
||||
if self._idx == 0:
|
||||
for offset in range(self._n_samples - self._step, 0, -self._step):
|
||||
this_window[:offset] += self._window[-offset:]
|
||||
logger.debug(f" * Processing {start}->{stop}")
|
||||
this_proc = [in_[..., :this_len].copy() for in_ in self._in_buffers]
|
||||
if not all(
|
||||
proc.shape[-1] == this_len == this_window.size for proc in this_proc
|
||||
):
|
||||
raise RuntimeError("internal indexing error")
|
||||
outs = self._process(*this_proc, **kwargs)
|
||||
if self._out_buffers is None:
|
||||
max_len = np.max(self.stops - self.starts)
|
||||
self._out_buffers = [
|
||||
np.zeros(o.shape[:-1] + (max_len,), o.dtype) for o in outs
|
||||
]
|
||||
for oi, out in enumerate(outs):
|
||||
out *= this_window
|
||||
self._out_buffers[oi][..., : stop - start] += out
|
||||
self._idx += 1
|
||||
if self._idx < len(self.starts):
|
||||
next_start = self.starts[self._idx]
|
||||
else:
|
||||
next_start = self.stops[-1]
|
||||
delta = next_start - self.starts[self._idx - 1]
|
||||
for di in range(len(self._in_buffers)):
|
||||
self._in_buffers[di] = self._in_buffers[di][..., delta:]
|
||||
logger.debug(f" - Shifting input/output buffers by {delta:d} samples")
|
||||
self._store(*[o[..., :delta] for o in self._out_buffers])
|
||||
for ob in self._out_buffers:
|
||||
ob[..., :-delta] = ob[..., delta:]
|
||||
ob[..., -delta:] = 0.0
|
||||
|
||||
|
||||
def _check_cola(win, nperseg, step, window_name, tol=1e-10):
|
||||
"""Check whether the Constant OverLap Add (COLA) constraint is met."""
|
||||
# adapted from SciPy
|
||||
binsums = np.sum(
|
||||
[win[ii * step : (ii + 1) * step] for ii in range(nperseg // step)], axis=0
|
||||
)
|
||||
if nperseg % step != 0:
|
||||
binsums[: nperseg % step] += win[-(nperseg % step) :]
|
||||
const = np.median(binsums)
|
||||
deviation = np.max(np.abs(binsums - const))
|
||||
if deviation > tol:
|
||||
raise ValueError(
|
||||
f"segment length {nperseg:d} with step {step:d} for {window_name} window "
|
||||
"type does not provide a constant output "
|
||||
f"({100 * deviation / const:g}% deviation)"
|
||||
)
|
||||
return const
|
||||
|
||||
|
||||
class _Storer:
|
||||
"""Store data in chunks."""
|
||||
|
||||
def __init__(self, *outs, picks=None):
|
||||
for oi, out in enumerate(outs):
|
||||
if not isinstance(out, np.ndarray) or out.ndim < 1:
|
||||
raise TypeError(f"outs[oi] must be >= 1D ndarray, got {out}")
|
||||
self.outs = outs
|
||||
self.idx = 0
|
||||
self.picks = picks
|
||||
|
||||
def __call__(self, *outs):
|
||||
if len(outs) != len(self.outs) or not all(
|
||||
out.shape[-1] == outs[0].shape[-1] for out in outs
|
||||
):
|
||||
raise ValueError("Bad outs")
|
||||
idx = (Ellipsis,)
|
||||
if self.picks is not None:
|
||||
idx += (self.picks,)
|
||||
stop = self.idx + outs[0].shape[-1]
|
||||
idx += (slice(self.idx, stop),)
|
||||
for o1, o2 in zip(self.outs, outs):
|
||||
o1[idx] = o2
|
||||
self.idx = stop
|
||||
1736
mne/annotations.py
Normal file
224
mne/baseline.py
Normal file
@@ -0,0 +1,224 @@
|
||||
"""Utility functions to baseline-correct data."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .utils import _check_option, _validate_type, logger, verbose
|
||||
|
||||
|
||||
def _log_rescale(baseline, mode="mean"):
|
||||
"""Log the rescaling method."""
|
||||
if baseline is not None:
|
||||
_check_option(
|
||||
"mode",
|
||||
mode,
|
||||
["logratio", "ratio", "zscore", "mean", "percent", "zlogratio"],
|
||||
)
|
||||
msg = f"Applying baseline correction (mode: {mode})"
|
||||
else:
|
||||
msg = "No baseline correction applied"
|
||||
return msg
|
||||
|
||||
|
||||
@verbose
|
||||
def rescale(data, times, baseline, mode="mean", copy=True, picks=None, verbose=None):
|
||||
"""Rescale (baseline correct) data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
data : array
|
||||
It can be of any shape. The only constraint is that the last
|
||||
dimension should be time.
|
||||
times : 1D array
|
||||
Time instants is seconds.
|
||||
%(baseline_rescale)s
|
||||
mode : 'mean' | 'ratio' | 'logratio' | 'percent' | 'zscore' | 'zlogratio'
|
||||
Perform baseline correction by
|
||||
|
||||
- subtracting the mean of baseline values ('mean')
|
||||
- dividing by the mean of baseline values ('ratio')
|
||||
- dividing by the mean of baseline values and taking the log
|
||||
('logratio')
|
||||
- subtracting the mean of baseline values followed by dividing by
|
||||
the mean of baseline values ('percent')
|
||||
- subtracting the mean of baseline values and dividing by the
|
||||
standard deviation of baseline values ('zscore')
|
||||
- dividing by the mean of baseline values, taking the log, and
|
||||
dividing by the standard deviation of log baseline values
|
||||
('zlogratio')
|
||||
|
||||
copy : bool
|
||||
Whether to return a new instance or modify in place.
|
||||
picks : list of int | None
|
||||
Data to process along the axis=-2 (None, default, processes all).
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
data_scaled: array
|
||||
Array of same shape as data after rescaling.
|
||||
"""
|
||||
if copy:
|
||||
data = data.copy()
|
||||
if verbose is not False:
|
||||
msg = _log_rescale(baseline, mode)
|
||||
logger.info(msg)
|
||||
if baseline is None or data.shape[-1] == 0:
|
||||
return data
|
||||
|
||||
bmin, bmax = baseline
|
||||
if bmin is None:
|
||||
imin = 0
|
||||
else:
|
||||
imin = np.where(times >= bmin)[0]
|
||||
if len(imin) == 0:
|
||||
raise ValueError(
|
||||
f"bmin is too large ({bmin}), it exceeds the largest time value"
|
||||
)
|
||||
imin = int(imin[0])
|
||||
if bmax is None:
|
||||
imax = len(times)
|
||||
else:
|
||||
imax = np.where(times <= bmax)[0]
|
||||
if len(imax) == 0:
|
||||
raise ValueError(
|
||||
f"bmax is too small ({bmax}), it is smaller than the smallest time "
|
||||
"value"
|
||||
)
|
||||
imax = int(imax[-1]) + 1
|
||||
if imin >= imax:
|
||||
raise ValueError(
|
||||
f"Bad rescaling slice ({imin}:{imax}) from time values {bmin}, {bmax}"
|
||||
)
|
||||
|
||||
# technically this is inefficient when `picks` is given, but assuming
|
||||
# that we generally pick most channels for rescaling, it's not so bad
|
||||
mean = np.mean(data[..., imin:imax], axis=-1, keepdims=True)
|
||||
|
||||
if mode == "mean":
|
||||
|
||||
def fun(d, m):
|
||||
d -= m
|
||||
|
||||
elif mode == "ratio":
|
||||
|
||||
def fun(d, m):
|
||||
d /= m
|
||||
|
||||
elif mode == "logratio":
|
||||
|
||||
def fun(d, m):
|
||||
d /= m
|
||||
np.log10(d, out=d)
|
||||
|
||||
elif mode == "percent":
|
||||
|
||||
def fun(d, m):
|
||||
d -= m
|
||||
d /= m
|
||||
|
||||
elif mode == "zscore":
|
||||
|
||||
def fun(d, m):
|
||||
d -= m
|
||||
d /= np.std(d[..., imin:imax], axis=-1, keepdims=True)
|
||||
|
||||
elif mode == "zlogratio":
|
||||
|
||||
def fun(d, m):
|
||||
d /= m
|
||||
np.log10(d, out=d)
|
||||
d /= np.std(d[..., imin:imax], axis=-1, keepdims=True)
|
||||
|
||||
if picks is None:
|
||||
fun(data, mean)
|
||||
else:
|
||||
for pi in picks:
|
||||
fun(data[..., pi, :], mean[..., pi, :])
|
||||
return data
|
||||
|
||||
|
||||
def _check_baseline(baseline, times, sfreq, on_baseline_outside_data="raise"):
|
||||
"""Check if the baseline is valid and adjust it if requested.
|
||||
|
||||
``None`` values inside ``baseline`` will be replaced with ``times[0]`` and
|
||||
``times[-1]``.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
baseline : array-like, shape (2,) | None
|
||||
Beginning and end of the baseline period, in seconds. If ``None``,
|
||||
assume no baseline and return immediately.
|
||||
times : array
|
||||
The time points.
|
||||
sfreq : float
|
||||
The sampling rate.
|
||||
on_baseline_outside_data : 'raise' | 'info' | 'adjust'
|
||||
What to do if the baseline period exceeds the data.
|
||||
If ``'raise'``, raise an exception (default).
|
||||
If ``'info'``, log an info message.
|
||||
If ``'adjust'``, adjust the baseline such that it is within the data range.
|
||||
|
||||
Returns
|
||||
-------
|
||||
(baseline_tmin, baseline_tmax) | None
|
||||
The baseline with ``None`` values replaced with times, and with adjusted times
|
||||
if ``on_baseline_outside_data='adjust'``; or ``None``, if ``baseline`` is
|
||||
``None``.
|
||||
"""
|
||||
if baseline is None:
|
||||
return None
|
||||
|
||||
_validate_type(baseline, "array-like")
|
||||
baseline = tuple(baseline)
|
||||
|
||||
if len(baseline) != 2:
|
||||
raise ValueError(
|
||||
f"baseline must have exactly two elements (got {len(baseline)})."
|
||||
)
|
||||
|
||||
tmin, tmax = times[0], times[-1]
|
||||
tstep = 1.0 / float(sfreq)
|
||||
|
||||
# check default value of baseline and `tmin=0`
|
||||
if baseline == (None, 0) and tmin == 0:
|
||||
raise ValueError(
|
||||
"Baseline interval is only one sample. Use `baseline=(0, 0)` if this is "
|
||||
"desired."
|
||||
)
|
||||
|
||||
baseline_tmin, baseline_tmax = baseline
|
||||
|
||||
if baseline_tmin is None:
|
||||
baseline_tmin = tmin
|
||||
baseline_tmin = float(baseline_tmin)
|
||||
|
||||
if baseline_tmax is None:
|
||||
baseline_tmax = tmax
|
||||
baseline_tmax = float(baseline_tmax)
|
||||
|
||||
if baseline_tmin > baseline_tmax:
|
||||
raise ValueError(
|
||||
f"Baseline min ({baseline_tmin}) must be less than baseline max ("
|
||||
f"{baseline_tmax})"
|
||||
)
|
||||
|
||||
if (baseline_tmin < tmin - tstep) or (baseline_tmax > tmax + tstep):
|
||||
msg = (
|
||||
f"Baseline interval [{baseline_tmin}, {baseline_tmax}] s is outside of "
|
||||
f"epochs data [{tmin}, {tmax}] s. Epochs were probably cropped."
|
||||
)
|
||||
if on_baseline_outside_data == "raise":
|
||||
raise ValueError(msg)
|
||||
elif on_baseline_outside_data == "info":
|
||||
logger.info(msg)
|
||||
elif on_baseline_outside_data == "adjust":
|
||||
if baseline_tmin < tmin - tstep:
|
||||
baseline_tmin = tmin
|
||||
if baseline_tmax > tmax + tstep:
|
||||
baseline_tmax = tmax
|
||||
|
||||
return baseline_tmin, baseline_tmax
|
||||
8
mne/beamformer/__init__.py
Normal file
@@ -0,0 +1,8 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
"""Beamformers for source localization."""
|
||||
import lazy_loader as lazy
|
||||
|
||||
(__getattr__, __dir__, __all__) = lazy.attach_stub(__name__, __file__)
|
||||
34
mne/beamformer/__init__.pyi
Normal file
@@ -0,0 +1,34 @@
|
||||
__all__ = [
|
||||
"Beamformer",
|
||||
"apply_dics",
|
||||
"apply_dics_csd",
|
||||
"apply_dics_epochs",
|
||||
"apply_dics_tfr_epochs",
|
||||
"apply_lcmv",
|
||||
"apply_lcmv_cov",
|
||||
"apply_lcmv_epochs",
|
||||
"apply_lcmv_raw",
|
||||
"make_dics",
|
||||
"make_lcmv",
|
||||
"make_lcmv_resolution_matrix",
|
||||
"rap_music",
|
||||
"read_beamformer",
|
||||
"trap_music",
|
||||
]
|
||||
from ._compute_beamformer import Beamformer, read_beamformer
|
||||
from ._dics import (
|
||||
apply_dics,
|
||||
apply_dics_csd,
|
||||
apply_dics_epochs,
|
||||
apply_dics_tfr_epochs,
|
||||
make_dics,
|
||||
)
|
||||
from ._lcmv import (
|
||||
apply_lcmv,
|
||||
apply_lcmv_cov,
|
||||
apply_lcmv_epochs,
|
||||
apply_lcmv_raw,
|
||||
make_lcmv,
|
||||
)
|
||||
from ._rap_music import rap_music, trap_music
|
||||
from .resolution_matrix import make_lcmv_resolution_matrix
|
||||
603
mne/beamformer/_compute_beamformer.py
Normal file
@@ -0,0 +1,603 @@
|
||||
"""Functions shared between different beamformer types."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
from copy import deepcopy
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .._fiff.proj import Projection, make_projector
|
||||
from ..cov import Covariance, make_ad_hoc_cov
|
||||
from ..forward.forward import _restrict_forward_to_src_sel, is_fixed_orient
|
||||
from ..minimum_norm.inverse import _get_vertno, _prepare_forward
|
||||
from ..source_space._source_space import label_src_vertno_sel
|
||||
from ..time_frequency.csd import CrossSpectralDensity
|
||||
from ..utils import (
|
||||
_check_option,
|
||||
_check_src_normal,
|
||||
_import_h5io_funcs,
|
||||
_pl,
|
||||
_reg_pinv,
|
||||
_sym_mat_pow,
|
||||
check_fname,
|
||||
logger,
|
||||
verbose,
|
||||
warn,
|
||||
)
|
||||
|
||||
|
||||
def _check_proj_match(proj, filters):
|
||||
"""Check whether SSP projections in data and spatial filter match."""
|
||||
proj_data, _, _ = make_projector(proj, filters["ch_names"])
|
||||
if not np.allclose(
|
||||
proj_data, filters["proj"], atol=np.finfo(float).eps, rtol=1e-13
|
||||
):
|
||||
raise ValueError(
|
||||
"The SSP projections present in the data "
|
||||
"do not match the projections used when "
|
||||
"calculating the spatial filter."
|
||||
)
|
||||
|
||||
|
||||
def _check_src_type(filters):
|
||||
"""Check whether src_type is in filters and set custom warning."""
|
||||
if "src_type" not in filters:
|
||||
filters["src_type"] = None
|
||||
warn_text = (
|
||||
"The spatial filter does not contain src_type and a robust "
|
||||
"guess of src_type is not possible without src. Consider "
|
||||
"recomputing the filter."
|
||||
)
|
||||
return filters, warn_text
|
||||
|
||||
|
||||
def _prepare_beamformer_input(
|
||||
info,
|
||||
forward,
|
||||
label=None,
|
||||
pick_ori=None,
|
||||
noise_cov=None,
|
||||
rank=None,
|
||||
pca=False,
|
||||
loose=None,
|
||||
combine_xyz="fro",
|
||||
exp=None,
|
||||
limit=None,
|
||||
allow_fixed_depth=True,
|
||||
limit_depth_chs=False,
|
||||
):
|
||||
"""Input preparation common for LCMV, DICS, and RAP-MUSIC."""
|
||||
_check_option("pick_ori", pick_ori, ("normal", "max-power", "vector", None))
|
||||
|
||||
# Restrict forward solution to selected vertices
|
||||
if label is not None:
|
||||
_, src_sel = label_src_vertno_sel(label, forward["src"])
|
||||
forward = _restrict_forward_to_src_sel(forward, src_sel)
|
||||
|
||||
if loose is None:
|
||||
loose = 0.0 if is_fixed_orient(forward) else 1.0
|
||||
# TODO: Deduplicate with _check_one_ch_type, should not be necessary
|
||||
# (DICS hits this code path, LCMV does not)
|
||||
if noise_cov is None:
|
||||
noise_cov = make_ad_hoc_cov(info, std=1.0)
|
||||
(
|
||||
forward,
|
||||
info_picked,
|
||||
gain,
|
||||
_,
|
||||
orient_prior,
|
||||
_,
|
||||
trace_GRGT,
|
||||
noise_cov,
|
||||
whitener,
|
||||
) = _prepare_forward(
|
||||
forward,
|
||||
info,
|
||||
noise_cov,
|
||||
"auto",
|
||||
loose,
|
||||
rank=rank,
|
||||
pca=pca,
|
||||
use_cps=True,
|
||||
exp=exp,
|
||||
limit_depth_chs=limit_depth_chs,
|
||||
combine_xyz=combine_xyz,
|
||||
limit=limit,
|
||||
allow_fixed_depth=allow_fixed_depth,
|
||||
)
|
||||
is_free_ori = not is_fixed_orient(forward) # could have been changed
|
||||
nn = forward["source_nn"]
|
||||
if is_free_ori: # take Z coordinate
|
||||
nn = nn[2::3]
|
||||
nn = nn.copy()
|
||||
vertno = _get_vertno(forward["src"])
|
||||
if forward["surf_ori"]:
|
||||
nn[...] = [0, 0, 1] # align to local +Z coordinate
|
||||
if pick_ori is not None and not is_free_ori:
|
||||
raise ValueError(
|
||||
f"Normal or max-power orientation (got {pick_ori!r}) can only be picked "
|
||||
"when a forward operator with free orientation is used."
|
||||
)
|
||||
if pick_ori == "normal" and not forward["surf_ori"]:
|
||||
raise ValueError(
|
||||
"Normal orientation can only be picked when a forward operator oriented in "
|
||||
"surface coordinates is used."
|
||||
)
|
||||
_check_src_normal(pick_ori, forward["src"])
|
||||
del forward, info
|
||||
|
||||
# Undo the scaling that MNE prefers
|
||||
scale = np.sqrt((noise_cov["eig"] > 0).sum() / trace_GRGT)
|
||||
gain /= scale
|
||||
if orient_prior is not None:
|
||||
orient_std = np.sqrt(orient_prior)
|
||||
else:
|
||||
orient_std = np.ones(gain.shape[1])
|
||||
|
||||
# Get the projector
|
||||
proj, _, _ = make_projector(info_picked["projs"], info_picked["ch_names"])
|
||||
return (is_free_ori, info_picked, proj, vertno, gain, whitener, nn, orient_std)
|
||||
|
||||
|
||||
def _reduce_leadfield_rank(G):
|
||||
"""Reduce the rank of the leadfield."""
|
||||
# decompose lead field
|
||||
u, s, v = np.linalg.svd(G, full_matrices=False)
|
||||
|
||||
# backproject, omitting one direction (equivalent to setting the smallest
|
||||
# singular value to zero)
|
||||
G = np.matmul(u[:, :, :-1], s[:, :-1, np.newaxis] * v[:, :-1, :])
|
||||
|
||||
return G
|
||||
|
||||
|
||||
def _sym_inv_sm(x, reduce_rank, inversion, sk):
|
||||
"""Symmetric inversion with single- or matrix-style inversion."""
|
||||
if x.shape[1:] == (1, 1):
|
||||
with np.errstate(divide="ignore", invalid="ignore"):
|
||||
x_inv = 1.0 / x
|
||||
x_inv[~np.isfinite(x_inv)] = 1.0
|
||||
else:
|
||||
assert x.shape[1:] == (3, 3)
|
||||
if inversion == "matrix":
|
||||
x_inv = _sym_mat_pow(x, -1, reduce_rank=reduce_rank)
|
||||
# Reapply source covariance after inversion
|
||||
x_inv *= sk[:, :, np.newaxis]
|
||||
x_inv *= sk[:, np.newaxis, :]
|
||||
else:
|
||||
# Invert for each dipole separately using plain division
|
||||
diags = np.diagonal(x, axis1=1, axis2=2)
|
||||
assert not reduce_rank # guaranteed earlier
|
||||
with np.errstate(divide="ignore"):
|
||||
diags = 1.0 / diags
|
||||
# set the diagonal of each 3x3
|
||||
x_inv = np.zeros_like(x)
|
||||
for k in range(x.shape[0]):
|
||||
this = diags[k]
|
||||
# Reapply source covariance after inversion
|
||||
this *= sk[k] * sk[k]
|
||||
x_inv[k].flat[::4] = this
|
||||
return x_inv
|
||||
|
||||
|
||||
def _compute_beamformer(
|
||||
G,
|
||||
Cm,
|
||||
reg,
|
||||
n_orient,
|
||||
weight_norm,
|
||||
pick_ori,
|
||||
reduce_rank,
|
||||
rank,
|
||||
inversion,
|
||||
nn,
|
||||
orient_std,
|
||||
whitener,
|
||||
):
|
||||
"""Compute a spatial beamformer filter (LCMV or DICS).
|
||||
|
||||
For more detailed information on the parameters, see the docstrings of
|
||||
`make_lcmv` and `make_dics`.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
G : ndarray, shape (n_dipoles, n_channels)
|
||||
The leadfield.
|
||||
Cm : ndarray, shape (n_channels, n_channels)
|
||||
The data covariance matrix.
|
||||
reg : float
|
||||
Regularization parameter.
|
||||
n_orient : int
|
||||
Number of dipole orientations defined at each source point
|
||||
weight_norm : None | 'unit-noise-gain' | 'nai'
|
||||
The weight normalization scheme to use.
|
||||
pick_ori : None | 'normal' | 'max-power'
|
||||
The source orientation to compute the beamformer in.
|
||||
reduce_rank : bool
|
||||
Whether to reduce the rank by one during computation of the filter.
|
||||
rank : dict | None | 'full' | 'info'
|
||||
See compute_rank.
|
||||
inversion : 'matrix' | 'single'
|
||||
The inversion scheme to compute the weights.
|
||||
nn : ndarray, shape (n_dipoles, 3)
|
||||
The source normals.
|
||||
orient_std : ndarray, shape (n_dipoles,)
|
||||
The std of the orientation prior used in weighting the lead fields.
|
||||
whitener : ndarray, shape (n_channels, n_channels)
|
||||
The whitener.
|
||||
|
||||
Returns
|
||||
-------
|
||||
W : ndarray, shape (n_dipoles, n_channels)
|
||||
The beamformer filter weights.
|
||||
"""
|
||||
_check_option(
|
||||
"weight_norm",
|
||||
weight_norm,
|
||||
["unit-noise-gain-invariant", "unit-noise-gain", "nai", None],
|
||||
)
|
||||
|
||||
# Whiten the data covariance
|
||||
Cm = whitener @ Cm @ whitener.T.conj()
|
||||
# Restore to properly Hermitian as large whitening coefs can have bad
|
||||
# rounding error
|
||||
Cm[:] = (Cm + Cm.T.conj()) / 2.0
|
||||
|
||||
assert Cm.shape == (G.shape[0],) * 2
|
||||
s, _ = np.linalg.eigh(Cm)
|
||||
if not (s >= -s.max() * 1e-7).all():
|
||||
# This shouldn't ever happen, but just in case
|
||||
warn(
|
||||
"data covariance does not appear to be positive semidefinite, "
|
||||
"results will likely be incorrect"
|
||||
)
|
||||
# Tikhonov regularization using reg parameter to control for
|
||||
# trade-off between spatial resolution and noise sensitivity
|
||||
# eq. 25 in Gross and Ioannides, 1999 Phys. Med. Biol. 44 2081
|
||||
Cm_inv, loading_factor, rank = _reg_pinv(Cm, reg, rank)
|
||||
|
||||
assert orient_std.shape == (G.shape[1],)
|
||||
n_sources = G.shape[1] // n_orient
|
||||
assert nn.shape == (n_sources, 3)
|
||||
|
||||
logger.info(f"Computing beamformer filters for {n_sources} source{_pl(n_sources)}")
|
||||
n_channels = G.shape[0]
|
||||
assert n_orient in (3, 1)
|
||||
Gk = np.reshape(G.T, (n_sources, n_orient, n_channels)).transpose(0, 2, 1)
|
||||
assert Gk.shape == (n_sources, n_channels, n_orient)
|
||||
sk = np.reshape(orient_std, (n_sources, n_orient))
|
||||
del G, orient_std
|
||||
|
||||
_check_option("reduce_rank", reduce_rank, (True, False))
|
||||
|
||||
# inversion of the denominator
|
||||
_check_option("inversion", inversion, ("matrix", "single"))
|
||||
if (
|
||||
inversion == "single"
|
||||
and n_orient > 1
|
||||
and pick_ori == "vector"
|
||||
and weight_norm == "unit-noise-gain-invariant"
|
||||
):
|
||||
raise ValueError(
|
||||
'Cannot use pick_ori="vector" with inversion="single" and '
|
||||
'weight_norm="unit-noise-gain-invariant"'
|
||||
)
|
||||
if reduce_rank and inversion == "single":
|
||||
raise ValueError(
|
||||
'reduce_rank cannot be used with inversion="single"; '
|
||||
'consider using inversion="matrix" if you have a '
|
||||
"rank-deficient forward model (i.e., from a sphere "
|
||||
"model with MEG channels), otherwise consider using "
|
||||
"reduce_rank=False"
|
||||
)
|
||||
if n_orient > 1:
|
||||
_, Gk_s, _ = np.linalg.svd(Gk, full_matrices=False)
|
||||
assert Gk_s.shape == (n_sources, n_orient)
|
||||
if not reduce_rank and (Gk_s[:, 0] > 1e6 * Gk_s[:, 2]).any():
|
||||
raise ValueError(
|
||||
"Singular matrix detected when estimating spatial filters. "
|
||||
"Consider reducing the rank of the forward operator by using "
|
||||
"reduce_rank=True."
|
||||
)
|
||||
del Gk_s
|
||||
|
||||
#
|
||||
# 1. Reduce rank of the lead field
|
||||
#
|
||||
if reduce_rank:
|
||||
Gk = _reduce_leadfield_rank(Gk)
|
||||
|
||||
def _compute_bf_terms(Gk, Cm_inv):
|
||||
bf_numer = np.matmul(Gk.swapaxes(-2, -1).conj(), Cm_inv)
|
||||
bf_denom = np.matmul(bf_numer, Gk)
|
||||
return bf_numer, bf_denom
|
||||
|
||||
#
|
||||
# 2. Reorient lead field in direction of max power or normal
|
||||
#
|
||||
if pick_ori == "max-power":
|
||||
assert n_orient == 3
|
||||
_, bf_denom = _compute_bf_terms(Gk, Cm_inv)
|
||||
if weight_norm is None:
|
||||
ori_numer = np.eye(n_orient)[np.newaxis]
|
||||
ori_denom = bf_denom
|
||||
else:
|
||||
# compute power, cf Sekihara & Nagarajan 2008, eq. 4.47
|
||||
ori_numer = bf_denom
|
||||
# Cm_inv should be Hermitian so no need for .T.conj()
|
||||
ori_denom = np.matmul(
|
||||
np.matmul(Gk.swapaxes(-2, -1).conj(), Cm_inv @ Cm_inv), Gk
|
||||
)
|
||||
ori_denom_inv = _sym_inv_sm(ori_denom, reduce_rank, inversion, sk)
|
||||
ori_pick = np.matmul(ori_denom_inv, ori_numer)
|
||||
assert ori_pick.shape == (n_sources, n_orient, n_orient)
|
||||
|
||||
# pick eigenvector that corresponds to maximum eigenvalue:
|
||||
eig_vals, eig_vecs = np.linalg.eig(ori_pick.real) # not Hermitian!
|
||||
# sort eigenvectors by eigenvalues for picking:
|
||||
order = np.argsort(np.abs(eig_vals), axis=-1)
|
||||
# eig_vals = np.take_along_axis(eig_vals, order, axis=-1)
|
||||
max_power_ori = eig_vecs[np.arange(len(eig_vecs)), :, order[:, -1]]
|
||||
assert max_power_ori.shape == (n_sources, n_orient)
|
||||
|
||||
# set the (otherwise arbitrary) sign to match the normal
|
||||
signs = np.sign(np.sum(max_power_ori * nn, axis=1, keepdims=True))
|
||||
signs[signs == 0] = 1.0
|
||||
max_power_ori *= signs
|
||||
|
||||
# Compute the lead field for the optimal orientation,
|
||||
# and adjust numer/denom
|
||||
Gk = np.matmul(Gk, max_power_ori[..., np.newaxis])
|
||||
n_orient = 1
|
||||
else:
|
||||
max_power_ori = None
|
||||
if pick_ori == "normal":
|
||||
Gk = Gk[..., 2:3]
|
||||
n_orient = 1
|
||||
|
||||
#
|
||||
# 3. Compute numerator and denominator of beamformer formula (unit-gain)
|
||||
#
|
||||
|
||||
bf_numer, bf_denom = _compute_bf_terms(Gk, Cm_inv)
|
||||
assert bf_denom.shape == (n_sources,) + (n_orient,) * 2
|
||||
assert bf_numer.shape == (n_sources, n_orient, n_channels)
|
||||
del Gk # lead field has been adjusted and should not be used anymore
|
||||
|
||||
#
|
||||
# 4. Invert the denominator
|
||||
#
|
||||
|
||||
# Here W is W_ug, i.e.:
|
||||
# G.T @ Cm_inv / (G.T @ Cm_inv @ G)
|
||||
bf_denom_inv = _sym_inv_sm(bf_denom, reduce_rank, inversion, sk)
|
||||
assert bf_denom_inv.shape == (n_sources, n_orient, n_orient)
|
||||
W = np.matmul(bf_denom_inv, bf_numer)
|
||||
assert W.shape == (n_sources, n_orient, n_channels)
|
||||
del bf_denom_inv, sk
|
||||
|
||||
#
|
||||
# 5. Re-scale filter weights according to the selected weight_norm
|
||||
#
|
||||
|
||||
# Weight normalization is done by computing, for each source::
|
||||
#
|
||||
# W_ung = W_ug / sqrt(W_ug @ W_ug.T)
|
||||
#
|
||||
# with W_ung referring to the unit-noise-gain (weight normalized) filter
|
||||
# and W_ug referring to the above-calculated unit-gain filter stored in W.
|
||||
|
||||
if weight_norm is not None:
|
||||
# Three different ways to calculate the normalization factors here.
|
||||
# Only matters when in vector mode, as otherwise n_orient == 1 and
|
||||
# they are all equivalent.
|
||||
#
|
||||
# In MNE < 0.21, we just used the Frobenius matrix norm:
|
||||
#
|
||||
# noise_norm = np.linalg.norm(W, axis=(1, 2), keepdims=True)
|
||||
# assert noise_norm.shape == (n_sources, 1, 1)
|
||||
# W /= noise_norm
|
||||
#
|
||||
# Sekihara 2008 says to use sqrt(diag(W_ug @ W_ug.T)), which is not
|
||||
# rotation invariant:
|
||||
if weight_norm in ("unit-noise-gain", "nai"):
|
||||
noise_norm = np.matmul(W, W.swapaxes(-2, -1).conj()).real
|
||||
noise_norm = np.reshape( # np.diag operation over last two axes
|
||||
noise_norm, (n_sources, -1, 1)
|
||||
)[:, :: n_orient + 1]
|
||||
np.sqrt(noise_norm, out=noise_norm)
|
||||
noise_norm[noise_norm == 0] = np.inf
|
||||
assert noise_norm.shape == (n_sources, n_orient, 1)
|
||||
W /= noise_norm
|
||||
else:
|
||||
assert weight_norm == "unit-noise-gain-invariant"
|
||||
# Here we use sqrtm. The shortcut:
|
||||
#
|
||||
# use = W
|
||||
#
|
||||
# ... does not match the direct route (it is rotated!), so we'll
|
||||
# use the direct one to match FieldTrip:
|
||||
use = bf_numer
|
||||
inner = np.matmul(use, use.swapaxes(-2, -1).conj())
|
||||
W = np.matmul(_sym_mat_pow(inner, -0.5), use)
|
||||
noise_norm = 1.0
|
||||
|
||||
if weight_norm == "nai":
|
||||
# Estimate noise level based on covariance matrix, taking the
|
||||
# first eigenvalue that falls outside the signal subspace or the
|
||||
# loading factor used during regularization, whichever is largest.
|
||||
if rank > len(Cm):
|
||||
# Covariance matrix is full rank, no noise subspace!
|
||||
# Use the loading factor as noise ceiling.
|
||||
if loading_factor == 0:
|
||||
raise RuntimeError(
|
||||
"Cannot compute noise subspace with a full-rank "
|
||||
"covariance matrix and no regularization. Try "
|
||||
"manually specifying the rank of the covariance "
|
||||
"matrix or using regularization."
|
||||
)
|
||||
noise = loading_factor
|
||||
else:
|
||||
noise, _ = np.linalg.eigh(Cm)
|
||||
noise = noise[-rank]
|
||||
noise = max(noise, loading_factor)
|
||||
W /= np.sqrt(noise)
|
||||
|
||||
W = W.reshape(n_sources * n_orient, n_channels)
|
||||
logger.info("Filter computation complete")
|
||||
return W, max_power_ori
|
||||
|
||||
|
||||
def _compute_power(Cm, W, n_orient):
|
||||
"""Use beamformer filters to compute source power.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
Cm : ndarray, shape (n_channels, n_channels)
|
||||
Data covariance matrix or CSD matrix.
|
||||
W : ndarray, shape (nvertices*norient, nchannels)
|
||||
Beamformer weights.
|
||||
|
||||
Returns
|
||||
-------
|
||||
power : ndarray, shape (nvertices,)
|
||||
Source power.
|
||||
"""
|
||||
n_sources = W.shape[0] // n_orient
|
||||
|
||||
Wk = W.reshape(n_sources, n_orient, W.shape[1])
|
||||
source_power = np.trace(
|
||||
(Wk @ Cm @ Wk.conj().transpose(0, 2, 1)).real, axis1=1, axis2=2
|
||||
)
|
||||
|
||||
return source_power
|
||||
|
||||
|
||||
class Beamformer(dict):
|
||||
"""A computed beamformer.
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 0.17
|
||||
"""
|
||||
|
||||
def copy(self):
|
||||
"""Copy the beamformer.
|
||||
|
||||
Returns
|
||||
-------
|
||||
beamformer : instance of Beamformer
|
||||
A deep copy of the beamformer.
|
||||
"""
|
||||
return deepcopy(self)
|
||||
|
||||
def __repr__(self): # noqa: D105
|
||||
n_verts = sum(len(v) for v in self["vertices"])
|
||||
n_channels = len(self["ch_names"])
|
||||
if self["subject"] is None:
|
||||
subject = "unknown"
|
||||
else:
|
||||
subject = f'"{self["subject"]}"'
|
||||
out = "<Beamformer | {}, subject {}, {} vert, {} ch".format(
|
||||
self["kind"],
|
||||
subject,
|
||||
n_verts,
|
||||
n_channels,
|
||||
)
|
||||
if self["pick_ori"] is not None:
|
||||
out += f', {self["pick_ori"]} ori'
|
||||
if self["weight_norm"] is not None:
|
||||
out += f', {self["weight_norm"]} norm'
|
||||
if self.get("inversion") is not None:
|
||||
out += f', {self["inversion"]} inversion'
|
||||
if "rank" in self:
|
||||
out += f', rank {self["rank"]}'
|
||||
out += ">"
|
||||
return out
|
||||
|
||||
@verbose
|
||||
def save(self, fname, overwrite=False, verbose=None):
|
||||
"""Save the beamformer filter.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like
|
||||
The filename to use to write the HDF5 data.
|
||||
Should end in ``'-lcmv.h5'`` or ``'-dics.h5'``.
|
||||
%(overwrite)s
|
||||
%(verbose)s
|
||||
"""
|
||||
_, write_hdf5 = _import_h5io_funcs()
|
||||
|
||||
ending = f'-{self["kind"].lower()}.h5'
|
||||
check_fname(fname, self["kind"], (ending,))
|
||||
csd_orig = None
|
||||
try:
|
||||
if "csd" in self:
|
||||
csd_orig = self["csd"]
|
||||
self["csd"] = self["csd"].__getstate__()
|
||||
write_hdf5(fname, self, overwrite=overwrite, title="mnepython")
|
||||
finally:
|
||||
if csd_orig is not None:
|
||||
self["csd"] = csd_orig
|
||||
|
||||
|
||||
def read_beamformer(fname):
|
||||
"""Read a beamformer filter.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : path-like
|
||||
The filename of the HDF5 file.
|
||||
|
||||
Returns
|
||||
-------
|
||||
filter : instance of Beamformer
|
||||
The beamformer filter.
|
||||
"""
|
||||
read_hdf5, _ = _import_h5io_funcs()
|
||||
beamformer = read_hdf5(fname, title="mnepython")
|
||||
if "csd" in beamformer:
|
||||
beamformer["csd"] = CrossSpectralDensity(**beamformer["csd"])
|
||||
# h5io seems to cast `bool` to `int` on round-trip, probably a bug
|
||||
# we should fix at some point (if possible -- could be HDF5 limitation)
|
||||
for key in ("normalize_fwd", "is_free_ori", "is_ssp"):
|
||||
if key in beamformer:
|
||||
beamformer[key] = bool(beamformer[key])
|
||||
for key in ("data_cov", "noise_cov"):
|
||||
if beamformer.get(key) is not None:
|
||||
for pi, p in enumerate(beamformer[key]["projs"]):
|
||||
p = Projection(**p)
|
||||
p["active"] = bool(p["active"])
|
||||
beamformer[key]["projs"][pi] = p
|
||||
beamformer[key] = Covariance(
|
||||
*[
|
||||
beamformer[key].get(arg)
|
||||
for arg in (
|
||||
"data",
|
||||
"names",
|
||||
"bads",
|
||||
"projs",
|
||||
"nfree",
|
||||
"eig",
|
||||
"eigvec",
|
||||
"method",
|
||||
"loglik",
|
||||
)
|
||||
]
|
||||
)
|
||||
return Beamformer(beamformer)
|
||||
|
||||
|
||||
def _proj_whiten_data(M, proj, filters):
|
||||
if filters.get("is_ssp", True):
|
||||
# check whether data and filter projs match
|
||||
_check_proj_match(proj, filters)
|
||||
if filters["whitener"] is None:
|
||||
M = np.dot(filters["proj"], M)
|
||||
|
||||
if filters["whitener"] is not None:
|
||||
M = np.dot(filters["whitener"], M)
|
||||
return M
|
||||
648
mne/beamformer/_dics.py
Normal file
@@ -0,0 +1,648 @@
|
||||
"""Dynamic Imaging of Coherent Sources (DICS)."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .._fiff.pick import pick_channels, pick_info
|
||||
from ..channels import equalize_channels
|
||||
from ..forward import _subject_from_forward
|
||||
from ..minimum_norm.inverse import _check_depth, _check_reference, combine_xyz
|
||||
from ..rank import compute_rank
|
||||
from ..source_estimate import _get_src_type, _make_stc
|
||||
from ..time_frequency import EpochsTFR
|
||||
from ..time_frequency.tfr import _check_tfr_complex
|
||||
from ..utils import (
|
||||
_check_channels_spatial_filter,
|
||||
_check_one_ch_type,
|
||||
_check_option,
|
||||
_check_rank,
|
||||
_validate_type,
|
||||
logger,
|
||||
verbose,
|
||||
warn,
|
||||
)
|
||||
from ._compute_beamformer import (
|
||||
Beamformer,
|
||||
_check_src_type,
|
||||
_compute_beamformer,
|
||||
_compute_power,
|
||||
_prepare_beamformer_input,
|
||||
_proj_whiten_data,
|
||||
)
|
||||
|
||||
|
||||
@verbose
|
||||
def make_dics(
|
||||
info,
|
||||
forward,
|
||||
csd,
|
||||
reg=0.05,
|
||||
noise_csd=None,
|
||||
label=None,
|
||||
pick_ori=None,
|
||||
rank=None,
|
||||
weight_norm=None,
|
||||
reduce_rank=False,
|
||||
depth=1.0,
|
||||
real_filter=True,
|
||||
inversion="matrix",
|
||||
verbose=None,
|
||||
):
|
||||
"""Compute a Dynamic Imaging of Coherent Sources (DICS) spatial filter.
|
||||
|
||||
This is a beamformer filter that can be used to estimate the source power
|
||||
at a specific frequency range :footcite:`GrossEtAl2001`. It does this by
|
||||
constructing a spatial filter for each source point.
|
||||
The computation of these filters is very similar to those of the LCMV
|
||||
beamformer (:func:`make_lcmv`), but instead of operating on a covariance
|
||||
matrix, the CSD matrix is used. When applying these filters to a CSD matrix
|
||||
(see :func:`apply_dics_csd`), the source power can be estimated for each
|
||||
source point.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
%(info_not_none)s
|
||||
forward : instance of Forward
|
||||
Forward operator.
|
||||
csd : instance of CrossSpectralDensity
|
||||
The data cross-spectral density (CSD) matrices. A source estimate is
|
||||
performed for each frequency or frequency-bin defined in the CSD
|
||||
object.
|
||||
reg : float
|
||||
The regularization to apply to the cross-spectral density before
|
||||
computing the inverse.
|
||||
noise_csd : instance of CrossSpectralDensity | None
|
||||
Noise cross-spectral density (CSD) matrices. If provided, whitening
|
||||
will be done. The noise CSDs need to have been computed for the same
|
||||
frequencies as the data CSDs. Providing noise CSDs is mandatory if you
|
||||
mix sensor types, e.g. gradiometers with magnetometers or EEG with
|
||||
MEG.
|
||||
|
||||
.. versionadded:: 0.20
|
||||
label : Label | None
|
||||
Restricts the solution to a given label.
|
||||
%(pick_ori_bf)s
|
||||
%(rank_none)s
|
||||
|
||||
.. versionadded:: 0.17
|
||||
%(weight_norm)s
|
||||
|
||||
Defaults to ``None``, in which case no normalization is performed.
|
||||
%(reduce_rank)s
|
||||
%(depth)s
|
||||
real_filter : bool
|
||||
If ``True``, take only the real part of the cross-spectral-density
|
||||
matrices to compute real filters.
|
||||
|
||||
.. versionchanged:: 0.23
|
||||
Version 0.23 an earlier used ``real_filter=False`` as the default,
|
||||
as of version 0.24 ``True`` is the default.
|
||||
%(inversion_bf)s
|
||||
|
||||
.. versionchanged:: 0.21
|
||||
Default changed to ``'matrix'``.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
filters : instance of Beamformer
|
||||
Dictionary containing filter weights from DICS beamformer.
|
||||
Contains the following keys:
|
||||
|
||||
'kind' : str
|
||||
The type of beamformer, in this case 'DICS'.
|
||||
'weights' : ndarray, shape (n_frequencies, n_weights)
|
||||
For each frequency, the filter weights of the beamformer.
|
||||
'csd' : instance of CrossSpectralDensity
|
||||
The data cross-spectral density matrices used to compute the
|
||||
beamformer.
|
||||
'ch_names' : list of str
|
||||
Channels used to compute the beamformer.
|
||||
'proj' : ndarray, shape (n_channels, n_channels)
|
||||
Projections used to compute the beamformer.
|
||||
'vertices' : list of ndarray
|
||||
Vertices for which the filter weights were computed.
|
||||
'n_sources' : int
|
||||
Number of source location for which the filter weight were
|
||||
computed.
|
||||
'subject' : str
|
||||
The subject ID.
|
||||
'pick-ori' : None | 'max-power' | 'normal' | 'vector'
|
||||
The orientation in which the beamformer filters were computed.
|
||||
'inversion' : 'single' | 'matrix'
|
||||
Whether the spatial filters were computed for each dipole
|
||||
separately or jointly for all dipoles at each vertex using a
|
||||
matrix inversion.
|
||||
'weight_norm' : None | 'unit-noise-gain'
|
||||
The normalization of the weights.
|
||||
'src_type' : str
|
||||
Type of source space.
|
||||
'source_nn' : ndarray, shape (n_sources, 3)
|
||||
For each source location, the surface normal.
|
||||
'is_free_ori' : bool
|
||||
Whether the filter was computed in a fixed direction
|
||||
(pick_ori='max-power', pick_ori='normal') or not.
|
||||
'whitener' : None | ndarray, shape (n_channels, n_channels)
|
||||
Whitening matrix, provided if whitening was applied to the
|
||||
covariance matrix and leadfield during computation of the
|
||||
beamformer weights.
|
||||
'max-power-ori' : ndarray, shape (n_sources, 3) | None
|
||||
When pick_ori='max-power', this fields contains the estimated
|
||||
direction of maximum power at each source location.
|
||||
|
||||
See Also
|
||||
--------
|
||||
apply_dics_csd
|
||||
|
||||
Notes
|
||||
-----
|
||||
The original reference is :footcite:`GrossEtAl2001`. See
|
||||
:footcite:`vanVlietEtAl2018` for a tutorial style paper on the topic.
|
||||
|
||||
The DICS beamformer is very similar to the LCMV (:func:`make_lcmv`)
|
||||
beamformer and many of the parameters are shared. However,
|
||||
:func:`make_dics` and :func:`make_lcmv` currently have different defaults
|
||||
for these parameters, which were settled on separately through extensive
|
||||
practical use case testing (but not necessarily exhaustive parameter space
|
||||
searching), and it remains to be seen how functionally interchangeable they
|
||||
could be.
|
||||
|
||||
The default setting reproduce the DICS beamformer as described in
|
||||
:footcite:`vanVlietEtAl2018`::
|
||||
|
||||
inversion='single', weight_norm=None, depth=1.
|
||||
|
||||
To use the :func:`make_lcmv` defaults, use::
|
||||
|
||||
inversion='matrix', weight_norm='unit-noise-gain-invariant', depth=None
|
||||
|
||||
For more information about ``real_filter``, see the
|
||||
supplemental information from :footcite:`HippEtAl2011`.
|
||||
|
||||
References
|
||||
----------
|
||||
.. footbibliography::
|
||||
""" # noqa: E501
|
||||
rank = _check_rank(rank)
|
||||
_check_option("pick_ori", pick_ori, [None, "vector", "normal", "max-power"])
|
||||
_check_option("inversion", inversion, ["single", "matrix"])
|
||||
_validate_type(weight_norm, (str, None), "weight_norm")
|
||||
|
||||
frequencies = [np.mean(freq_bin) for freq_bin in csd.frequencies]
|
||||
n_freqs = len(frequencies)
|
||||
|
||||
_, _, allow_mismatch = _check_one_ch_type("dics", info, forward, csd, noise_csd)
|
||||
# remove bads so that equalize_channels only keeps all good
|
||||
info = pick_info(info, pick_channels(info["ch_names"], [], info["bads"]))
|
||||
info, forward, csd = equalize_channels([info, forward, csd])
|
||||
|
||||
csd, noise_csd = _prepare_noise_csd(csd, noise_csd, real_filter)
|
||||
|
||||
depth = _check_depth(depth, "depth_sparse")
|
||||
if inversion == "single":
|
||||
depth["combine_xyz"] = False
|
||||
|
||||
(
|
||||
is_free_ori,
|
||||
info,
|
||||
proj,
|
||||
vertices,
|
||||
G,
|
||||
whitener,
|
||||
nn,
|
||||
orient_std,
|
||||
) = _prepare_beamformer_input(
|
||||
info,
|
||||
forward,
|
||||
label,
|
||||
pick_ori,
|
||||
noise_cov=noise_csd,
|
||||
rank=rank,
|
||||
pca=False,
|
||||
**depth,
|
||||
)
|
||||
|
||||
# Compute ranks
|
||||
csd_int_rank = []
|
||||
if not allow_mismatch:
|
||||
noise_rank = compute_rank(noise_csd, info=info, rank=rank)
|
||||
for i in range(len(frequencies)):
|
||||
csd_rank = compute_rank(
|
||||
csd.get_data(index=i, as_cov=True), info=info, rank=rank
|
||||
)
|
||||
if not allow_mismatch:
|
||||
for key in csd_rank:
|
||||
if key not in noise_rank or csd_rank[key] != noise_rank[key]:
|
||||
raise ValueError(
|
||||
f"{key} data rank ({csd_rank[key]}) did not match the noise "
|
||||
f"rank ({noise_rank.get(key, None)})"
|
||||
)
|
||||
csd_int_rank.append(sum(csd_rank.values()))
|
||||
|
||||
del noise_csd
|
||||
ch_names = list(info["ch_names"])
|
||||
|
||||
logger.info("Computing DICS spatial filters...")
|
||||
Ws = []
|
||||
max_oris = []
|
||||
for i, freq in enumerate(frequencies):
|
||||
if n_freqs > 1:
|
||||
logger.info(
|
||||
" computing DICS spatial filter at "
|
||||
f"{round(freq, 2)} Hz ({i + 1}/{n_freqs})"
|
||||
)
|
||||
|
||||
Cm = csd.get_data(index=i)
|
||||
|
||||
# XXX: Weird that real_filter happens *before* whitening, which could
|
||||
# make things complex again...?
|
||||
if real_filter:
|
||||
Cm = Cm.real
|
||||
|
||||
# compute spatial filter
|
||||
n_orient = 3 if is_free_ori else 1
|
||||
W, max_power_ori = _compute_beamformer(
|
||||
G,
|
||||
Cm,
|
||||
reg,
|
||||
n_orient,
|
||||
weight_norm,
|
||||
pick_ori,
|
||||
reduce_rank,
|
||||
rank=csd_int_rank[i],
|
||||
inversion=inversion,
|
||||
nn=nn,
|
||||
orient_std=orient_std,
|
||||
whitener=whitener,
|
||||
)
|
||||
Ws.append(W)
|
||||
max_oris.append(max_power_ori)
|
||||
|
||||
Ws = np.array(Ws)
|
||||
if pick_ori == "max-power":
|
||||
max_oris = np.array(max_oris)
|
||||
else:
|
||||
max_oris = None
|
||||
|
||||
src_type = _get_src_type(forward["src"], vertices)
|
||||
subject = _subject_from_forward(forward)
|
||||
is_free_ori = is_free_ori if pick_ori in [None, "vector"] else False
|
||||
n_sources = np.sum([len(v) for v in vertices])
|
||||
|
||||
filters = Beamformer(
|
||||
kind="DICS",
|
||||
weights=Ws,
|
||||
csd=csd,
|
||||
ch_names=ch_names,
|
||||
proj=proj,
|
||||
vertices=vertices,
|
||||
n_sources=n_sources,
|
||||
subject=subject,
|
||||
pick_ori=pick_ori,
|
||||
inversion=inversion,
|
||||
weight_norm=weight_norm,
|
||||
src_type=src_type,
|
||||
source_nn=forward["source_nn"].copy(),
|
||||
is_free_ori=is_free_ori,
|
||||
whitener=whitener,
|
||||
max_power_ori=max_oris,
|
||||
)
|
||||
|
||||
return filters
|
||||
|
||||
|
||||
def _prepare_noise_csd(csd, noise_csd, real_filter):
|
||||
if noise_csd is not None:
|
||||
csd, noise_csd = equalize_channels([csd, noise_csd])
|
||||
# Use the same noise CSD for all frequencies
|
||||
if len(noise_csd.frequencies) > 1:
|
||||
noise_csd = noise_csd.mean()
|
||||
noise_csd = noise_csd.get_data(as_cov=True)
|
||||
if real_filter:
|
||||
noise_csd["data"] = noise_csd["data"].real
|
||||
return csd, noise_csd
|
||||
|
||||
|
||||
def _apply_dics(data, filters, info, tmin, tfr=False):
|
||||
"""Apply DICS spatial filter to data for source reconstruction."""
|
||||
if isinstance(data, np.ndarray) and data.ndim == (2 + tfr):
|
||||
data = [data]
|
||||
one_epoch = True
|
||||
else:
|
||||
one_epoch = False
|
||||
|
||||
Ws = filters["weights"]
|
||||
one_freq = len(Ws) == 1
|
||||
|
||||
subject = filters["subject"]
|
||||
# compatibility with 0.16, add src_type as None if not present:
|
||||
filters, warn_text = _check_src_type(filters)
|
||||
|
||||
for i, M in enumerate(data):
|
||||
if not one_epoch:
|
||||
logger.info(f"Processing epoch : {i + 1}")
|
||||
|
||||
# Apply SSPs
|
||||
if not tfr: # save computation, only compute once
|
||||
M_w = _proj_whiten_data(M, info["projs"], filters)
|
||||
|
||||
stcs = []
|
||||
for j, W in enumerate(Ws):
|
||||
if tfr: # must compute for each frequency
|
||||
M_w = _proj_whiten_data(M[:, j], info["projs"], filters)
|
||||
|
||||
# project to source space using beamformer weights
|
||||
sol = np.dot(W, M_w)
|
||||
|
||||
if filters["is_free_ori"] and filters["pick_ori"] != "vector":
|
||||
logger.info("combining the current components...")
|
||||
sol = combine_xyz(sol)
|
||||
|
||||
tstep = 1.0 / info["sfreq"]
|
||||
|
||||
stcs.append(
|
||||
_make_stc(
|
||||
sol,
|
||||
vertices=filters["vertices"],
|
||||
src_type=filters["src_type"],
|
||||
tmin=tmin,
|
||||
tstep=tstep,
|
||||
subject=subject,
|
||||
vector=(filters["pick_ori"] == "vector"),
|
||||
source_nn=filters["source_nn"],
|
||||
warn_text=warn_text,
|
||||
)
|
||||
)
|
||||
if one_freq:
|
||||
yield stcs[0]
|
||||
else:
|
||||
yield stcs
|
||||
|
||||
logger.info("[done]")
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_dics(evoked, filters, verbose=None):
|
||||
"""Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights.
|
||||
|
||||
Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights
|
||||
on evoked data.
|
||||
|
||||
.. warning:: The result of this function is meant as an intermediate step
|
||||
for further processing (such as computing connectivity). If
|
||||
you are interested in estimating source time courses, use an
|
||||
LCMV beamformer (:func:`make_lcmv`, :func:`apply_lcmv`)
|
||||
instead. If you are interested in estimating spectral power at
|
||||
the source level, use :func:`apply_dics_csd`.
|
||||
.. warning:: This implementation has not been heavily tested so please
|
||||
report any issues or suggestions.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
evoked : Evoked
|
||||
Evoked data to apply the DICS beamformer weights to.
|
||||
filters : instance of Beamformer
|
||||
DICS spatial filter (beamformer weights)
|
||||
Filter weights returned from :func:`make_dics`.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc : SourceEstimate | VolSourceEstimate | list
|
||||
Source time courses. If the DICS beamformer has been computed for more
|
||||
than one frequency, a list is returned containing for each frequency
|
||||
the corresponding time courses.
|
||||
|
||||
See Also
|
||||
--------
|
||||
apply_dics_epochs
|
||||
apply_dics_tfr_epochs
|
||||
apply_dics_csd
|
||||
""" # noqa: E501
|
||||
_check_reference(evoked)
|
||||
|
||||
info = evoked.info
|
||||
data = evoked.data
|
||||
tmin = evoked.times[0]
|
||||
|
||||
sel = _check_channels_spatial_filter(evoked.ch_names, filters)
|
||||
data = data[sel]
|
||||
|
||||
stc = _apply_dics(data=data, filters=filters, info=info, tmin=tmin)
|
||||
|
||||
return next(stc)
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_dics_epochs(epochs, filters, return_generator=False, verbose=None):
|
||||
"""Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights.
|
||||
|
||||
Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights
|
||||
on single trial data.
|
||||
|
||||
.. warning:: The result of this function is meant as an intermediate step
|
||||
for further processing (such as computing connectivity). If
|
||||
you are interested in estimating source time courses, use an
|
||||
LCMV beamformer (:func:`make_lcmv`, :func:`apply_lcmv`)
|
||||
instead. If you are interested in estimating spectral power at
|
||||
the source level, use :func:`apply_dics_csd`.
|
||||
.. warning:: This implementation has not been heavily tested so please
|
||||
report any issue or suggestions.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
epochs : Epochs
|
||||
Single trial epochs.
|
||||
filters : instance of Beamformer
|
||||
DICS spatial filter (beamformer weights)
|
||||
Filter weights returned from :func:`make_dics`. The DICS filters must
|
||||
have been computed for a single frequency only.
|
||||
return_generator : bool
|
||||
Return a generator object instead of a list. This allows iterating
|
||||
over the stcs without having to keep them all in memory.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc: list | generator of (SourceEstimate | VolSourceEstimate)
|
||||
The source estimates for all epochs.
|
||||
|
||||
See Also
|
||||
--------
|
||||
apply_dics
|
||||
apply_dics_tfr_epochs
|
||||
apply_dics_csd
|
||||
"""
|
||||
_check_reference(epochs)
|
||||
|
||||
if len(filters["weights"]) > 1:
|
||||
raise ValueError(
|
||||
"This function only works on DICS beamformer weights that have "
|
||||
"been computed for a single frequency. When calling make_dics(), "
|
||||
"make sure to use a CSD object with only a single frequency (or "
|
||||
"frequency-bin) defined."
|
||||
)
|
||||
|
||||
info = epochs.info
|
||||
tmin = epochs.times[0]
|
||||
|
||||
sel = _check_channels_spatial_filter(epochs.ch_names, filters)
|
||||
data = epochs.get_data(sel)
|
||||
|
||||
stcs = _apply_dics(data=data, filters=filters, info=info, tmin=tmin)
|
||||
|
||||
if not return_generator:
|
||||
stcs = list(stcs)
|
||||
|
||||
return stcs
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_dics_tfr_epochs(epochs_tfr, filters, return_generator=False, verbose=None):
|
||||
"""Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights.
|
||||
|
||||
Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights
|
||||
on single trial time-frequency data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
epochs_tfr : EpochsTFR
|
||||
Single trial time-frequency epochs.
|
||||
filters : instance of Beamformer
|
||||
DICS spatial filter (beamformer weights)
|
||||
Filter weights returned from :func:`make_dics`.
|
||||
return_generator : bool
|
||||
Return a generator object instead of a list. This allows iterating
|
||||
over the stcs without having to keep them all in memory.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stcs : list of list of (SourceEstimate | VectorSourceEstimate | VolSourceEstimate)
|
||||
The source estimates for all epochs (outside list) and for
|
||||
all frequencies (inside list).
|
||||
|
||||
See Also
|
||||
--------
|
||||
apply_dics
|
||||
apply_dics_epochs
|
||||
apply_dics_csd
|
||||
""" # noqa E501
|
||||
_validate_type(epochs_tfr, EpochsTFR)
|
||||
_check_tfr_complex(epochs_tfr)
|
||||
|
||||
if filters["pick_ori"] == "vector":
|
||||
warn(
|
||||
"Using a vector solution to compute power will lead to "
|
||||
"inaccurate directions (only in the first quadrent) "
|
||||
"because power is a strictly positive (squared) metric. "
|
||||
"Using singular value decomposition (SVD) to determine "
|
||||
"the direction is not yet supported in MNE."
|
||||
)
|
||||
|
||||
sel = _check_channels_spatial_filter(epochs_tfr.ch_names, filters)
|
||||
data = epochs_tfr.data[:, sel, :, :]
|
||||
|
||||
stcs = _apply_dics(data, filters, epochs_tfr.info, epochs_tfr.tmin, tfr=True)
|
||||
if not return_generator:
|
||||
stcs = [[stc for stc in tfr_stcs] for tfr_stcs in stcs]
|
||||
return stcs
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_dics_csd(csd, filters, verbose=None):
|
||||
"""Apply Dynamic Imaging of Coherent Sources (DICS) beamformer weights.
|
||||
|
||||
Apply a previously computed DICS beamformer to a cross-spectral density
|
||||
(CSD) object to estimate source power in time and frequency windows
|
||||
specified in the CSD object :footcite:`GrossEtAl2001`.
|
||||
|
||||
.. note:: Only power can computed from the cross-spectral density, not
|
||||
complex phase-amplitude, so vector DICS filters will be
|
||||
converted to scalar source estimates since power is strictly
|
||||
positive and so 3D directions cannot be combined meaningfully
|
||||
(the direction would be confined to the positive quadrant).
|
||||
|
||||
Parameters
|
||||
----------
|
||||
csd : instance of CrossSpectralDensity
|
||||
The data cross-spectral density (CSD) matrices. A source estimate is
|
||||
performed for each frequency or frequency-bin defined in the CSD
|
||||
object.
|
||||
filters : instance of Beamformer
|
||||
DICS spatial filter (beamformer weights)
|
||||
Filter weights returned from `make_dics`.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc : SourceEstimate
|
||||
Source power with frequency instead of time.
|
||||
frequencies : list of float
|
||||
The frequencies for which the source power has been computed. If the
|
||||
data CSD object defines frequency-bins instead of exact frequencies,
|
||||
the mean of each bin is returned.
|
||||
|
||||
See Also
|
||||
--------
|
||||
apply_dics
|
||||
apply_dics_epochs
|
||||
apply_dics_tfr_epochs
|
||||
|
||||
References
|
||||
----------
|
||||
.. footbibliography::
|
||||
""" # noqa: E501
|
||||
ch_names = filters["ch_names"]
|
||||
vertices = filters["vertices"]
|
||||
n_orient = 3 if filters["is_free_ori"] else 1
|
||||
subject = filters["subject"]
|
||||
whitener = filters["whitener"]
|
||||
n_sources = filters["n_sources"]
|
||||
|
||||
# If CSD is summed over multiple frequencies, take the average frequency
|
||||
frequencies = [np.mean(dfreq) for dfreq in csd.frequencies]
|
||||
n_freqs = len(frequencies)
|
||||
|
||||
source_power = np.zeros((n_sources, len(csd.frequencies)))
|
||||
|
||||
# Ensure the CSD is in the same order as the weights
|
||||
csd_picks = [csd.ch_names.index(ch) for ch in ch_names]
|
||||
|
||||
logger.info("Computing DICS source power...")
|
||||
for i, freq in enumerate(frequencies):
|
||||
if n_freqs > 1:
|
||||
logger.info(
|
||||
" applying DICS spatial filter at "
|
||||
f"{round(freq, 2)} Hz ({i + 1}/{n_freqs})"
|
||||
)
|
||||
|
||||
Cm = csd.get_data(index=i)
|
||||
Cm = Cm[csd_picks, :][:, csd_picks]
|
||||
W = filters["weights"][i]
|
||||
|
||||
# Whiten the CSD
|
||||
Cm = np.dot(whitener, np.dot(Cm, whitener.conj().T))
|
||||
|
||||
source_power[:, i] = _compute_power(Cm, W, n_orient)
|
||||
|
||||
logger.info("[done]")
|
||||
|
||||
# compatibility with 0.16, add src_type as None if not present:
|
||||
filters, warn_text = _check_src_type(filters)
|
||||
|
||||
return (
|
||||
_make_stc(
|
||||
source_power,
|
||||
vertices=vertices,
|
||||
src_type=filters["src_type"],
|
||||
tmin=0.0,
|
||||
tstep=1.0,
|
||||
subject=subject,
|
||||
warn_text=warn_text,
|
||||
),
|
||||
frequencies,
|
||||
)
|
||||
503
mne/beamformer/_lcmv.py
Normal file
@@ -0,0 +1,503 @@
|
||||
"""Compute Linearly constrained minimum variance (LCMV) beamformer."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .._fiff.meas_info import _simplify_info
|
||||
from .._fiff.pick import pick_channels_cov, pick_info
|
||||
from ..forward import _subject_from_forward
|
||||
from ..minimum_norm.inverse import _check_depth, _check_reference, combine_xyz
|
||||
from ..rank import compute_rank
|
||||
from ..source_estimate import _get_src_type, _make_stc
|
||||
from ..utils import (
|
||||
_check_channels_spatial_filter,
|
||||
_check_info_inv,
|
||||
_check_one_ch_type,
|
||||
logger,
|
||||
verbose,
|
||||
)
|
||||
from ._compute_beamformer import (
|
||||
Beamformer,
|
||||
_check_src_type,
|
||||
_compute_beamformer,
|
||||
_compute_power,
|
||||
_prepare_beamformer_input,
|
||||
_proj_whiten_data,
|
||||
)
|
||||
|
||||
|
||||
@verbose
|
||||
def make_lcmv(
|
||||
info,
|
||||
forward,
|
||||
data_cov,
|
||||
reg=0.05,
|
||||
noise_cov=None,
|
||||
label=None,
|
||||
pick_ori=None,
|
||||
rank="info",
|
||||
weight_norm="unit-noise-gain-invariant",
|
||||
reduce_rank=False,
|
||||
depth=None,
|
||||
inversion="matrix",
|
||||
verbose=None,
|
||||
):
|
||||
"""Compute LCMV spatial filter.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
%(info_not_none)s
|
||||
Specifies the channels to include. Bad channels (in ``info['bads']``)
|
||||
are not used.
|
||||
forward : instance of Forward
|
||||
Forward operator.
|
||||
data_cov : instance of Covariance
|
||||
The data covariance.
|
||||
reg : float
|
||||
The regularization for the whitened data covariance.
|
||||
noise_cov : instance of Covariance
|
||||
The noise covariance. If provided, whitening will be done. Providing a
|
||||
noise covariance is mandatory if you mix sensor types, e.g.
|
||||
gradiometers with magnetometers or EEG with MEG.
|
||||
|
||||
.. note::
|
||||
If ``noise_cov`` is ``None`` and ``weight_norm='unit-noise-gain'``,
|
||||
the unit noise is assumed to be 1 in SI units, e.g., 1 T for
|
||||
magnetometers, 1 V for EEG, so resulting amplitudes will be tiny.
|
||||
Consider using :func:`mne.make_ad_hoc_cov` to provide a
|
||||
``noise_cov`` to set noise values that are more reasonable for
|
||||
neural data or using ``weight_norm='nai'`` for weight-normalized
|
||||
beamformer output that is scaled by a noise estimate.
|
||||
label : instance of Label
|
||||
Restricts the LCMV solution to a given label.
|
||||
%(pick_ori_bf)s
|
||||
|
||||
- ``'vector'``
|
||||
Keeps the currents for each direction separate
|
||||
%(rank_info)s
|
||||
%(weight_norm)s
|
||||
|
||||
Defaults to ``'unit-noise-gain-invariant'``.
|
||||
%(reduce_rank)s
|
||||
%(depth)s
|
||||
|
||||
.. versionadded:: 0.18
|
||||
%(inversion_bf)s
|
||||
|
||||
.. versionadded:: 0.21
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
filters : instance of Beamformer
|
||||
Dictionary containing filter weights from LCMV beamformer.
|
||||
Contains the following keys:
|
||||
|
||||
'kind' : str
|
||||
The type of beamformer, in this case 'LCMV'.
|
||||
'weights' : array
|
||||
The filter weights of the beamformer.
|
||||
'data_cov' : instance of Covariance
|
||||
The data covariance matrix used to compute the beamformer.
|
||||
'noise_cov' : instance of Covariance | None
|
||||
The noise covariance matrix used to compute the beamformer.
|
||||
'whitener' : None | ndarray, shape (n_channels, n_channels)
|
||||
Whitening matrix, provided if whitening was applied to the
|
||||
covariance matrix and leadfield during computation of the
|
||||
beamformer weights.
|
||||
'weight_norm' : str | None
|
||||
Type of weight normalization used to compute the filter
|
||||
weights.
|
||||
'pick-ori' : None | 'max-power' | 'normal' | 'vector'
|
||||
The orientation in which the beamformer filters were computed.
|
||||
'ch_names' : list of str
|
||||
Channels used to compute the beamformer.
|
||||
'proj' : array
|
||||
Projections used to compute the beamformer.
|
||||
'is_ssp' : bool
|
||||
If True, projections were applied prior to filter computation.
|
||||
'vertices' : list
|
||||
Vertices for which the filter weights were computed.
|
||||
'is_free_ori' : bool
|
||||
If True, the filter was computed with free source orientation.
|
||||
'n_sources' : int
|
||||
Number of source location for which the filter weight were
|
||||
computed.
|
||||
'src_type' : str
|
||||
Type of source space.
|
||||
'source_nn' : ndarray, shape (n_sources, 3)
|
||||
For each source location, the surface normal.
|
||||
'proj' : ndarray, shape (n_channels, n_channels)
|
||||
Projections used to compute the beamformer.
|
||||
'subject' : str
|
||||
The subject ID.
|
||||
'rank' : int
|
||||
The rank of the data covariance matrix used to compute the
|
||||
beamformer weights.
|
||||
'max-power-ori' : ndarray, shape (n_sources, 3) | None
|
||||
When pick_ori='max-power', this fields contains the estimated
|
||||
direction of maximum power at each source location.
|
||||
'inversion' : 'single' | 'matrix'
|
||||
Whether the spatial filters were computed for each dipole
|
||||
separately or jointly for all dipoles at each vertex using a
|
||||
matrix inversion.
|
||||
|
||||
Notes
|
||||
-----
|
||||
The original reference is :footcite:`VanVeenEtAl1997`.
|
||||
|
||||
To obtain the Sekihara unit-noise-gain vector beamformer, you should use
|
||||
``weight_norm='unit-noise-gain', pick_ori='vector'`` followed by
|
||||
:meth:`vec_stc.project('pca', src) <mne.VectorSourceEstimate.project>`.
|
||||
|
||||
.. versionchanged:: 0.21
|
||||
The computations were extensively reworked, and the default for
|
||||
``weight_norm`` was set to ``'unit-noise-gain-invariant'``.
|
||||
|
||||
References
|
||||
----------
|
||||
.. footbibliography::
|
||||
"""
|
||||
# check number of sensor types present in the data and ensure a noise cov
|
||||
info = _simplify_info(info, keep=("proc_history",))
|
||||
noise_cov, _, allow_mismatch = _check_one_ch_type(
|
||||
"lcmv", info, forward, data_cov, noise_cov
|
||||
)
|
||||
# XXX we need this extra picking step (can't just rely on minimum norm's
|
||||
# because there can be a mismatch. Should probably add an extra arg to
|
||||
# _prepare_beamformer_input at some point (later)
|
||||
picks = _check_info_inv(info, forward, data_cov, noise_cov)
|
||||
info = pick_info(info, picks)
|
||||
data_rank = compute_rank(data_cov, rank=rank, info=info)
|
||||
noise_rank = compute_rank(noise_cov, rank=rank, info=info)
|
||||
for key in data_rank:
|
||||
if (
|
||||
key not in noise_rank or data_rank[key] != noise_rank[key]
|
||||
) and not allow_mismatch:
|
||||
raise ValueError(
|
||||
f"{key} data rank ({data_rank[key]}) did not match the noise rank ("
|
||||
f"{noise_rank.get(key, None)})"
|
||||
)
|
||||
del noise_rank
|
||||
rank = data_rank
|
||||
logger.info(f"Making LCMV beamformer with rank {rank}")
|
||||
del data_rank
|
||||
depth = _check_depth(depth, "depth_sparse")
|
||||
if inversion == "single":
|
||||
depth["combine_xyz"] = False
|
||||
|
||||
(
|
||||
is_free_ori,
|
||||
info,
|
||||
proj,
|
||||
vertno,
|
||||
G,
|
||||
whitener,
|
||||
nn,
|
||||
orient_std,
|
||||
) = _prepare_beamformer_input(
|
||||
info,
|
||||
forward,
|
||||
label,
|
||||
pick_ori,
|
||||
noise_cov=noise_cov,
|
||||
rank=rank,
|
||||
pca=False,
|
||||
**depth,
|
||||
)
|
||||
ch_names = list(info["ch_names"])
|
||||
|
||||
data_cov = pick_channels_cov(data_cov, include=ch_names)
|
||||
Cm = data_cov._get_square()
|
||||
if "estimator" in data_cov:
|
||||
del data_cov["estimator"]
|
||||
rank_int = sum(rank.values())
|
||||
del rank
|
||||
|
||||
# compute spatial filter
|
||||
n_orient = 3 if is_free_ori else 1
|
||||
W, max_power_ori = _compute_beamformer(
|
||||
G,
|
||||
Cm,
|
||||
reg,
|
||||
n_orient,
|
||||
weight_norm,
|
||||
pick_ori,
|
||||
reduce_rank,
|
||||
rank_int,
|
||||
inversion=inversion,
|
||||
nn=nn,
|
||||
orient_std=orient_std,
|
||||
whitener=whitener,
|
||||
)
|
||||
|
||||
# get src type to store with filters for _make_stc
|
||||
src_type = _get_src_type(forward["src"], vertno)
|
||||
|
||||
# get subject to store with filters
|
||||
subject_from = _subject_from_forward(forward)
|
||||
|
||||
# Is the computed beamformer a scalar or vector beamformer?
|
||||
is_free_ori = is_free_ori if pick_ori in [None, "vector"] else False
|
||||
is_ssp = bool(info["projs"])
|
||||
|
||||
filters = Beamformer(
|
||||
kind="LCMV",
|
||||
weights=W,
|
||||
data_cov=data_cov,
|
||||
noise_cov=noise_cov,
|
||||
whitener=whitener,
|
||||
weight_norm=weight_norm,
|
||||
pick_ori=pick_ori,
|
||||
ch_names=ch_names,
|
||||
proj=proj,
|
||||
is_ssp=is_ssp,
|
||||
vertices=vertno,
|
||||
is_free_ori=is_free_ori,
|
||||
n_sources=forward["nsource"],
|
||||
src_type=src_type,
|
||||
source_nn=forward["source_nn"].copy(),
|
||||
subject=subject_from,
|
||||
rank=rank_int,
|
||||
max_power_ori=max_power_ori,
|
||||
inversion=inversion,
|
||||
)
|
||||
|
||||
return filters
|
||||
|
||||
|
||||
def _apply_lcmv(data, filters, info, tmin):
|
||||
"""Apply LCMV spatial filter to data for source reconstruction."""
|
||||
if isinstance(data, np.ndarray) and data.ndim == 2:
|
||||
data = [data]
|
||||
return_single = True
|
||||
else:
|
||||
return_single = False
|
||||
|
||||
W = filters["weights"]
|
||||
|
||||
for i, M in enumerate(data):
|
||||
if len(M) != len(filters["ch_names"]):
|
||||
raise ValueError("data and picks must have the same length")
|
||||
|
||||
if not return_single:
|
||||
logger.info(f"Processing epoch : {i + 1}")
|
||||
|
||||
M = _proj_whiten_data(M, info["projs"], filters)
|
||||
|
||||
# project to source space using beamformer weights
|
||||
vector = False
|
||||
if filters["is_free_ori"]:
|
||||
sol = np.dot(W, M)
|
||||
if filters["pick_ori"] == "vector":
|
||||
vector = True
|
||||
else:
|
||||
logger.info("combining the current components...")
|
||||
sol = combine_xyz(sol)
|
||||
else:
|
||||
# Linear inverse: do computation here or delayed
|
||||
if M.shape[0] < W.shape[0] and filters["pick_ori"] != "max-power":
|
||||
sol = (W, M)
|
||||
else:
|
||||
sol = np.dot(W, M)
|
||||
|
||||
tstep = 1.0 / info["sfreq"]
|
||||
|
||||
# compatibility with 0.16, add src_type as None if not present:
|
||||
filters, warn_text = _check_src_type(filters)
|
||||
|
||||
yield _make_stc(
|
||||
sol,
|
||||
vertices=filters["vertices"],
|
||||
tmin=tmin,
|
||||
tstep=tstep,
|
||||
subject=filters["subject"],
|
||||
vector=vector,
|
||||
source_nn=filters["source_nn"],
|
||||
src_type=filters["src_type"],
|
||||
warn_text=warn_text,
|
||||
)
|
||||
|
||||
logger.info("[done]")
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_lcmv(evoked, filters, *, verbose=None):
|
||||
"""Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights.
|
||||
|
||||
Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights
|
||||
on evoked data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
evoked : Evoked
|
||||
Evoked data to invert.
|
||||
filters : instance of Beamformer
|
||||
LCMV spatial filter (beamformer weights).
|
||||
Filter weights returned from :func:`make_lcmv`.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc : SourceEstimate | VolSourceEstimate | VectorSourceEstimate
|
||||
Source time courses.
|
||||
|
||||
See Also
|
||||
--------
|
||||
make_lcmv, apply_lcmv_raw, apply_lcmv_epochs, apply_lcmv_cov
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 0.18
|
||||
"""
|
||||
_check_reference(evoked)
|
||||
|
||||
info = evoked.info
|
||||
data = evoked.data
|
||||
tmin = evoked.times[0]
|
||||
|
||||
sel = _check_channels_spatial_filter(evoked.ch_names, filters)
|
||||
data = data[sel]
|
||||
|
||||
stc = _apply_lcmv(data=data, filters=filters, info=info, tmin=tmin)
|
||||
|
||||
return next(stc)
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_lcmv_epochs(epochs, filters, *, return_generator=False, verbose=None):
|
||||
"""Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights.
|
||||
|
||||
Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights
|
||||
on single trial data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
epochs : Epochs
|
||||
Single trial epochs.
|
||||
filters : instance of Beamformer
|
||||
LCMV spatial filter (beamformer weights)
|
||||
Filter weights returned from :func:`make_lcmv`.
|
||||
return_generator : bool
|
||||
Return a generator object instead of a list. This allows iterating
|
||||
over the stcs without having to keep them all in memory.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc: list | generator of (SourceEstimate | VolSourceEstimate)
|
||||
The source estimates for all epochs.
|
||||
|
||||
See Also
|
||||
--------
|
||||
make_lcmv, apply_lcmv_raw, apply_lcmv, apply_lcmv_cov
|
||||
"""
|
||||
_check_reference(epochs)
|
||||
|
||||
info = epochs.info
|
||||
tmin = epochs.times[0]
|
||||
|
||||
sel = _check_channels_spatial_filter(epochs.ch_names, filters)
|
||||
data = epochs.get_data(sel)
|
||||
stcs = _apply_lcmv(data=data, filters=filters, info=info, tmin=tmin)
|
||||
|
||||
if not return_generator:
|
||||
stcs = [s for s in stcs]
|
||||
|
||||
return stcs
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_lcmv_raw(raw, filters, start=None, stop=None, *, verbose=None):
|
||||
"""Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights.
|
||||
|
||||
Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights
|
||||
on raw data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
raw : mne.io.Raw
|
||||
Raw data to invert.
|
||||
filters : instance of Beamformer
|
||||
LCMV spatial filter (beamformer weights).
|
||||
Filter weights returned from :func:`make_lcmv`.
|
||||
start : int
|
||||
Index of first time sample (index not time is seconds).
|
||||
stop : int
|
||||
Index of first time sample not to include (index not time is seconds).
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc : SourceEstimate | VolSourceEstimate
|
||||
Source time courses.
|
||||
|
||||
See Also
|
||||
--------
|
||||
make_lcmv, apply_lcmv_epochs, apply_lcmv, apply_lcmv_cov
|
||||
"""
|
||||
_check_reference(raw)
|
||||
|
||||
info = raw.info
|
||||
|
||||
sel = _check_channels_spatial_filter(raw.ch_names, filters)
|
||||
data, times = raw[sel, start:stop]
|
||||
tmin = times[0]
|
||||
|
||||
stc = _apply_lcmv(data=data, filters=filters, info=info, tmin=tmin)
|
||||
|
||||
return next(stc)
|
||||
|
||||
|
||||
@verbose
|
||||
def apply_lcmv_cov(data_cov, filters, verbose=None):
|
||||
"""Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights.
|
||||
|
||||
Apply Linearly Constrained Minimum Variance (LCMV) beamformer weights
|
||||
to a data covariance matrix to estimate source power.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
data_cov : instance of Covariance
|
||||
Data covariance matrix.
|
||||
filters : instance of Beamformer
|
||||
LCMV spatial filter (beamformer weights).
|
||||
Filter weights returned from :func:`make_lcmv`.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
stc : SourceEstimate | VolSourceEstimate
|
||||
Source power.
|
||||
|
||||
See Also
|
||||
--------
|
||||
make_lcmv, apply_lcmv, apply_lcmv_epochs, apply_lcmv_raw
|
||||
"""
|
||||
sel = _check_channels_spatial_filter(data_cov.ch_names, filters)
|
||||
sel_names = [data_cov.ch_names[ii] for ii in sel]
|
||||
data_cov = pick_channels_cov(data_cov, sel_names)
|
||||
|
||||
n_orient = filters["weights"].shape[0] // filters["n_sources"]
|
||||
# Need to project and whiten along both dimensions
|
||||
data = _proj_whiten_data(data_cov["data"].T, data_cov["projs"], filters)
|
||||
data = _proj_whiten_data(data.T, data_cov["projs"], filters)
|
||||
del data_cov
|
||||
source_power = _compute_power(data, filters["weights"], n_orient)
|
||||
|
||||
# compatibility with 0.16, add src_type as None if not present:
|
||||
filters, warn_text = _check_src_type(filters)
|
||||
|
||||
return _make_stc(
|
||||
source_power,
|
||||
vertices=filters["vertices"],
|
||||
src_type=filters["src_type"],
|
||||
tmin=0.0,
|
||||
tstep=1.0,
|
||||
subject=filters["subject"],
|
||||
source_nn=filters["source_nn"],
|
||||
warn_text=warn_text,
|
||||
)
|
||||
315
mne/beamformer/_rap_music.py
Normal file
@@ -0,0 +1,315 @@
|
||||
"""Compute a Recursively Applied and Projected MUltiple Signal Classification (RAP-MUSIC).""" # noqa
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
from scipy import linalg
|
||||
|
||||
from .._fiff.pick import pick_channels_forward, pick_info
|
||||
from ..fixes import _safe_svd
|
||||
from ..forward import convert_forward_solution, is_fixed_orient
|
||||
from ..inverse_sparse.mxne_inverse import _make_dipoles_sparse
|
||||
from ..minimum_norm.inverse import _log_exp_var
|
||||
from ..utils import _check_info_inv, fill_doc, logger, verbose
|
||||
from ._compute_beamformer import _prepare_beamformer_input
|
||||
|
||||
|
||||
@fill_doc
|
||||
def _apply_rap_music(
|
||||
data, info, times, forward, noise_cov, n_dipoles=2, picks=None, use_trap=False
|
||||
):
|
||||
"""RAP-MUSIC or TRAP-MUSIC for evoked data.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
data : array, shape (n_channels, n_times)
|
||||
Evoked data.
|
||||
%(info_not_none)s
|
||||
times : array
|
||||
Times.
|
||||
forward : instance of Forward
|
||||
Forward operator.
|
||||
noise_cov : instance of Covariance
|
||||
The noise covariance.
|
||||
n_dipoles : int
|
||||
The number of dipoles to estimate. The default value is 2.
|
||||
picks : list of int
|
||||
Caller ensures this is a list of int.
|
||||
use_trap : bool
|
||||
Use the TRAP-MUSIC variant if True (default False).
|
||||
|
||||
Returns
|
||||
-------
|
||||
dipoles : list of instances of Dipole
|
||||
The dipole fits.
|
||||
explained_data : array | None
|
||||
Data explained by the dipoles using a least square fitting with the
|
||||
selected active dipoles and their estimated orientation.
|
||||
"""
|
||||
info = pick_info(info, picks)
|
||||
del picks
|
||||
# things are much simpler if we avoid surface orientation
|
||||
align = forward["source_nn"].copy()
|
||||
if forward["surf_ori"] and not is_fixed_orient(forward):
|
||||
forward = convert_forward_solution(forward, surf_ori=False)
|
||||
is_free_ori, info, _, _, G, whitener, _, _ = _prepare_beamformer_input(
|
||||
info, forward, noise_cov=noise_cov, rank=None
|
||||
)
|
||||
forward = pick_channels_forward(forward, info["ch_names"], ordered=True)
|
||||
del info
|
||||
|
||||
# whiten the data (leadfield already whitened)
|
||||
M = np.dot(whitener, data)
|
||||
del data
|
||||
|
||||
_, eig_vectors = linalg.eigh(np.dot(M, M.T))
|
||||
phi_sig = eig_vectors[:, -n_dipoles:]
|
||||
|
||||
n_orient = 3 if is_free_ori else 1
|
||||
G.shape = (G.shape[0], -1, n_orient)
|
||||
gain = forward["sol"]["data"].copy()
|
||||
gain.shape = G.shape
|
||||
n_channels = G.shape[0]
|
||||
A = np.empty((n_channels, n_dipoles))
|
||||
gain_dip = np.empty((n_channels, n_dipoles))
|
||||
oris = np.empty((n_dipoles, 3))
|
||||
poss = np.empty((n_dipoles, 3))
|
||||
|
||||
G_proj = G.copy()
|
||||
phi_sig_proj = phi_sig.copy()
|
||||
|
||||
idxs = list()
|
||||
for k in range(n_dipoles):
|
||||
subcorr_max = -1.0
|
||||
source_idx, source_ori, source_pos = 0, [0, 0, 0], [0, 0, 0]
|
||||
for i_source in range(G.shape[1]):
|
||||
Gk = G_proj[:, i_source]
|
||||
subcorr, ori = _compute_subcorr(Gk, phi_sig_proj)
|
||||
if subcorr > subcorr_max:
|
||||
subcorr_max = subcorr
|
||||
source_idx = i_source
|
||||
source_ori = ori
|
||||
source_pos = forward["source_rr"][i_source]
|
||||
if n_orient == 3 and align is not None:
|
||||
surf_normal = forward["source_nn"][3 * i_source + 2]
|
||||
# make sure ori is aligned to the surface orientation
|
||||
source_ori *= np.sign(source_ori @ surf_normal) or 1.0
|
||||
if n_orient == 1:
|
||||
source_ori = forward["source_nn"][i_source]
|
||||
|
||||
idxs.append(source_idx)
|
||||
if n_orient == 3:
|
||||
Ak = np.dot(G[:, source_idx], source_ori)
|
||||
else:
|
||||
Ak = G[:, source_idx, 0]
|
||||
A[:, k] = Ak
|
||||
oris[k] = source_ori
|
||||
poss[k] = source_pos
|
||||
|
||||
logger.info(f"source {k + 1} found: p = {source_idx}")
|
||||
if n_orient == 3:
|
||||
logger.info("ori = {} {} {}".format(*tuple(oris[k])))
|
||||
|
||||
projection = _compute_proj(A[:, : k + 1])
|
||||
G_proj = np.einsum("ab,bso->aso", projection, G)
|
||||
phi_sig_proj = np.dot(projection, phi_sig)
|
||||
if use_trap:
|
||||
phi_sig_proj = phi_sig_proj[:, -(n_dipoles - k) :]
|
||||
del G, G_proj
|
||||
|
||||
sol = linalg.lstsq(A, M)[0]
|
||||
if n_orient == 3:
|
||||
X = sol[:, np.newaxis] * oris[:, :, np.newaxis]
|
||||
X.shape = (-1, len(times))
|
||||
else:
|
||||
X = sol
|
||||
|
||||
gain_active = gain[:, idxs]
|
||||
if n_orient == 3:
|
||||
gain_dip = (oris * gain_active).sum(-1)
|
||||
idxs = np.array(idxs)
|
||||
active_set = np.array([[3 * idxs, 3 * idxs + 1, 3 * idxs + 2]]).T.ravel()
|
||||
else:
|
||||
gain_dip = gain_active[:, :, 0]
|
||||
active_set = idxs
|
||||
gain_active = whitener @ gain_active.reshape(gain.shape[0], -1)
|
||||
assert gain_active.shape == (n_channels, X.shape[0])
|
||||
|
||||
explained_data = gain_dip @ sol
|
||||
M_estimate = whitener @ explained_data
|
||||
_log_exp_var(M, M_estimate)
|
||||
tstep = np.median(np.diff(times)) if len(times) > 1 else 1.0
|
||||
dipoles = _make_dipoles_sparse(
|
||||
X, active_set, forward, times[0], tstep, M, gain_active, active_is_idx=True
|
||||
)
|
||||
for dipole, ori in zip(dipoles, oris):
|
||||
signs = np.sign((dipole.ori * ori).sum(-1, keepdims=True))
|
||||
dipole.ori *= signs
|
||||
dipole.amplitude *= signs[:, 0]
|
||||
logger.info("[done]")
|
||||
return dipoles, explained_data
|
||||
|
||||
|
||||
def _compute_subcorr(G, phi_sig):
|
||||
"""Compute the subspace correlation."""
|
||||
Ug, Sg, Vg = _safe_svd(G, full_matrices=False)
|
||||
# Now we look at the actual rank of the forward fields
|
||||
# in G and handle the fact that it might be rank defficient
|
||||
# eg. when using MEG and a sphere model for which the
|
||||
# radial component will be truly 0.
|
||||
rank = np.sum(Sg > (Sg[0] * 1e-6))
|
||||
if rank == 0:
|
||||
return 0, np.zeros(len(G))
|
||||
rank = max(rank, 2) # rank cannot be 1
|
||||
Ug, Sg, Vg = Ug[:, :rank], Sg[:rank], Vg[:rank]
|
||||
tmp = np.dot(Ug.T.conjugate(), phi_sig)
|
||||
Uc, Sc, _ = _safe_svd(tmp, full_matrices=False)
|
||||
X = np.dot(Vg.T / Sg[None, :], Uc[:, 0]) # subcorr
|
||||
return Sc[0], X / np.linalg.norm(X)
|
||||
|
||||
|
||||
def _compute_proj(A):
|
||||
"""Compute the orthogonal projection operation for a manifold vector A."""
|
||||
U, _, _ = _safe_svd(A, full_matrices=False)
|
||||
return np.identity(A.shape[0]) - np.dot(U, U.T.conjugate())
|
||||
|
||||
|
||||
def _rap_music(evoked, forward, noise_cov, n_dipoles, return_residual, use_trap):
|
||||
"""RAP-/TRAP-MUSIC implementation."""
|
||||
info = evoked.info
|
||||
data = evoked.data
|
||||
times = evoked.times
|
||||
|
||||
picks = _check_info_inv(info, forward, data_cov=None, noise_cov=noise_cov)
|
||||
|
||||
data = data[picks]
|
||||
|
||||
dipoles, explained_data = _apply_rap_music(
|
||||
data, info, times, forward, noise_cov, n_dipoles, picks, use_trap
|
||||
)
|
||||
|
||||
if return_residual:
|
||||
residual = evoked.copy().pick([info["ch_names"][p] for p in picks])
|
||||
residual.data -= explained_data
|
||||
active_projs = [p for p in residual.info["projs"] if p["active"]]
|
||||
for p in active_projs:
|
||||
p["active"] = False
|
||||
residual.add_proj(active_projs, remove_existing=True)
|
||||
residual.apply_proj()
|
||||
return dipoles, residual
|
||||
else:
|
||||
return dipoles
|
||||
|
||||
|
||||
@verbose
|
||||
def rap_music(
|
||||
evoked,
|
||||
forward,
|
||||
noise_cov,
|
||||
n_dipoles=5,
|
||||
return_residual=False,
|
||||
*,
|
||||
verbose=None,
|
||||
):
|
||||
"""RAP-MUSIC source localization method.
|
||||
|
||||
Compute Recursively Applied and Projected MUltiple SIgnal Classification
|
||||
(RAP-MUSIC) :footcite:`MosherLeahy1999,MosherLeahy1996` on evoked data.
|
||||
|
||||
.. note:: The goodness of fit (GOF) of all the returned dipoles is the
|
||||
same and corresponds to the GOF of the full set of dipoles.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
evoked : instance of Evoked
|
||||
Evoked data to localize.
|
||||
forward : instance of Forward
|
||||
Forward operator.
|
||||
noise_cov : instance of Covariance
|
||||
The noise covariance.
|
||||
n_dipoles : int
|
||||
The number of dipoles to look for. The default value is 5.
|
||||
return_residual : bool
|
||||
If True, the residual is returned as an Evoked instance.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
dipoles : list of instance of Dipole
|
||||
The dipole fits.
|
||||
residual : instance of Evoked
|
||||
The residual a.k.a. data not explained by the dipoles.
|
||||
Only returned if return_residual is True.
|
||||
|
||||
See Also
|
||||
--------
|
||||
mne.fit_dipole
|
||||
mne.beamformer.trap_music
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 0.9.0
|
||||
|
||||
References
|
||||
----------
|
||||
.. footbibliography::
|
||||
"""
|
||||
return _rap_music(evoked, forward, noise_cov, n_dipoles, return_residual, False)
|
||||
|
||||
|
||||
@verbose
|
||||
def trap_music(
|
||||
evoked,
|
||||
forward,
|
||||
noise_cov,
|
||||
n_dipoles=5,
|
||||
return_residual=False,
|
||||
*,
|
||||
verbose=None,
|
||||
):
|
||||
"""TRAP-MUSIC source localization method.
|
||||
|
||||
Compute Truncated Recursively Applied and Projected MUltiple SIgnal Classification
|
||||
(TRAP-MUSIC) :footcite:`Makela2018` on evoked data.
|
||||
|
||||
.. note:: The goodness of fit (GOF) of all the returned dipoles is the
|
||||
same and corresponds to the GOF of the full set of dipoles.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
evoked : instance of Evoked
|
||||
Evoked data to localize.
|
||||
forward : instance of Forward
|
||||
Forward operator.
|
||||
noise_cov : instance of Covariance
|
||||
The noise covariance.
|
||||
n_dipoles : int
|
||||
The number of dipoles to look for. The default value is 5.
|
||||
return_residual : bool
|
||||
If True, the residual is returned as an Evoked instance.
|
||||
%(verbose)s
|
||||
|
||||
Returns
|
||||
-------
|
||||
dipoles : list of instance of Dipole
|
||||
The dipole fits.
|
||||
residual : instance of Evoked
|
||||
The residual a.k.a. data not explained by the dipoles.
|
||||
Only returned if return_residual is True.
|
||||
|
||||
See Also
|
||||
--------
|
||||
mne.fit_dipole
|
||||
mne.beamformer.rap_music
|
||||
|
||||
Notes
|
||||
-----
|
||||
.. versionadded:: 1.4
|
||||
|
||||
References
|
||||
----------
|
||||
.. footbibliography::
|
||||
"""
|
||||
return _rap_music(evoked, forward, noise_cov, n_dipoles, return_residual, True)
|
||||
86
mne/beamformer/resolution_matrix.py
Normal file
@@ -0,0 +1,86 @@
|
||||
"""Compute resolution matrix for beamformers."""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .._fiff.pick import pick_channels, pick_channels_forward, pick_info
|
||||
from ..evoked import EvokedArray
|
||||
from ..utils import fill_doc, logger
|
||||
from ._lcmv import apply_lcmv
|
||||
|
||||
|
||||
@fill_doc
|
||||
def make_lcmv_resolution_matrix(filters, forward, info):
|
||||
"""Compute resolution matrix for LCMV beamformer.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filters : instance of Beamformer
|
||||
Dictionary containing filter weights from LCMV beamformer
|
||||
(see mne.beamformer.make_lcmv).
|
||||
forward : instance of Forward
|
||||
Forward Solution with leadfield matrix.
|
||||
%(info_not_none)s Used to compute LCMV filters.
|
||||
|
||||
Returns
|
||||
-------
|
||||
resmat : array, shape (n_dipoles_lcmv, n_dipoles_fwd)
|
||||
Resolution matrix (filter matrix multiplied to leadfield from
|
||||
forward solution). Numbers of rows (n_dipoles_lcmv) and columns
|
||||
(n_dipoles_fwd) may differ by a factor depending on orientation
|
||||
constraints of filter and forward solution, respectively (e.g. factor 3
|
||||
for free dipole orientation versus factor 1 for scalar beamformers).
|
||||
"""
|
||||
# don't include bad channels from noise covariance matrix
|
||||
bads_filt = filters["noise_cov"]["bads"]
|
||||
ch_names = filters["noise_cov"]["names"]
|
||||
|
||||
# good channels
|
||||
ch_names = [c for c in ch_names if (c not in bads_filt)]
|
||||
|
||||
# adjust channels in forward solution
|
||||
forward = pick_channels_forward(forward, ch_names, ordered=True)
|
||||
|
||||
# get leadfield matrix from forward solution
|
||||
leadfield = forward["sol"]["data"]
|
||||
|
||||
# get the filter weights for beamformer as matrix
|
||||
filtmat = _get_matrix_from_lcmv(filters, forward, info)
|
||||
|
||||
# compute resolution matrix
|
||||
resmat = filtmat.dot(leadfield)
|
||||
|
||||
logger.info(f"Dimensions of LCMV resolution matrix: {resmat.shape}.")
|
||||
|
||||
return resmat
|
||||
|
||||
|
||||
def _get_matrix_from_lcmv(filters, forward, info, verbose=None):
|
||||
"""Get inverse matrix for LCMV beamformer.
|
||||
|
||||
Returns
|
||||
-------
|
||||
invmat : array, shape (n_dipoles, n_channels)
|
||||
Inverse matrix associated with LCMV beamformer filters.
|
||||
"""
|
||||
# number of channels for identity matrix
|
||||
info = pick_info(info, pick_channels(info["ch_names"], filters["ch_names"]))
|
||||
n_chs = len(info["ch_names"])
|
||||
|
||||
# create identity matrix as input for inverse operator
|
||||
# set elements to zero for non-selected channels
|
||||
id_mat = np.eye(n_chs)
|
||||
|
||||
# convert identity matrix to evoked data type (pretending it's an epochs
|
||||
evo_ident = EvokedArray(id_mat, info=info, tmin=0.0)
|
||||
|
||||
# apply beamformer to identity matrix
|
||||
stc_lcmv = apply_lcmv(evo_ident, filters, verbose=verbose)
|
||||
|
||||
# turn source estimate into numpsy array
|
||||
invmat = stc_lcmv.data
|
||||
|
||||
return invmat
|
||||
2540
mne/bem.py
Normal file
12
mne/channels/__init__.py
Normal file
@@ -0,0 +1,12 @@
|
||||
"""Module dedicated to manipulation of channels.
|
||||
|
||||
Can be used for setting of sensor locations used for processing and plotting.
|
||||
"""
|
||||
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import lazy_loader as lazy
|
||||
|
||||
(__getattr__, __dir__, __all__) = lazy.attach_stub(__name__, __file__)
|
||||
78
mne/channels/__init__.pyi
Normal file
@@ -0,0 +1,78 @@
|
||||
__all__ = [
|
||||
"DigMontage",
|
||||
"Layout",
|
||||
"_EEG_SELECTIONS",
|
||||
"_SELECTIONS",
|
||||
"_divide_to_regions",
|
||||
"combine_channels",
|
||||
"compute_dev_head_t",
|
||||
"compute_native_head_t",
|
||||
"equalize_channels",
|
||||
"find_ch_adjacency",
|
||||
"find_layout",
|
||||
"fix_mag_coil_types",
|
||||
"generate_2d_layout",
|
||||
"get_builtin_ch_adjacencies",
|
||||
"get_builtin_montages",
|
||||
"make_1020_channel_selections",
|
||||
"make_dig_montage",
|
||||
"make_eeg_layout",
|
||||
"make_grid_layout",
|
||||
"make_standard_montage",
|
||||
"read_ch_adjacency",
|
||||
"read_custom_montage",
|
||||
"read_dig_captrak",
|
||||
"read_dig_dat",
|
||||
"read_dig_egi",
|
||||
"read_dig_fif",
|
||||
"read_dig_hpts",
|
||||
"read_dig_localite",
|
||||
"read_dig_polhemus_isotrak",
|
||||
"read_layout",
|
||||
"read_polhemus_fastscan",
|
||||
"read_vectorview_selection",
|
||||
"rename_channels",
|
||||
"transform_to_head",
|
||||
"unify_bad_channels",
|
||||
]
|
||||
from .channels import (
|
||||
_EEG_SELECTIONS,
|
||||
_SELECTIONS,
|
||||
_divide_to_regions,
|
||||
combine_channels,
|
||||
equalize_channels,
|
||||
find_ch_adjacency,
|
||||
fix_mag_coil_types,
|
||||
get_builtin_ch_adjacencies,
|
||||
make_1020_channel_selections,
|
||||
read_ch_adjacency,
|
||||
read_vectorview_selection,
|
||||
rename_channels,
|
||||
unify_bad_channels,
|
||||
)
|
||||
from .layout import (
|
||||
Layout,
|
||||
find_layout,
|
||||
generate_2d_layout,
|
||||
make_eeg_layout,
|
||||
make_grid_layout,
|
||||
read_layout,
|
||||
)
|
||||
from .montage import (
|
||||
DigMontage,
|
||||
compute_dev_head_t,
|
||||
compute_native_head_t,
|
||||
get_builtin_montages,
|
||||
make_dig_montage,
|
||||
make_standard_montage,
|
||||
read_custom_montage,
|
||||
read_dig_captrak,
|
||||
read_dig_dat,
|
||||
read_dig_egi,
|
||||
read_dig_fif,
|
||||
read_dig_hpts,
|
||||
read_dig_localite,
|
||||
read_dig_polhemus_isotrak,
|
||||
read_polhemus_fastscan,
|
||||
transform_to_head,
|
||||
)
|
||||
96
mne/channels/_dig_montage_utils.py
Normal file
@@ -0,0 +1,96 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import numpy as np
|
||||
|
||||
from ..utils import Bunch, _check_fname, _soft_import, warn
|
||||
|
||||
|
||||
def _read_dig_montage_egi(
|
||||
fname,
|
||||
_scaling,
|
||||
_all_data_kwargs_are_none,
|
||||
):
|
||||
if not _all_data_kwargs_are_none:
|
||||
raise ValueError(
|
||||
"hsp, hpi, elp, point_names, fif must all be None if egi is not None"
|
||||
)
|
||||
_check_fname(fname, overwrite="read", must_exist=True)
|
||||
defusedxml = _soft_import("defusedxml", "reading EGI montages")
|
||||
root = defusedxml.ElementTree.parse(fname).getroot()
|
||||
ns = root.tag[root.tag.index("{") : root.tag.index("}") + 1]
|
||||
sensors = root.find(f"{ns}sensorLayout/{ns}sensors")
|
||||
fids = dict()
|
||||
dig_ch_pos = dict()
|
||||
|
||||
fid_name_map = {
|
||||
"Nasion": "nasion",
|
||||
"Right periauricular point": "rpa",
|
||||
"Left periauricular point": "lpa",
|
||||
}
|
||||
|
||||
for s in sensors:
|
||||
name, number, kind = s[0].text, int(s[1].text), int(s[2].text)
|
||||
coordinates = np.array([float(s[3].text), float(s[4].text), float(s[5].text)])
|
||||
|
||||
coordinates *= _scaling
|
||||
|
||||
# EEG Channels
|
||||
if kind == 0:
|
||||
dig_ch_pos[f"EEG {number:03d}"] = coordinates
|
||||
# Reference
|
||||
elif kind == 1:
|
||||
dig_ch_pos[f"EEG {len(dig_ch_pos) + 1:03d}"] = coordinates
|
||||
# Fiducials
|
||||
elif kind == 2:
|
||||
fid_name = fid_name_map[name]
|
||||
fids[fid_name] = coordinates
|
||||
# Unknown
|
||||
else:
|
||||
warn(
|
||||
f"Unknown sensor type {kind} detected. Skipping sensor..."
|
||||
"Proceed with caution!"
|
||||
)
|
||||
|
||||
return Bunch(
|
||||
# EGI stuff
|
||||
nasion=fids["nasion"],
|
||||
lpa=fids["lpa"],
|
||||
rpa=fids["rpa"],
|
||||
ch_pos=dig_ch_pos,
|
||||
coord_frame="unknown",
|
||||
)
|
||||
|
||||
|
||||
def _parse_brainvision_dig_montage(fname, scale):
|
||||
FID_NAME_MAP = {"Nasion": "nasion", "RPA": "rpa", "LPA": "lpa"}
|
||||
defusedxml = _soft_import("defusedxml", "reading BrainVision montages")
|
||||
root = defusedxml.ElementTree.parse(fname).getroot()
|
||||
sensors = root.find("CapTrakElectrodeList")
|
||||
|
||||
fids, dig_ch_pos = dict(), dict()
|
||||
|
||||
for s in sensors:
|
||||
name = s.find("Name").text
|
||||
|
||||
is_fid = name in FID_NAME_MAP
|
||||
coordinates = scale * np.array(
|
||||
[float(s.find("X").text), float(s.find("Y").text), float(s.find("Z").text)]
|
||||
)
|
||||
|
||||
# Fiducials
|
||||
if is_fid:
|
||||
fids[FID_NAME_MAP[name]] = coordinates
|
||||
# EEG Channels
|
||||
else:
|
||||
dig_ch_pos[name] = coordinates
|
||||
|
||||
return dict(
|
||||
# BVCT stuff
|
||||
nasion=fids["nasion"],
|
||||
lpa=fids["lpa"],
|
||||
rpa=fids["rpa"],
|
||||
ch_pos=dig_ch_pos,
|
||||
coord_frame="unknown",
|
||||
)
|
||||
421
mne/channels/_standard_montage_utils.py
Normal file
@@ -0,0 +1,421 @@
|
||||
# Authors: The MNE-Python contributors.
|
||||
# License: BSD-3-Clause
|
||||
# Copyright the MNE-Python contributors.
|
||||
|
||||
import csv
|
||||
import os.path as op
|
||||
from collections import OrderedDict
|
||||
from functools import partial
|
||||
|
||||
import numpy as np
|
||||
|
||||
from .._freesurfer import get_mni_fiducials
|
||||
from ..transforms import _sph_to_cart
|
||||
from ..utils import _pl, _soft_import, warn
|
||||
from . import __file__ as _CHANNELS_INIT_FILE
|
||||
from .montage import make_dig_montage
|
||||
|
||||
MONTAGE_PATH = op.join(op.dirname(_CHANNELS_INIT_FILE), "data", "montages")
|
||||
|
||||
_str = "U100"
|
||||
|
||||
|
||||
# In standard_1020, T9=LPA, T10=RPA, Nasion is the same as Iz with a
|
||||
# sign-flipped Y value
|
||||
|
||||
|
||||
def _egi_256(head_size):
|
||||
fname = op.join(MONTAGE_PATH, "EGI_256.csd")
|
||||
montage = _read_csd(fname, head_size)
|
||||
ch_pos = montage._get_ch_pos()
|
||||
|
||||
# For this cap, the Nasion is the frontmost electrode,
|
||||
# LPA/RPA we approximate by putting 75% of the way (toward the front)
|
||||
# between the two electrodes that are halfway down the ear holes
|
||||
nasion = ch_pos["E31"]
|
||||
lpa = 0.75 * ch_pos["E67"] + 0.25 * ch_pos["E94"]
|
||||
rpa = 0.75 * ch_pos["E219"] + 0.25 * ch_pos["E190"]
|
||||
|
||||
fids_montage = make_dig_montage(
|
||||
coord_frame="unknown",
|
||||
nasion=nasion,
|
||||
lpa=lpa,
|
||||
rpa=rpa,
|
||||
)
|
||||
|
||||
montage += fids_montage # add fiducials to montage
|
||||
|
||||
return montage
|
||||
|
||||
|
||||
def _easycap(basename, head_size):
|
||||
fname = op.join(MONTAGE_PATH, basename)
|
||||
montage = _read_theta_phi_in_degrees(fname, head_size, add_fiducials=True)
|
||||
return montage
|
||||
|
||||
|
||||
def _hydrocel(basename, head_size):
|
||||
fname = op.join(MONTAGE_PATH, basename)
|
||||
return _read_sfp(fname, head_size)
|
||||
|
||||
|
||||
def _str_names(ch_names):
|
||||
return [str(ch_name) for ch_name in ch_names]
|
||||
|
||||
|
||||
def _safe_np_loadtxt(fname, **kwargs):
|
||||
out = np.genfromtxt(fname, **kwargs)
|
||||
ch_names = _str_names(out["f0"])
|
||||
others = tuple(out[f"f{ii}"] for ii in range(1, len(out.dtype.fields)))
|
||||
return (ch_names,) + others
|
||||
|
||||
|
||||
def _biosemi(basename, head_size):
|
||||
fname = op.join(MONTAGE_PATH, basename)
|
||||
fid_names = ("Nz", "LPA", "RPA")
|
||||
return _read_theta_phi_in_degrees(fname, head_size, fid_names)
|
||||
|
||||
|
||||
def _mgh_or_standard(basename, head_size, coord_frame="unknown"):
|
||||
fid_names = ("Nz", "LPA", "RPA")
|
||||
fname = op.join(MONTAGE_PATH, basename)
|
||||
|
||||
ch_names_, pos = [], []
|
||||
with open(fname) as fid:
|
||||
# Ignore units as we will scale later using the norms anyway
|
||||
for line in fid:
|
||||
if "Positions\n" in line:
|
||||
break
|
||||
pos = []
|
||||
for line in fid:
|
||||
if "Labels\n" in line:
|
||||
break
|
||||
pos.append(list(map(float, line.split())))
|
||||
for line in fid:
|
||||
if not line or not set(line) - {" "}:
|
||||
break
|
||||
ch_names_.append(line.strip(" ").strip("\n"))
|
||||
|
||||
pos = np.array(pos) / 1000.0
|
||||
ch_pos = _check_dupes_odict(ch_names_, pos)
|
||||
nasion, lpa, rpa = (ch_pos.pop(n) for n in fid_names)
|
||||
if head_size is None:
|
||||
scale = 1.0
|
||||
else:
|
||||
scale = head_size / np.median(np.linalg.norm(pos, axis=1))
|
||||
for value in ch_pos.values():
|
||||
value *= scale
|
||||
# if we are in MRI/MNI coordinates, we need to replace nasion, LPA, and RPA
|
||||
# with those of fsaverage for ``trans='fsaverage'`` to work
|
||||
if coord_frame == "mri":
|
||||
lpa, nasion, rpa = (x["r"].copy() for x in get_mni_fiducials("fsaverage"))
|
||||
nasion *= scale
|
||||
lpa *= scale
|
||||
rpa *= scale
|
||||
|
||||
return make_dig_montage(
|
||||
ch_pos=ch_pos, coord_frame=coord_frame, nasion=nasion, lpa=lpa, rpa=rpa
|
||||
)
|
||||
|
||||
|
||||
standard_montage_look_up_table = {
|
||||
"EGI_256": _egi_256,
|
||||
"easycap-M1": partial(_easycap, basename="easycap-M1.txt"),
|
||||
"easycap-M10": partial(_easycap, basename="easycap-M10.txt"),
|
||||
"easycap-M43": partial(_easycap, basename="easycap-M43.txt"),
|
||||
"GSN-HydroCel-128": partial(_hydrocel, basename="GSN-HydroCel-128.sfp"),
|
||||
"GSN-HydroCel-129": partial(_hydrocel, basename="GSN-HydroCel-129.sfp"),
|
||||
"GSN-HydroCel-256": partial(_hydrocel, basename="GSN-HydroCel-256.sfp"),
|
||||
"GSN-HydroCel-257": partial(_hydrocel, basename="GSN-HydroCel-257.sfp"),
|
||||
"GSN-HydroCel-32": partial(_hydrocel, basename="GSN-HydroCel-32.sfp"),
|
||||
"GSN-HydroCel-64_1.0": partial(_hydrocel, basename="GSN-HydroCel-64_1.0.sfp"),
|
||||
"GSN-HydroCel-65_1.0": partial(_hydrocel, basename="GSN-HydroCel-65_1.0.sfp"),
|
||||
"biosemi128": partial(_biosemi, basename="biosemi128.txt"),
|
||||
"biosemi16": partial(_biosemi, basename="biosemi16.txt"),
|
||||
"biosemi160": partial(_biosemi, basename="biosemi160.txt"),
|
||||
"biosemi256": partial(_biosemi, basename="biosemi256.txt"),
|
||||
"biosemi32": partial(_biosemi, basename="biosemi32.txt"),
|
||||
"biosemi64": partial(_biosemi, basename="biosemi64.txt"),
|
||||
"mgh60": partial(_mgh_or_standard, basename="mgh60.elc", coord_frame="mri"),
|
||||
"mgh70": partial(_mgh_or_standard, basename="mgh70.elc", coord_frame="mri"),
|
||||
"standard_1005": partial(
|
||||
_mgh_or_standard, basename="standard_1005.elc", coord_frame="mri"
|
||||
),
|
||||
"standard_1020": partial(
|
||||
_mgh_or_standard, basename="standard_1020.elc", coord_frame="mri"
|
||||
),
|
||||
"standard_alphabetic": partial(
|
||||
_mgh_or_standard, basename="standard_alphabetic.elc", coord_frame="mri"
|
||||
),
|
||||
"standard_postfixed": partial(
|
||||
_mgh_or_standard, basename="standard_postfixed.elc", coord_frame="mri"
|
||||
),
|
||||
"standard_prefixed": partial(
|
||||
_mgh_or_standard, basename="standard_prefixed.elc", coord_frame="mri"
|
||||
),
|
||||
"standard_primed": partial(
|
||||
_mgh_or_standard, basename="standard_primed.elc", coord_frame="mri"
|
||||
),
|
||||
"artinis-octamon": partial(
|
||||
_mgh_or_standard, coord_frame="mri", basename="artinis-octamon.elc"
|
||||
),
|
||||
"artinis-brite23": partial(
|
||||
_mgh_or_standard, coord_frame="mri", basename="artinis-brite23.elc"
|
||||
),
|
||||
"brainproducts-RNP-BA-128": partial(
|
||||
_easycap, basename="brainproducts-RNP-BA-128.txt"
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def _read_sfp(fname, head_size):
|
||||
"""Read .sfp BESA/EGI files."""
|
||||
# fname has been already checked
|
||||
fid_names = ("FidNz", "FidT9", "FidT10")
|
||||
options = dict(dtype=(_str, "f4", "f4", "f4"))
|
||||
ch_names, xs, ys, zs = _safe_np_loadtxt(fname, **options)
|
||||
# deal with "headshape"
|
||||
mask = np.array([ch_name == "headshape" for ch_name in ch_names], bool)
|
||||
hsp = np.stack([xs[mask], ys[mask], zs[mask]], axis=-1)
|
||||
mask = ~mask
|
||||
pos = np.stack([xs[mask], ys[mask], zs[mask]], axis=-1)
|
||||
ch_names = [ch_name for ch_name, m in zip(ch_names, mask) if m]
|
||||
ch_pos = _check_dupes_odict(ch_names, pos)
|
||||
del xs, ys, zs, ch_names
|
||||
# no one grants that fid names are there.
|
||||
nasion, lpa, rpa = (ch_pos.pop(n, None) for n in fid_names)
|
||||
|
||||
if head_size is not None:
|
||||
scale = head_size / np.median(np.linalg.norm(pos, axis=-1))
|
||||
for value in ch_pos.values():
|
||||
value *= scale
|
||||
nasion = nasion * scale if nasion is not None else None
|
||||
lpa = lpa * scale if lpa is not None else None
|
||||
rpa = rpa * scale if rpa is not None else None
|
||||
|
||||
return make_dig_montage(
|
||||
ch_pos=ch_pos, coord_frame="unknown", nasion=nasion, rpa=rpa, lpa=lpa, hsp=hsp
|
||||
)
|
||||
|
||||
|
||||
def _read_csd(fname, head_size):
|
||||
# Label, Theta, Phi, Radius, X, Y, Z, off sphere surface
|
||||
options = dict(
|
||||
comments="//", dtype=(_str, "f4", "f4", "f4", "f4", "f4", "f4", "f4")
|
||||
)
|
||||
ch_names, _, _, _, xs, ys, zs, _ = _safe_np_loadtxt(fname, **options)
|
||||
pos = np.stack([xs, ys, zs], axis=-1)
|
||||
|
||||
if head_size is not None:
|
||||
pos *= head_size / np.median(np.linalg.norm(pos, axis=1))
|
||||
|
||||
return make_dig_montage(ch_pos=_check_dupes_odict(ch_names, pos))
|
||||
|
||||
|
||||
def _check_dupes_odict(ch_names, pos):
|
||||
"""Warn if there are duplicates, then turn to ordered dict."""
|
||||
ch_names = list(ch_names)
|
||||
dups = OrderedDict((ch_name, ch_names.count(ch_name)) for ch_name in ch_names)
|
||||
dups = OrderedDict((ch_name, count) for ch_name, count in dups.items() if count > 1)
|
||||
n = len(dups)
|
||||
if n:
|
||||
dups = ", ".join(f"{ch_name} ({count})" for ch_name, count in dups.items())
|
||||
warn(
|
||||
f"Duplicate channel position{_pl(n)} found, the last will be "
|
||||
f"used for {dups}"
|
||||
)
|
||||
return OrderedDict(zip(ch_names, pos))
|
||||
|
||||
|
||||
def _read_elc(fname, head_size):
|
||||
"""Read .elc files.
|
||||
|
||||
The `.elc` files are so-called "asa electrode files". ASA here stands for
|
||||
Advances Source Analysis, and is a software package developed and sold by
|
||||
the ANT Neuro company. They provide a device for sensor digitization, called
|
||||
'xensor', which produces the `.elc` files.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : str
|
||||
File extension is expected to be '.elc'.
|
||||
head_size : float | None
|
||||
The size of the head in [m]. If none, returns the values read from the
|
||||
file with no modification.
|
||||
|
||||
Returns
|
||||
-------
|
||||
montage : instance of DigMontage
|
||||
The montage units are [m].
|
||||
"""
|
||||
fid_names = ("Nz", "LPA", "RPA")
|
||||
|
||||
with open(fname) as fid:
|
||||
# Read units
|
||||
# _read_elc does require to detect the units. (see _mgh_or_standard)
|
||||
for line in fid:
|
||||
if "UnitPosition" in line:
|
||||
units = line.split()[1]
|
||||
scale = dict(m=1.0, mm=1e-3)[units]
|
||||
break
|
||||
else:
|
||||
raise RuntimeError(f"Could not detect units in file {fname}")
|
||||
for line in fid:
|
||||
if "Positions\n" in line:
|
||||
break
|
||||
|
||||
# Read positions
|
||||
new_style = False
|
||||
pos = []
|
||||
for line in fid:
|
||||
if "Labels\n" in line:
|
||||
break
|
||||
if ":" in line:
|
||||
# Of the 'new' format: `E01 : 5.288 -3.658 119.693`
|
||||
pos.append(list(map(float, line.split(":")[1].split())))
|
||||
new_style = True
|
||||
else:
|
||||
# Of the 'old' format: `5.288 -3.658 119.693`
|
||||
pos.append(list(map(float, line.split())))
|
||||
|
||||
# Read labels
|
||||
ch_names_ = []
|
||||
for line in fid:
|
||||
if not line or not set(line) - {" "}:
|
||||
break
|
||||
if new_style:
|
||||
# Not sure how this format would deal with spaces in channel labels,
|
||||
# but none of my test files had this, so let's wait until it comes up.
|
||||
parsed = line.strip(" ").strip("\n").split()
|
||||
else:
|
||||
parsed = [line.strip(" ").strip("\n")]
|
||||
ch_names_.extend(parsed)
|
||||
|
||||
pos = np.array(pos) * scale
|
||||
if head_size is not None:
|
||||
pos *= head_size / np.median(np.linalg.norm(pos, axis=1))
|
||||
|
||||
ch_pos = _check_dupes_odict(ch_names_, pos)
|
||||
nasion, lpa, rpa = (ch_pos.pop(n, None) for n in fid_names)
|
||||
|
||||
return make_dig_montage(
|
||||
ch_pos=ch_pos, coord_frame="unknown", nasion=nasion, lpa=lpa, rpa=rpa
|
||||
)
|
||||
|
||||
|
||||
def _read_theta_phi_in_degrees(fname, head_size, fid_names=None, add_fiducials=False):
|
||||
ch_names, theta, phi = _safe_np_loadtxt(
|
||||
fname, skip_header=1, dtype=(_str, "i4", "i4")
|
||||
)
|
||||
if add_fiducials:
|
||||
# Add fiducials based on 10/20 spherical coordinate definitions
|
||||
# http://chgd.umich.edu/wp-content/uploads/2014/06/
|
||||
# 10-20_system_positioning.pdf
|
||||
# extrapolated from other sensor coordinates in the Easycap layouts
|
||||
# https://www.easycap.de/wp-content/uploads/2018/02/
|
||||
# Easycap-Equidistant-Layouts.pdf
|
||||
assert fid_names is None
|
||||
fid_names = ["Nasion", "LPA", "RPA"]
|
||||
ch_names.extend(fid_names)
|
||||
theta = np.append(theta, [115, -115, 115])
|
||||
phi = np.append(phi, [90, 0, 0])
|
||||
|
||||
radii = np.full(len(phi), head_size)
|
||||
pos = _sph_to_cart(np.array([radii, np.deg2rad(phi), np.deg2rad(theta)]).T)
|
||||
ch_pos = _check_dupes_odict(ch_names, pos)
|
||||
|
||||
nasion, lpa, rpa = None, None, None
|
||||
if fid_names is not None:
|
||||
nasion, lpa, rpa = (ch_pos.pop(n, None) for n in fid_names)
|
||||
|
||||
return make_dig_montage(
|
||||
ch_pos=ch_pos, coord_frame="unknown", nasion=nasion, lpa=lpa, rpa=rpa
|
||||
)
|
||||
|
||||
|
||||
def _read_elp_besa(fname, head_size):
|
||||
# This .elp is not the same as polhemus elp. see _read_isotrak_elp_points
|
||||
dtype = np.dtype("S8, S8, f8, f8, f8")
|
||||
data = np.loadtxt(fname, dtype=dtype)
|
||||
|
||||
ch_names = data["f1"].astype(str).tolist()
|
||||
az = data["f2"]
|
||||
horiz = data["f3"]
|
||||
radius = np.abs(az / 180.0)
|
||||
az = np.deg2rad(np.array([h if a >= 0.0 else 180 + h for h, a in zip(horiz, az)]))
|
||||
pol = radius * np.pi
|
||||
rad = data["f4"] / 100
|
||||
pos = _sph_to_cart(np.array([rad, az, pol]).T)
|
||||
|
||||
if head_size is not None:
|
||||
pos *= head_size / np.median(np.linalg.norm(pos, axis=1))
|
||||
|
||||
ch_pos = _check_dupes_odict(ch_names, pos)
|
||||
|
||||
fid_names = ("Nz", "LPA", "RPA")
|
||||
# No one grants that the fid names actually exist.
|
||||
nasion, lpa, rpa = (ch_pos.pop(n, None) for n in fid_names)
|
||||
|
||||
return make_dig_montage(ch_pos=ch_pos, nasion=nasion, lpa=lpa, rpa=rpa)
|
||||
|
||||
|
||||
def _read_brainvision(fname, head_size):
|
||||
# 'BrainVision Electrodes File' format
|
||||
# Based on BrainVision Analyzer coordinate system: Defined between
|
||||
# standard electrode positions: X-axis from T7 to T8, Y-axis from Oz to
|
||||
# Fpz, Z-axis orthogonal from XY-plane through Cz, fit to a sphere if
|
||||
# idealized (when radius=1), specified in millimeters
|
||||
defusedxml = _soft_import("defusedxml", "reading BrainVision montages")
|
||||
root = defusedxml.ElementTree.parse(fname).getroot()
|
||||
ch_names = [s.text for s in root.findall("./Electrode/Name")]
|
||||
theta = [float(s.text) for s in root.findall("./Electrode/Theta")]
|
||||
pol = np.deg2rad(np.array(theta))
|
||||
phi = [float(s.text) for s in root.findall("./Electrode/Phi")]
|
||||
az = np.deg2rad(np.array(phi))
|
||||
rad = [float(s.text) for s in root.findall("./Electrode/Radius")]
|
||||
rad = np.array(rad) # specified in mm
|
||||
pos = _sph_to_cart(np.array([rad, az, pol]).T)
|
||||
|
||||
if head_size is not None:
|
||||
pos *= head_size / np.median(np.linalg.norm(pos, axis=1))
|
||||
|
||||
return make_dig_montage(ch_pos=_check_dupes_odict(ch_names, pos))
|
||||
|
||||
|
||||
def _read_xyz(fname):
|
||||
"""Import EEG channel locations from CSV, TSV, or XYZ files.
|
||||
|
||||
CSV and TSV files should have columns 4 columns containing
|
||||
ch_name, x, y, and z. Each row represents one channel.
|
||||
XYZ files should have 5 columns containing
|
||||
count, x, y, z, and ch_name. Each row represents one channel
|
||||
CSV files should be separated by commas, TSV and XYZ files should be
|
||||
separated by tabs.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
fname : str
|
||||
Name of the file to read channel locations from.
|
||||
|
||||
Returns
|
||||
-------
|
||||
montage : instance of DigMontage
|
||||
The montage.
|
||||
"""
|
||||
ch_names = []
|
||||
pos = []
|
||||
file_format = op.splitext(fname)[1].lower()
|
||||
with open(fname) as f:
|
||||
if file_format != ".xyz":
|
||||
f.readline() # skip header
|
||||
delimiter = "," if file_format == ".csv" else "\t"
|
||||
for row in csv.reader(f, delimiter=delimiter):
|
||||
if file_format == ".xyz":
|
||||
_, x, y, z, ch_name, *_ = row
|
||||
ch_name = ch_name.strip() # deals with variable tab size
|
||||
else:
|
||||
ch_name, x, y, z, *_ = row
|
||||
ch_names.append(ch_name)
|
||||
pos.append((x, y, z))
|
||||
d = _check_dupes_odict(ch_names, np.array(pos, dtype=float))
|
||||
return make_dig_montage(ch_pos=d)
|
||||
2150
mne/channels/channels.py
Normal file
276
mne/channels/data/layouts/CTF-275.lout
Normal file
@@ -0,0 +1,276 @@
|
||||
-42.27 42.33 -39.99 31.80
|
||||
001 -4.09 10.91 4.00 3.00 MLC11-2622
|
||||
002 -7.25 8.87 4.00 3.00 MLC12-2622
|
||||
003 -10.79 7.43 4.00 3.00 MLC13-2622
|
||||
004 -14.40 5.31 4.00 3.00 MLC14-2622
|
||||
005 -17.45 2.88 4.00 3.00 MLC15-2622
|
||||
006 -19.94 -0.21 4.00 3.00 MLC16-2622
|
||||
007 -22.30 -3.88 4.00 3.00 MLC17-2622
|
||||
008 -7.70 5.16 4.00 3.00 MLC21-2622
|
||||
009 -11.18 3.69 4.00 3.00 MLC22-2622
|
||||
010 -14.17 1.40 4.00 3.00 MLC23-2622
|
||||
011 -16.42 -1.52 4.00 3.00 MLC24-2622
|
||||
012 -18.64 -4.88 4.00 3.00 MLC25-2622
|
||||
013 -12.55 -2.00 4.00 3.00 MLC31-2622
|
||||
014 -15.13 -5.41 4.00 3.00 MLC32-2622
|
||||
015 -9.57 0.28 4.00 3.00 MLC41-2622
|
||||
016 -11.51 -5.56 4.00 3.00 MLC42-2622
|
||||
017 -4.04 4.58 4.00 3.00 MLC51-2622
|
||||
018 -6.04 1.35 4.00 3.00 MLC52-2622
|
||||
019 -8.79 -3.34 4.00 3.00 MLC53-2622
|
||||
020 -8.32 -7.10 4.00 3.00 MLC54-2622
|
||||
021 -6.60 -10.22 4.00 3.00 MLC55-2622
|
||||
022 -4.01 -1.76 4.00 3.00 MLC61-2622
|
||||
023 -5.55 -4.97 4.00 3.00 MLC62-2622
|
||||
024 -3.74 -8.12 4.00 3.00 MLC63-2622
|
||||
025 -7.63 28.14 4.00 3.00 MLF11-2622
|
||||
026 -12.92 27.01 4.00 3.00 MLF12-2622
|
||||
027 -18.14 25.41 4.00 3.00 MLF13-2622
|
||||
028 -23.34 23.65 4.00 3.00 MLF14-2622
|
||||
029 -4.64 25.47 4.00 3.00 MLF21-2622
|
||||
030 -9.22 24.68 4.00 3.00 MLF22-2622
|
||||
031 -13.60 23.41 4.00 3.00 MLF23-2622
|
||||
032 -18.31 21.53 4.00 3.00 MLF24-2622
|
||||
033 -22.68 19.69 4.00 3.00 MLF25-2622
|
||||
034 -6.57 22.14 4.00 3.00 MLF31-2622
|
||||
035 -10.75 21.22 4.00 3.00 MLF32-2622
|
||||
036 -15.16 19.49 4.00 3.00 MLF33-2622
|
||||
037 -19.01 17.57 4.00 3.00 MLF34-2622
|
||||
038 -22.93 15.25 4.00 3.00 MLF35-2622
|
||||
039 -4.25 19.38 4.00 3.00 MLF41-2622
|
||||
040 -8.17 18.80 4.00 3.00 MLF42-2622
|
||||
041 -12.29 17.37 4.00 3.00 MLF43-2622
|
||||
042 -15.93 15.49 4.00 3.00 MLF44-2622
|
||||
043 -19.89 13.39 4.00 3.00 MLF45-2622
|
||||
044 -24.12 10.50 4.00 3.00 MLF46-2622
|
||||
045 -5.48 16.15 4.00 3.00 MLF51-2622
|
||||
046 -9.58 15.10 4.00 3.00 MLF52-2622
|
||||
047 -13.17 13.43 4.00 3.00 MLF53-2622
|
||||
048 -16.66 11.39 4.00 3.00 MLF54-2622
|
||||
049 -20.76 9.06 4.00 3.00 MLF55-2622
|
||||
050 -24.71 5.73 4.00 3.00 MLF56-2622
|
||||
051 -7.17 12.78 4.00 3.00 MLF61-2622
|
||||
052 -10.58 11.08 4.00 3.00 MLF62-2622
|
||||
053 -13.93 9.16 4.00 3.00 MLF63-2622
|
||||
054 -17.37 7.29 4.00 3.00 MLF64-2622
|
||||
055 -20.83 4.87 4.00 3.00 MLF65-2622
|
||||
056 -23.40 1.59 4.00 3.00 MLF66-2622
|
||||
057 -25.90 -2.51 4.00 3.00 MLF67-2622
|
||||
058 -6.96 -27.32 4.00 3.00 MLO11-2622
|
||||
059 -11.88 -25.97 4.00 3.00 MLO12-2622
|
||||
060 -16.48 -23.69 4.00 3.00 MLO13-2622
|
||||
061 -20.64 -20.44 4.00 3.00 MLO14-2622
|
||||
062 -4.82 -30.75 4.00 3.00 MLO21-2622
|
||||
063 -10.11 -29.77 4.00 3.00 MLO22-2622
|
||||
064 -15.52 -27.87 4.00 3.00 MLO23-2622
|
||||
065 -20.40 -24.85 4.00 3.00 MLO24-2622
|
||||
066 -7.92 -33.45 4.00 3.00 MLO31-2622
|
||||
067 -13.84 -31.94 4.00 3.00 MLO32-2622
|
||||
068 -19.61 -29.16 4.00 3.00 MLO33-2622
|
||||
069 -24.70 -25.44 4.00 3.00 MLO34-2622
|
||||
070 -5.16 -36.86 4.00 3.00 MLO41-2622
|
||||
071 -11.67 -35.84 4.00 3.00 MLO42-2622
|
||||
072 -17.98 -33.55 4.00 3.00 MLO43-2622
|
||||
073 -23.91 -30.00 4.00 3.00 MLO44-2622
|
||||
074 -8.79 -39.34 4.00 3.00 MLO51-2622
|
||||
075 -15.83 -37.54 4.00 3.00 MLO52-2622
|
||||
076 -22.47 -34.34 4.00 3.00 MLO53-2622
|
||||
077 -4.98 -13.36 4.00 3.00 MLP11-2622
|
||||
078 -10.20 -10.01 4.00 3.00 MLP12-2622
|
||||
079 -3.80 -16.69 4.00 3.00 MLP21-2622
|
||||
080 -8.73 -13.30 4.00 3.00 MLP22-2622
|
||||
081 -13.58 -8.80 4.00 3.00 MLP23-2622
|
||||
082 -5.66 -19.72 4.00 3.00 MLP31-2622
|
||||
083 -8.41 -16.83 4.00 3.00 MLP32-2622
|
||||
084 -12.08 -14.80 4.00 3.00 MLP33-2622
|
||||
085 -15.13 -11.95 4.00 3.00 MLP34-2622
|
||||
086 -17.18 -8.63 4.00 3.00 MLP35-2622
|
||||
087 -9.92 -20.16 4.00 3.00 MLP41-2622
|
||||
088 -13.37 -18.09 4.00 3.00 MLP42-2622
|
||||
089 -16.59 -15.58 4.00 3.00 MLP43-2622
|
||||
090 -19.06 -11.87 4.00 3.00 MLP44-2622
|
||||
091 -20.87 -8.06 4.00 3.00 MLP45-2622
|
||||
092 -4.02 -24.07 4.00 3.00 MLP51-2622
|
||||
093 -8.77 -23.79 4.00 3.00 MLP52-2622
|
||||
094 -12.92 -22.08 4.00 3.00 MLP53-2622
|
||||
095 -16.83 -19.50 4.00 3.00 MLP54-2622
|
||||
096 -20.23 -16.32 4.00 3.00 MLP55-2622
|
||||
097 -22.76 -11.97 4.00 3.00 MLP56-2622
|
||||
098 -24.58 -7.58 4.00 3.00 MLP57-2622
|
||||
099 -27.14 12.98 4.00 3.00 MLT11-2622
|
||||
100 -28.19 7.51 4.00 3.00 MLT12-2622
|
||||
101 -28.08 2.09 4.00 3.00 MLT13-2622
|
||||
102 -28.56 -5.98 4.00 3.00 MLT14-2622
|
||||
103 -26.96 -11.17 4.00 3.00 MLT15-2622
|
||||
104 -24.11 -16.46 4.00 3.00 MLT16-2622
|
||||
105 -27.30 17.85 4.00 3.00 MLT21-2622
|
||||
106 -31.47 10.04 4.00 3.00 MLT22-2622
|
||||
107 -31.85 3.70 4.00 3.00 MLT23-2622
|
||||
108 -32.08 -2.62 4.00 3.00 MLT24-2622
|
||||
109 -31.09 -9.80 4.00 3.00 MLT25-2622
|
||||
110 -28.71 -15.38 4.00 3.00 MLT26-2622
|
||||
111 -24.78 -20.78 4.00 3.00 MLT27-2622
|
||||
112 -28.61 21.64 4.00 3.00 MLT31-2622
|
||||
113 -32.09 15.32 4.00 3.00 MLT32-2622
|
||||
114 -35.40 5.79 4.00 3.00 MLT33-2622
|
||||
115 -35.85 -1.29 4.00 3.00 MLT34-2622
|
||||
116 -34.97 -7.76 4.00 3.00 MLT35-2622
|
||||
117 -32.89 -13.91 4.00 3.00 MLT36-2622
|
||||
118 -29.32 -20.20 4.00 3.00 MLT37-2622
|
||||
119 -33.87 18.93 4.00 3.00 MLT41-2622
|
||||
120 -36.68 11.37 4.00 3.00 MLT42-2622
|
||||
121 -38.92 2.11 4.00 3.00 MLT43-2622
|
||||
122 -38.70 -5.16 4.00 3.00 MLT44-2622
|
||||
123 -36.95 -12.13 4.00 3.00 MLT45-2622
|
||||
124 -33.72 -18.79 4.00 3.00 MLT46-2622
|
||||
125 -29.28 -25.28 4.00 3.00 MLT47-2622
|
||||
126 -38.78 14.74 4.00 3.00 MLT51-2622
|
||||
127 -41.29 6.62 4.00 3.00 MLT52-2622
|
||||
128 -41.87 -1.80 4.00 3.00 MLT53-2622
|
||||
129 -40.62 -9.63 4.00 3.00 MLT54-2622
|
||||
130 -37.78 -16.89 4.00 3.00 MLT55-2622
|
||||
131 -33.73 -24.02 4.00 3.00 MLT56-2622
|
||||
132 -28.51 -29.92 4.00 3.00 MLT57-2622
|
||||
133 -0.24 10.97 4.00 3.00 MRC11-2622
|
||||
134 2.99 8.95 4.00 3.00 MRC12-2622
|
||||
135 6.57 7.62 4.00 3.00 MRC13-2622
|
||||
136 10.22 5.56 4.00 3.00 MRC14-2622
|
||||
137 13.27 3.22 4.00 3.00 MRC15-2622
|
||||
138 15.86 0.21 4.00 3.00 MRC16-2622
|
||||
139 18.32 -3.45 4.00 3.00 MRC17-2622
|
||||
140 3.53 5.28 4.00 3.00 MRC21-2622
|
||||
141 7.00 3.85 4.00 3.00 MRC22-2622
|
||||
142 10.06 1.68 4.00 3.00 MRC23-2622
|
||||
143 12.33 -1.20 4.00 3.00 MRC24-2622
|
||||
144 14.73 -4.52 4.00 3.00 MRC25-2622
|
||||
145 8.51 -1.76 4.00 3.00 MRC31-2622
|
||||
146 11.17 -5.14 4.00 3.00 MRC32-2622
|
||||
147 5.51 0.46 4.00 3.00 MRC41-2622
|
||||
148 7.56 -5.33 4.00 3.00 MRC42-2622
|
||||
149 -0.17 4.62 4.00 3.00 MRC51-2622
|
||||
150 1.93 1.46 4.00 3.00 MRC52-2622
|
||||
151 4.78 -3.16 4.00 3.00 MRC53-2622
|
||||
152 4.39 -6.98 4.00 3.00 MRC54-2622
|
||||
153 2.73 -10.10 4.00 3.00 MRC55-2622
|
||||
154 -0.07 -1.75 4.00 3.00 MRC61-2622
|
||||
155 1.58 -4.86 4.00 3.00 MRC62-2622
|
||||
156 -0.15 -8.08 4.00 3.00 MRC63-2622
|
||||
157 2.97 28.24 4.00 3.00 MRF11-2622
|
||||
158 8.25 27.25 4.00 3.00 MRF12-2622
|
||||
159 13.54 25.74 4.00 3.00 MRF13-2622
|
||||
160 18.74 24.12 4.00 3.00 MRF14-2622
|
||||
161 0.03 25.52 4.00 3.00 MRF21-2622
|
||||
162 4.63 24.85 4.00 3.00 MRF22-2622
|
||||
163 9.03 23.67 4.00 3.00 MRF23-2622
|
||||
164 13.78 21.87 4.00 3.00 MRF24-2622
|
||||
165 18.19 20.13 4.00 3.00 MRF25-2622
|
||||
166 2.05 22.22 4.00 3.00 MRF31-2622
|
||||
167 6.27 21.38 4.00 3.00 MRF32-2622
|
||||
168 10.63 19.79 4.00 3.00 MRF33-2622
|
||||
169 14.57 17.90 4.00 3.00 MRF34-2622
|
||||
170 18.54 15.70 4.00 3.00 MRF35-2622
|
||||
171 -0.22 19.42 4.00 3.00 MRF41-2622
|
||||
172 3.75 18.84 4.00 3.00 MRF42-2622
|
||||
173 7.86 17.57 4.00 3.00 MRF43-2622
|
||||
174 11.53 15.78 4.00 3.00 MRF44-2622
|
||||
175 15.55 13.76 4.00 3.00 MRF45-2622
|
||||
176 19.83 10.96 4.00 3.00 MRF46-2622
|
||||
177 1.08 16.23 4.00 3.00 MRF51-2622
|
||||
178 5.20 15.33 4.00 3.00 MRF52-2622
|
||||
179 8.81 13.68 4.00 3.00 MRF53-2622
|
||||
180 12.37 11.71 4.00 3.00 MRF54-2622
|
||||
181 16.53 9.44 4.00 3.00 MRF55-2622
|
||||
182 20.54 6.21 4.00 3.00 MRF56-2622
|
||||
183 2.82 12.87 4.00 3.00 MRF61-2622
|
||||
184 6.27 11.29 4.00 3.00 MRF62-2622
|
||||
185 9.66 9.43 4.00 3.00 MRF63-2622
|
||||
186 13.14 7.59 4.00 3.00 MRF64-2622
|
||||
187 16.52 5.22 4.00 3.00 MRF65-2622
|
||||
188 19.31 2.05 4.00 3.00 MRF66-2622
|
||||
189 21.91 -1.92 4.00 3.00 MRF67-2622
|
||||
190 3.46 -27.20 4.00 3.00 MRO11-2622
|
||||
191 8.35 -25.76 4.00 3.00 MRO12-2622
|
||||
192 12.92 -23.40 4.00 3.00 MRO13-2622
|
||||
193 17.02 -20.06 4.00 3.00 MRO14-2622
|
||||
194 1.43 -30.69 4.00 3.00 MRO21-2622
|
||||
195 6.66 -29.60 4.00 3.00 MRO22-2622
|
||||
196 12.02 -27.57 4.00 3.00 MRO23-2622
|
||||
197 16.88 -24.46 4.00 3.00 MRO24-2622
|
||||
198 4.55 -33.35 4.00 3.00 MRO31-2622
|
||||
199 10.46 -31.70 4.00 3.00 MRO32-2622
|
||||
200 16.07 -28.88 4.00 3.00 MRO33-2622
|
||||
201 21.16 -24.93 4.00 3.00 MRO34-2622
|
||||
202 1.88 -36.78 4.00 3.00 MRO41-2622
|
||||
203 8.37 -35.64 4.00 3.00 MRO42-2622
|
||||
204 14.63 -33.19 4.00 3.00 MRO43-2622
|
||||
205 20.45 -29.57 4.00 3.00 MRO44-2622
|
||||
206 5.57 -39.20 4.00 3.00 MRO51-2622
|
||||
207 12.57 -37.26 4.00 3.00 MRO52-2622
|
||||
208 19.11 -33.96 4.00 3.00 MRO53-2622
|
||||
209 1.20 -13.27 4.00 3.00 MRP11-2622
|
||||
210 6.34 -9.81 4.00 3.00 MRP12-2622
|
||||
211 0.06 -16.65 4.00 3.00 MRP21-2622
|
||||
212 4.94 -13.15 4.00 3.00 MRP22-2622
|
||||
213 9.72 -8.56 4.00 3.00 MRP23-2622
|
||||
214 2.03 -19.64 4.00 3.00 MRP31-2622
|
||||
215 4.72 -16.72 4.00 3.00 MRP32-2622
|
||||
216 8.28 -14.64 4.00 3.00 MRP33-2622
|
||||
217 11.32 -11.68 4.00 3.00 MRP34-2622
|
||||
218 13.30 -8.29 4.00 3.00 MRP35-2622
|
||||
219 6.32 -19.99 4.00 3.00 MRP41-2622
|
||||
220 9.66 -17.86 4.00 3.00 MRP42-2622
|
||||
221 12.83 -15.29 4.00 3.00 MRP43-2622
|
||||
222 15.21 -11.53 4.00 3.00 MRP44-2622
|
||||
223 16.99 -7.64 4.00 3.00 MRP45-2622
|
||||
224 0.42 -24.03 4.00 3.00 MRP51-2622
|
||||
225 5.29 -23.71 4.00 3.00 MRP52-2622
|
||||
226 9.32 -21.86 4.00 3.00 MRP53-2622
|
||||
227 13.19 -19.21 4.00 3.00 MRP54-2622
|
||||
228 16.49 -15.99 4.00 3.00 MRP55-2622
|
||||
229 18.98 -11.54 4.00 3.00 MRP56-2622
|
||||
230 20.69 -7.11 4.00 3.00 MRP57-2622
|
||||
231 22.81 13.51 4.00 3.00 MRT11-2622
|
||||
232 23.97 8.09 4.00 3.00 MRT12-2622
|
||||
233 23.97 2.65 4.00 3.00 MRT13-2622
|
||||
234 24.63 -5.42 4.00 3.00 MRT14-2622
|
||||
235 23.16 -10.65 4.00 3.00 MRT15-2622
|
||||
236 20.37 -16.02 4.00 3.00 MRT16-2622
|
||||
237 22.88 18.38 4.00 3.00 MRT21-2622
|
||||
238 27.23 10.62 4.00 3.00 MRT22-2622
|
||||
239 27.73 4.35 4.00 3.00 MRT23-2622
|
||||
240 28.08 -1.95 4.00 3.00 MRT24-2622
|
||||
241 27.24 -9.21 4.00 3.00 MRT25-2622
|
||||
242 24.97 -14.84 4.00 3.00 MRT26-2622
|
||||
243 21.15 -20.30 4.00 3.00 MRT27-2622
|
||||
244 24.07 22.26 4.00 3.00 MRT31-2622
|
||||
245 27.72 15.94 4.00 3.00 MRT32-2622
|
||||
246 31.24 6.55 4.00 3.00 MRT33-2622
|
||||
247 31.84 -0.55 4.00 3.00 MRT34-2622
|
||||
248 31.09 -7.10 4.00 3.00 MRT35-2622
|
||||
249 29.13 -13.33 4.00 3.00 MRT36-2622
|
||||
250 25.63 -19.73 4.00 3.00 MRT37-2622
|
||||
251 29.40 19.66 4.00 3.00 MRT41-2622
|
||||
252 32.38 12.17 4.00 3.00 MRT42-2622
|
||||
253 34.86 2.97 4.00 3.00 MRT43-2622
|
||||
254 34.80 -4.39 4.00 3.00 MRT44-2622
|
||||
255 33.11 -11.36 4.00 3.00 MRT45-2622
|
||||
256 30.03 -18.16 4.00 3.00 MRT46-2622
|
||||
257 25.54 -24.88 4.00 3.00 MRT47-2622
|
||||
258 34.47 15.52 4.00 3.00 MRT51-2622
|
||||
259 37.12 7.54 4.00 3.00 MRT52-2622
|
||||
260 37.93 -0.94 4.00 3.00 MRT53-2622
|
||||
261 36.82 -8.89 4.00 3.00 MRT54-2622
|
||||
262 34.10 -16.25 4.00 3.00 MRT55-2622
|
||||
263 30.13 -23.45 4.00 3.00 MRT56-2622
|
||||
264 25.07 -29.43 4.00 3.00 MRT57-2622
|
||||
265 -2.13 7.84 4.00 3.00 MZC01-2622
|
||||
266 -2.05 1.38 4.00 3.00 MZC02-2622
|
||||
267 -1.99 -5.04 4.00 3.00 MZC03-2622
|
||||
268 -1.93 -11.44 4.00 3.00 MZC04-2622
|
||||
269 -2.33 28.50 4.00 3.00 MZF01-2622
|
||||
270 -2.28 22.54 4.00 3.00 MZF02-2622
|
||||
271 -2.20 14.52 4.00 3.00 MZF03-2622
|
||||
272 -1.77 -27.22 4.00 3.00 MZO01-2622
|
||||
273 -1.71 -34.04 4.00 3.00 MZO02-2622
|
||||
274 -1.66 -39.69 4.00 3.00 MZO03-2622
|
||||
275 -1.81 -21.05 4.00 3.00 MZP01-2622
|
||||
153
mne/channels/data/layouts/CTF151.lay
Normal file
@@ -0,0 +1,153 @@
|
||||
1 -0.440000 -4.000000 0.551100 0.351100 MLC11
|
||||
2 -1.200000 -4.130000 0.551100 0.351100 MLC12
|
||||
3 -2.220000 -4.270000 0.551100 0.351100 MLC13
|
||||
4 -2.820000 -4.710000 0.551100 0.351100 MLC14
|
||||
5 -3.340000 -5.230000 0.551100 0.351100 MLC15
|
||||
6 -0.820000 -4.550000 0.551100 0.351100 MLC21
|
||||
7 -1.620000 -4.570000 0.551100 0.351100 MLC22
|
||||
8 -2.160000 -4.970000 0.551100 0.351100 MLC23
|
||||
9 -2.640000 -5.370000 0.551100 0.351100 MLC24
|
||||
10 -1.270000 -5.050000 0.551100 0.351100 MLC31
|
||||
11 -1.780000 -5.450000 0.551100 0.351100 MLC32
|
||||
12 -1.300000 -5.930000 0.551100 0.351100 MLC33
|
||||
13 -0.440000 -5.050000 0.551100 0.351100 MLC41
|
||||
14 -0.820000 -5.530000 0.551100 0.351100 MLC42
|
||||
15 -0.400000 -6.010000 0.551100 0.351100 MLC43
|
||||
16 -1.170000 -2.010000 0.551100 0.351100 MLF11
|
||||
17 -2.260000 -2.230000 0.551100 0.351100 MLF12
|
||||
18 -0.490000 -2.300000 0.551100 0.351100 MLF21
|
||||
19 -1.540000 -2.470000 0.551100 0.351100 MLF22
|
||||
20 -2.540000 -2.750000 0.551100 0.351100 MLF23
|
||||
21 -1.000000 -2.750000 0.551100 0.351100 MLF31
|
||||
22 -1.950000 -2.980000 0.551100 0.351100 MLF32
|
||||
23 -2.780000 -3.300000 0.551100 0.351100 MLF33
|
||||
24 -3.440000 -3.770000 0.551100 0.351100 MLF34
|
||||
25 -0.450000 -3.100000 0.551100 0.351100 MLF41
|
||||
26 -1.380000 -3.260000 0.551100 0.351100 MLF42
|
||||
27 -2.280000 -3.570000 0.551100 0.351100 MLF43
|
||||
28 -2.870000 -4.060000 0.551100 0.351100 MLF44
|
||||
29 -3.500000 -4.510000 0.551100 0.351100 MLF45
|
||||
30 -0.850000 -3.580000 0.551100 0.351100 MLF51
|
||||
31 -1.700000 -3.790000 0.551100 0.351100 MLF52
|
||||
32 -0.470000 -7.690000 0.551100 0.351100 MLO11
|
||||
33 -1.650000 -7.420000 0.551100 0.351100 MLO12
|
||||
34 -1.210000 -7.930000 0.551100 0.351100 MLO21
|
||||
35 -2.350000 -7.580000 0.551100 0.351100 MLO22
|
||||
36 -0.600000 -8.400000 0.551100 0.351100 MLO31
|
||||
37 -1.920000 -8.120000 0.551100 0.351100 MLO32
|
||||
38 -3.110000 -7.670000 0.551100 0.351100 MLO33
|
||||
39 -1.400000 -8.560000 0.551100 0.351100 MLO41
|
||||
40 -2.750000 -8.210000 0.551100 0.351100 MLO42
|
||||
41 -3.910000 -7.620000 0.551100 0.351100 MLO43
|
||||
42 -0.840000 -6.390000 0.551100 0.351100 MLP11
|
||||
43 -1.710000 -6.320000 0.551100 0.351100 MLP12
|
||||
44 -2.240000 -5.870000 0.551100 0.351100 MLP13
|
||||
45 -0.440000 -6.900000 0.551100 0.351100 MLP21
|
||||
46 -1.220000 -6.760000 0.551100 0.351100 MLP22
|
||||
47 -0.970000 -7.220000 0.551100 0.351100 MLP31
|
||||
48 -1.900000 -6.880000 0.551100 0.351100 MLP32
|
||||
49 -2.470000 -6.390000 0.551100 0.351100 MLP33
|
||||
50 -2.990000 -5.850000 0.551100 0.351100 MLP34
|
||||
51 -3.420000 -3.120000 0.551100 0.351100 MLT11
|
||||
52 -4.100000 -4.200000 0.551100 0.351100 MLT12
|
||||
53 -4.040000 -5.030000 0.551100 0.351100 MLT13
|
||||
54 -3.780000 -5.770000 0.551100 0.351100 MLT14
|
||||
55 -3.210000 -6.440000 0.551100 0.351100 MLT15
|
||||
56 -2.570000 -7.010000 0.551100 0.351100 MLT16
|
||||
57 -3.320000 -2.550000 0.551100 0.351100 MLT21
|
||||
58 -4.260000 -3.520000 0.551100 0.351100 MLT22
|
||||
59 -4.720000 -4.710000 0.551100 0.351100 MLT23
|
||||
60 -4.520000 -5.590000 0.551100 0.351100 MLT24
|
||||
61 -4.040000 -6.350000 0.551100 0.351100 MLT25
|
||||
62 -3.280000 -7.060000 0.551100 0.351100 MLT26
|
||||
63 -4.340000 -2.900000 0.551100 0.351100 MLT31
|
||||
64 -5.040000 -4.050000 0.551100 0.351100 MLT32
|
||||
65 -5.200000 -5.210000 0.551100 0.351100 MLT33
|
||||
66 -4.820000 -6.140000 0.551100 0.351100 MLT34
|
||||
67 -4.090000 -7.000000 0.551100 0.351100 MLT35
|
||||
68 -5.210000 -3.450000 0.551100 0.351100 MLT41
|
||||
69 -5.640000 -4.620000 0.551100 0.351100 MLT42
|
||||
70 -5.500000 -5.730000 0.551100 0.351100 MLT43
|
||||
71 -4.910000 -6.720000 0.551100 0.351100 MLT44
|
||||
72 0.410000 -4.000000 0.551100 0.351100 MRC11
|
||||
73 1.170000 -4.130000 0.551100 0.351100 MRC12
|
||||
74 2.200000 -4.270000 0.551100 0.351100 MRC13
|
||||
75 2.800000 -4.710000 0.551100 0.351100 MRC14
|
||||
76 3.320000 -5.230000 0.551100 0.351100 MRC15
|
||||
77 0.800000 -4.560000 0.551100 0.351100 MRC21
|
||||
78 1.600000 -4.570000 0.551100 0.351100 MRC22
|
||||
79 2.140000 -4.970000 0.551100 0.351100 MRC23
|
||||
80 2.620000 -5.370000 0.551100 0.351100 MRC24
|
||||
81 1.260000 -5.050000 0.551100 0.351100 MRC31
|
||||
82 1.760000 -5.450000 0.551100 0.351100 MRC32
|
||||
83 1.280000 -5.930000 0.551100 0.351100 MRC33
|
||||
84 0.420000 -5.050000 0.551100 0.351100 MRC41
|
||||
85 0.810000 -5.540000 0.551100 0.351100 MRC42
|
||||
86 0.380000 -6.010000 0.551100 0.351100 MRC43
|
||||
87 1.130000 -2.010000 0.551100 0.351100 MRF11
|
||||
88 2.240000 -2.230000 0.551100 0.351100 MRF12
|
||||
89 0.460000 -2.290000 0.551100 0.351100 MRF21
|
||||
90 1.510000 -2.470000 0.551100 0.351100 MRF22
|
||||
91 2.520000 -2.740000 0.551100 0.351100 MRF23
|
||||
92 0.970000 -2.740000 0.551100 0.351100 MRF31
|
||||
93 1.920000 -2.980000 0.551100 0.351100 MRF32
|
||||
94 2.760000 -3.300000 0.551100 0.351100 MRF33
|
||||
95 3.420000 -3.770000 0.551100 0.351100 MRF34
|
||||
96 0.420000 -3.100000 0.551100 0.351100 MRF41
|
||||
97 1.360000 -3.260000 0.551100 0.351100 MRF42
|
||||
98 2.260000 -3.570000 0.551100 0.351100 MRF43
|
||||
99 2.840000 -4.050000 0.551100 0.351100 MRF44
|
||||
100 3.480000 -4.510000 0.551100 0.351100 MRF45
|
||||
101 0.820000 -3.580000 0.551100 0.351100 MRF51
|
||||
102 1.670000 -3.790000 0.551100 0.351100 MRF52
|
||||
103 0.470000 -7.690000 0.551100 0.351100 MRO11
|
||||
104 1.640000 -7.420000 0.551100 0.351100 MRO12
|
||||
105 1.200000 -7.930000 0.551100 0.351100 MRO21
|
||||
106 2.350000 -7.580000 0.551100 0.351100 MRO22
|
||||
107 0.580000 -8.390000 0.551100 0.351100 MRO31
|
||||
108 1.910000 -8.110000 0.551100 0.351100 MRO32
|
||||
109 3.110000 -7.670000 0.551100 0.351100 MRO33
|
||||
110 1.380000 -8.570000 0.551100 0.351100 MRO41
|
||||
111 2.750000 -8.220000 0.551100 0.351100 MRO42
|
||||
112 3.900000 -7.610000 0.551100 0.351100 MRO43
|
||||
113 0.820000 -6.380000 0.551100 0.351100 MRP11
|
||||
114 1.700000 -6.320000 0.551100 0.351100 MRP12
|
||||
115 2.220000 -5.870000 0.551100 0.351100 MRP13
|
||||
116 0.420000 -6.900000 0.551100 0.351100 MRP21
|
||||
117 1.200000 -6.750000 0.551100 0.351100 MRP22
|
||||
118 0.960000 -7.220000 0.551100 0.351100 MRP31
|
||||
119 1.880000 -6.870000 0.551100 0.351100 MRP32
|
||||
120 2.470000 -6.390000 0.551100 0.351100 MRP33
|
||||
121 2.990000 -5.850000 0.551100 0.351100 MRP34
|
||||
122 3.390000 -3.120000 0.551100 0.351100 MRT11
|
||||
123 4.070000 -4.190000 0.551100 0.351100 MRT12
|
||||
124 4.020000 -5.030000 0.551100 0.351100 MRT13
|
||||
125 3.760000 -5.770000 0.551100 0.351100 MRT14
|
||||
126 3.200000 -6.430000 0.551100 0.351100 MRT15
|
||||
127 2.570000 -7.010000 0.551100 0.351100 MRT16
|
||||
128 3.300000 -2.540000 0.551100 0.351100 MRT21
|
||||
129 4.230000 -3.510000 0.551100 0.351100 MRT22
|
||||
130 4.700000 -4.710000 0.551100 0.351100 MRT23
|
||||
131 4.500000 -5.590000 0.551100 0.351100 MRT24
|
||||
132 4.020000 -6.360000 0.551100 0.351100 MRT25
|
||||
133 3.260000 -7.060000 0.551100 0.351100 MRT26
|
||||
134 4.310000 -2.900000 0.551100 0.351100 MRT31
|
||||
135 5.020000 -4.050000 0.551100 0.351100 MRT32
|
||||
136 5.180000 -5.210000 0.551100 0.351100 MRT33
|
||||
137 4.800000 -6.140000 0.551100 0.351100 MRT34
|
||||
138 4.080000 -7.000000 0.551100 0.351100 MRT35
|
||||
139 5.200000 -3.450000 0.551100 0.351100 MRT41
|
||||
140 5.620000 -4.610000 0.551100 0.351100 MRT42
|
||||
141 5.480000 -5.730000 0.551100 0.351100 MRT43
|
||||
142 4.900000 -6.710000 0.551100 0.351100 MRT44
|
||||
143 0.000000 -4.510000 0.551100 0.351100 MZC01
|
||||
144 0.000000 -5.550000 0.551100 0.351100 MZC02
|
||||
145 0.000000 -1.930000 0.551100 0.351100 MZF01
|
||||
146 0.000000 -2.660000 0.551100 0.351100 MZF02
|
||||
147 0.000000 -3.510000 0.551100 0.351100 MZF03
|
||||
148 0.000000 -8.050000 0.551100 0.351100 MZO01
|
||||
149 0.000000 -8.660000 0.551100 0.351100 MZO02
|
||||
150 0.000000 -6.470000 0.551100 0.351100 MZP01
|
||||
151 0.000000 -7.290000 0.551100 0.351100 MZP02
|
||||
152 5.000000 -2.000000 0.551100 0.351100 SCALE
|
||||
153 -5.50000 -1.500000 0.551100 0.351100 COMNT
|
||||
275
mne/channels/data/layouts/CTF275.lay
Normal file
@@ -0,0 +1,275 @@
|
||||
1 -0.029414 0.428191 0.100000 0.040000 MLC11
|
||||
2 -0.105398 0.378716 0.100000 0.040000 MLC12
|
||||
3 -0.187924 0.341472 0.100000 0.040000 MLC13
|
||||
4 -0.268071 0.285079 0.100000 0.040000 MLC14
|
||||
5 -0.330692 0.221374 0.100000 0.040000 MLC15
|
||||
6 -0.378697 0.144627 0.100000 0.040000 MLC16
|
||||
7 -0.411309 0.049716 0.100000 0.040000 MLC17
|
||||
8 -0.112105 0.295427 0.100000 0.040000 MLC21
|
||||
9 -0.189457 0.259287 0.100000 0.040000 MLC22
|
||||
10 -0.254180 0.203140 0.100000 0.040000 MLC23
|
||||
11 -0.298355 0.137997 0.100000 0.040000 MLC24
|
||||
12 -0.337649 0.050767 0.100000 0.040000 MLC25
|
||||
13 -0.213750 0.138862 0.100000 0.040000 MLC31
|
||||
14 -0.266243 0.056433 0.100000 0.040000 MLC32
|
||||
15 -0.150010 0.191395 0.100000 0.040000 MLC41
|
||||
16 -0.188739 0.067511 0.100000 0.040000 MLC42
|
||||
17 -0.027405 0.285532 0.100000 0.040000 MLC51
|
||||
18 -0.072194 0.217381 0.100000 0.040000 MLC52
|
||||
19 -0.130467 0.119358 0.100000 0.040000 MLC53
|
||||
20 -0.119656 0.041473 0.100000 0.040000 MLC54
|
||||
21 -0.083927 -0.021961 0.100000 0.040000 MLC55
|
||||
22 -0.027810 0.155198 0.100000 0.040000 MLC61
|
||||
23 -0.062042 0.088583 0.100000 0.040000 MLC62
|
||||
24 -0.025587 0.023975 0.100000 0.040000 MLC63
|
||||
25 -0.154623 0.879985 0.100000 0.040000 MLF11
|
||||
26 -0.322264 0.823233 0.100000 0.040000 MLF12
|
||||
27 -0.478342 0.740223 0.100000 0.040000 MLF13
|
||||
28 -0.622338 0.633371 0.100000 0.040000 MLF14
|
||||
29 -0.052995 0.810917 0.100000 0.040000 MLF21
|
||||
30 -0.193258 0.778479 0.100000 0.040000 MLF22
|
||||
31 -0.319702 0.726613 0.100000 0.040000 MLF23
|
||||
32 -0.447065 0.639878 0.100000 0.040000 MLF24
|
||||
33 -0.551024 0.545805 0.100000 0.040000 MLF25
|
||||
34 -0.106993 0.717661 0.100000 0.040000 MLF31
|
||||
35 -0.227303 0.683510 0.100000 0.040000 MLF32
|
||||
36 -0.344973 0.613898 0.100000 0.040000 MLF33
|
||||
37 -0.437794 0.535071 0.100000 0.040000 MLF34
|
||||
38 -0.516944 0.440135 0.100000 0.040000 MLF35
|
||||
39 -0.037498 0.646457 0.100000 0.040000 MLF41
|
||||
40 -0.145663 0.629747 0.100000 0.040000 MLF42
|
||||
41 -0.257022 0.575998 0.100000 0.040000 MLF43
|
||||
42 -0.344741 0.511350 0.100000 0.040000 MLF44
|
||||
43 -0.434608 0.430669 0.100000 0.040000 MLF45
|
||||
44 -0.512928 0.325699 0.100000 0.040000 MLF46
|
||||
45 -0.065241 0.564676 0.100000 0.040000 MLF51
|
||||
46 -0.176866 0.530203 0.100000 0.040000 MLF52
|
||||
47 -0.264799 0.476609 0.100000 0.040000 MLF53
|
||||
48 -0.344149 0.409817 0.100000 0.040000 MLF54
|
||||
49 -0.432009 0.328939 0.100000 0.040000 MLF55
|
||||
50 -0.502082 0.225317 0.100000 0.040000 MLF56
|
||||
51 -0.108196 0.473300 0.100000 0.040000 MLF61
|
||||
52 -0.191454 0.428184 0.100000 0.040000 MLF62
|
||||
53 -0.268505 0.371569 0.100000 0.040000 MLF63
|
||||
54 -0.343162 0.314227 0.100000 0.040000 MLF64
|
||||
55 -0.415355 0.241209 0.100000 0.040000 MLF65
|
||||
56 -0.459435 0.157639 0.100000 0.040000 MLF66
|
||||
57 -0.484998 0.050963 0.100000 0.040000 MLF67
|
||||
58 -0.086701 -0.382545 0.100000 0.040000 MLO11
|
||||
59 -0.173621 -0.361571 0.100000 0.040000 MLO12
|
||||
60 -0.257557 -0.329066 0.100000 0.040000 MLO13
|
||||
61 -0.337129 -0.278810 0.100000 0.040000 MLO14
|
||||
62 -0.050176 -0.456757 0.100000 0.040000 MLO21
|
||||
63 -0.138937 -0.440153 0.100000 0.040000 MLO22
|
||||
64 -0.234625 -0.414329 0.100000 0.040000 MLO23
|
||||
65 -0.323700 -0.370345 0.100000 0.040000 MLO24
|
||||
66 -0.099528 -0.519048 0.100000 0.040000 MLO31
|
||||
67 -0.201576 -0.499713 0.100000 0.040000 MLO32
|
||||
68 -0.300736 -0.464088 0.100000 0.040000 MLO33
|
||||
69 -0.395767 -0.412426 0.100000 0.040000 MLO34
|
||||
70 -0.054171 -0.598130 0.100000 0.040000 MLO41
|
||||
71 -0.162924 -0.587463 0.100000 0.040000 MLO42
|
||||
72 -0.270457 -0.559057 0.100000 0.040000 MLO43
|
||||
73 -0.375045 -0.514503 0.100000 0.040000 MLO44
|
||||
74 -0.114841 -0.674066 0.100000 0.040000 MLO51
|
||||
75 -0.232779 -0.654920 0.100000 0.040000 MLO52
|
||||
76 -0.347032 -0.617457 0.100000 0.040000 MLO53
|
||||
77 -0.050706 -0.086860 0.100000 0.040000 MLP11
|
||||
78 -0.157880 -0.022819 0.100000 0.040000 MLP12
|
||||
79 -0.027384 -0.156541 0.100000 0.040000 MLP21
|
||||
80 -0.125969 -0.090281 0.100000 0.040000 MLP22
|
||||
81 -0.229468 -0.007021 0.100000 0.040000 MLP23
|
||||
82 -0.063851 -0.221282 0.100000 0.040000 MLP31
|
||||
83 -0.117483 -0.164444 0.100000 0.040000 MLP32
|
||||
84 -0.191075 -0.130343 0.100000 0.040000 MLP33
|
||||
85 -0.256310 -0.076997 0.100000 0.040000 MLP34
|
||||
86 -0.301408 -0.017428 0.100000 0.040000 MLP35
|
||||
87 -0.145628 -0.236552 0.100000 0.040000 MLP41
|
||||
88 -0.211609 -0.201084 0.100000 0.040000 MLP42
|
||||
89 -0.277557 -0.161143 0.100000 0.040000 MLP43
|
||||
90 -0.330491 -0.093163 0.100000 0.040000 MLP44
|
||||
91 -0.372987 -0.024823 0.100000 0.040000 MLP45
|
||||
92 -0.032003 -0.311166 0.100000 0.040000 MLP51
|
||||
93 -0.120201 -0.309697 0.100000 0.040000 MLP52
|
||||
94 -0.197411 -0.282930 0.100000 0.040000 MLP53
|
||||
95 -0.273221 -0.242434 0.100000 0.040000 MLP54
|
||||
96 -0.341326 -0.192353 0.100000 0.040000 MLP55
|
||||
97 -0.397869 -0.117824 0.100000 0.040000 MLP56
|
||||
98 -0.439023 -0.040798 0.100000 0.040000 MLP57
|
||||
99 -0.600517 0.341742 0.100000 0.040000 MLT11
|
||||
100 -0.583854 0.221014 0.100000 0.040000 MLT12
|
||||
101 -0.546672 0.118228 0.100000 0.040000 MLT13
|
||||
102 -0.525679 -0.043954 0.100000 0.040000 MLT14
|
||||
103 -0.482366 -0.132402 0.100000 0.040000 MLT15
|
||||
104 -0.408785 -0.217740 0.100000 0.040000 MLT16
|
||||
105 -0.657080 0.441193 0.100000 0.040000 MLT21
|
||||
106 -0.681569 0.225254 0.100000 0.040000 MLT22
|
||||
107 -0.647357 0.101107 0.100000 0.040000 MLT23
|
||||
108 -0.618158 -0.017119 0.100000 0.040000 MLT24
|
||||
109 -0.570925 -0.147553 0.100000 0.040000 MLT25
|
||||
110 -0.505869 -0.237678 0.100000 0.040000 MLT26
|
||||
111 -0.406336 -0.310886 0.100000 0.040000 MLT27
|
||||
112 -0.758025 0.508412 0.100000 0.040000 MLT31
|
||||
113 -0.761740 0.316423 0.100000 0.040000 MLT32
|
||||
114 -0.751268 0.088675 0.100000 0.040000 MLT33
|
||||
115 -0.712573 -0.047448 0.100000 0.040000 MLT34
|
||||
116 -0.658112 -0.159355 0.100000 0.040000 MLT35
|
||||
117 -0.592395 -0.256839 0.100000 0.040000 MLT36
|
||||
118 -0.495312 -0.345113 0.100000 0.040000 MLT37
|
||||
119 -0.885393 0.353401 0.100000 0.040000 MLT41
|
||||
120 -0.847844 0.160648 0.100000 0.040000 MLT42
|
||||
121 -0.823787 -0.043736 0.100000 0.040000 MLT43
|
||||
122 -0.758805 -0.175411 0.100000 0.040000 MLT44
|
||||
123 -0.684634 -0.280647 0.100000 0.040000 MLT45
|
||||
124 -0.591783 -0.373867 0.100000 0.040000 MLT46
|
||||
125 -0.476572 -0.454666 0.100000 0.040000 MLT47
|
||||
126 -0.983285 0.161080 0.100000 0.040000 MLT51
|
||||
127 -0.944753 -0.028756 0.100000 0.040000 MLT52
|
||||
128 -0.872989 -0.188195 0.100000 0.040000 MLT53
|
||||
129 -0.785517 -0.310620 0.100000 0.040000 MLT54
|
||||
130 -0.688014 -0.407791 0.100000 0.040000 MLT55
|
||||
131 -0.571347 -0.497554 0.100000 0.040000 MLT56
|
||||
132 -0.457303 -0.565438 0.100000 0.040000 MLT57
|
||||
133 0.063389 0.426606 0.100000 0.040000 MRC11
|
||||
134 0.137902 0.375428 0.100000 0.040000 MRC12
|
||||
135 0.219516 0.336386 0.100000 0.040000 MRC13
|
||||
136 0.297688 0.277771 0.100000 0.040000 MRC14
|
||||
137 0.355955 0.213304 0.100000 0.040000 MRC15
|
||||
138 0.404150 0.135598 0.100000 0.040000 MRC16
|
||||
139 0.434870 0.040656 0.100000 0.040000 MRC17
|
||||
140 0.142678 0.292126 0.100000 0.040000 MRC21
|
||||
141 0.219470 0.254066 0.100000 0.040000 MRC22
|
||||
142 0.281922 0.196472 0.100000 0.040000 MRC23
|
||||
143 0.325059 0.128269 0.100000 0.040000 MRC24
|
||||
144 0.361805 0.044213 0.100000 0.040000 MRC25
|
||||
145 0.240157 0.132538 0.100000 0.040000 MRC31
|
||||
146 0.290750 0.048681 0.100000 0.040000 MRC32
|
||||
147 0.178346 0.187415 0.100000 0.040000 MRC41
|
||||
148 0.213493 0.062545 0.100000 0.040000 MRC42
|
||||
149 0.058440 0.284194 0.100000 0.040000 MRC51
|
||||
150 0.101359 0.215083 0.100000 0.040000 MRC52
|
||||
151 0.156968 0.115486 0.100000 0.040000 MRC53
|
||||
152 0.144211 0.038238 0.100000 0.040000 MRC54
|
||||
153 0.106635 -0.024115 0.100000 0.040000 MRC55
|
||||
154 0.055338 0.153928 0.100000 0.040000 MRC61
|
||||
155 0.088138 0.086634 0.100000 0.040000 MRC62
|
||||
156 0.049557 0.022680 0.100000 0.040000 MRC63
|
||||
157 0.197726 0.874477 0.100000 0.040000 MRF11
|
||||
158 0.364689 0.811426 0.100000 0.040000 MRF12
|
||||
159 0.518245 0.722181 0.100000 0.040000 MRF13
|
||||
160 0.658136 0.611411 0.100000 0.040000 MRF14
|
||||
161 0.095713 0.807816 0.100000 0.040000 MRF21
|
||||
162 0.233999 0.772267 0.100000 0.040000 MRF22
|
||||
163 0.358821 0.715911 0.100000 0.040000 MRF23
|
||||
164 0.484765 0.623142 0.100000 0.040000 MRF24
|
||||
165 0.585405 0.526324 0.100000 0.040000 MRF25
|
||||
166 0.147633 0.713396 0.100000 0.040000 MRF31
|
||||
167 0.265823 0.676341 0.100000 0.040000 MRF32
|
||||
168 0.382256 0.601823 0.100000 0.040000 MRF33
|
||||
169 0.473850 0.521768 0.100000 0.040000 MRF34
|
||||
170 0.548726 0.424836 0.100000 0.040000 MRF35
|
||||
171 0.075451 0.644959 0.100000 0.040000 MRF41
|
||||
172 0.182924 0.624842 0.100000 0.040000 MRF42
|
||||
173 0.292900 0.568899 0.100000 0.040000 MRF43
|
||||
174 0.379529 0.501620 0.100000 0.040000 MRF44
|
||||
175 0.465778 0.418231 0.100000 0.040000 MRF45
|
||||
176 0.541913 0.311405 0.100000 0.040000 MRF46
|
||||
177 0.102375 0.561860 0.100000 0.040000 MRF51
|
||||
178 0.212879 0.524802 0.100000 0.040000 MRF52
|
||||
179 0.299077 0.468924 0.100000 0.040000 MRF53
|
||||
180 0.376186 0.400507 0.100000 0.040000 MRF54
|
||||
181 0.461150 0.316311 0.100000 0.040000 MRF55
|
||||
182 0.527532 0.213125 0.100000 0.040000 MRF56
|
||||
183 0.143360 0.469857 0.100000 0.040000 MRF61
|
||||
184 0.224730 0.422291 0.100000 0.040000 MRF62
|
||||
185 0.301012 0.364856 0.100000 0.040000 MRF63
|
||||
186 0.373056 0.305526 0.100000 0.040000 MRF64
|
||||
187 0.443172 0.230008 0.100000 0.040000 MRF65
|
||||
188 0.482916 0.144546 0.100000 0.040000 MRF66
|
||||
189 0.509363 0.039864 0.100000 0.040000 MRF67
|
||||
190 0.101312 -0.384464 0.100000 0.040000 MRO11
|
||||
191 0.188777 -0.365285 0.100000 0.040000 MRO12
|
||||
192 0.274286 -0.333994 0.100000 0.040000 MRO13
|
||||
193 0.354824 -0.285987 0.100000 0.040000 MRO14
|
||||
194 0.062633 -0.457476 0.100000 0.040000 MRO21
|
||||
195 0.152570 -0.440791 0.100000 0.040000 MRO22
|
||||
196 0.248565 -0.418432 0.100000 0.040000 MRO23
|
||||
197 0.338845 -0.376241 0.100000 0.040000 MRO24
|
||||
198 0.111160 -0.521375 0.100000 0.040000 MRO31
|
||||
199 0.212466 -0.502957 0.100000 0.040000 MRO32
|
||||
200 0.313063 -0.468465 0.100000 0.040000 MRO33
|
||||
201 0.409385 -0.418933 0.100000 0.040000 MRO34
|
||||
202 0.063270 -0.599845 0.100000 0.040000 MRO41
|
||||
203 0.172480 -0.589865 0.100000 0.040000 MRO42
|
||||
204 0.279919 -0.563495 0.100000 0.040000 MRO43
|
||||
205 0.386742 -0.520993 0.100000 0.040000 MRO44
|
||||
206 0.121969 -0.676100 0.100000 0.040000 MRO51
|
||||
207 0.240331 -0.658743 0.100000 0.040000 MRO52
|
||||
208 0.356156 -0.623026 0.100000 0.040000 MRO53
|
||||
209 0.071855 -0.088269 0.100000 0.040000 MRP11
|
||||
210 0.180874 -0.026656 0.100000 0.040000 MRP12
|
||||
211 0.047839 -0.157479 0.100000 0.040000 MRP21
|
||||
212 0.147221 -0.093053 0.100000 0.040000 MRP22
|
||||
213 0.252807 -0.012686 0.100000 0.040000 MRP23
|
||||
214 0.082012 -0.222790 0.100000 0.040000 MRP31
|
||||
215 0.136825 -0.166819 0.100000 0.040000 MRP32
|
||||
216 0.210796 -0.134697 0.100000 0.040000 MRP33
|
||||
217 0.277587 -0.083946 0.100000 0.040000 MRP34
|
||||
218 0.322867 -0.024718 0.100000 0.040000 MRP35
|
||||
219 0.162954 -0.240118 0.100000 0.040000 MRP41
|
||||
220 0.230510 -0.205793 0.100000 0.040000 MRP42
|
||||
221 0.296283 -0.169213 0.100000 0.040000 MRP43
|
||||
222 0.351532 -0.101316 0.100000 0.040000 MRP44
|
||||
223 0.395383 -0.032706 0.100000 0.040000 MRP45
|
||||
224 0.048690 -0.312307 0.100000 0.040000 MRP51
|
||||
225 0.137008 -0.312230 0.100000 0.040000 MRP52
|
||||
226 0.214275 -0.287336 0.100000 0.040000 MRP53
|
||||
227 0.290637 -0.248388 0.100000 0.040000 MRP54
|
||||
228 0.360555 -0.199475 0.100000 0.040000 MRP55
|
||||
229 0.419086 -0.126737 0.100000 0.040000 MRP56
|
||||
230 0.463976 -0.050387 0.100000 0.040000 MRP57
|
||||
231 0.628409 0.323946 0.100000 0.040000 MRT11
|
||||
232 0.609835 0.205866 0.100000 0.040000 MRT12
|
||||
233 0.571838 0.105198 0.100000 0.040000 MRT13
|
||||
234 0.544252 -0.054539 0.100000 0.040000 MRT14
|
||||
235 0.500732 -0.143104 0.100000 0.040000 MRT15
|
||||
236 0.427582 -0.225716 0.100000 0.040000 MRT16
|
||||
237 0.685440 0.421411 0.100000 0.040000 MRT21
|
||||
238 0.705800 0.208084 0.100000 0.040000 MRT22
|
||||
239 0.667392 0.088109 0.100000 0.040000 MRT23
|
||||
240 0.637062 -0.030086 0.100000 0.040000 MRT24
|
||||
241 0.588417 -0.159092 0.100000 0.040000 MRT25
|
||||
242 0.522350 -0.247039 0.100000 0.040000 MRT26
|
||||
243 0.422093 -0.318167 0.100000 0.040000 MRT27
|
||||
244 0.789789 0.482334 0.100000 0.040000 MRT31
|
||||
245 0.786599 0.293212 0.100000 0.040000 MRT32
|
||||
246 0.770320 0.070984 0.100000 0.040000 MRT33
|
||||
247 0.731214 -0.061690 0.100000 0.040000 MRT34
|
||||
248 0.674802 -0.172109 0.100000 0.040000 MRT35
|
||||
249 0.607500 -0.268226 0.100000 0.040000 MRT36
|
||||
250 0.510484 -0.353209 0.100000 0.040000 MRT37
|
||||
251 0.910695 0.324672 0.100000 0.040000 MRT41
|
||||
252 0.867982 0.137317 0.100000 0.040000 MRT42
|
||||
253 0.839920 -0.060661 0.100000 0.040000 MRT43
|
||||
254 0.773256 -0.189639 0.100000 0.040000 MRT44
|
||||
255 0.698444 -0.293384 0.100000 0.040000 MRT45
|
||||
256 0.604482 -0.385347 0.100000 0.040000 MRT46
|
||||
257 0.489291 -0.462983 0.100000 0.040000 MRT47
|
||||
258 1.000000 0.135648 0.100000 0.040000 MRT51
|
||||
259 0.959092 -0.049055 0.100000 0.040000 MRT52
|
||||
260 0.886964 -0.204289 0.100000 0.040000 MRT53
|
||||
261 0.796842 -0.324881 0.100000 0.040000 MRT54
|
||||
262 0.698769 -0.420596 0.100000 0.040000 MRT55
|
||||
263 0.582500 -0.506810 0.100000 0.040000 MRT56
|
||||
264 0.467934 -0.572706 0.100000 0.040000 MRT57
|
||||
265 0.016063 0.355556 0.100000 0.040000 MZC01
|
||||
266 0.014747 0.217488 0.100000 0.040000 MZC02
|
||||
267 0.013199 0.087763 0.100000 0.040000 MZC03
|
||||
268 0.011197 -0.046263 0.100000 0.040000 MZC04
|
||||
269 0.022267 0.897778 0.100000 0.040000 MZF01
|
||||
270 0.019840 0.730557 0.100000 0.040000 MZF02
|
||||
271 0.017559 0.517279 0.100000 0.040000 MZF03
|
||||
272 0.007392 -0.378522 0.100000 0.040000 MZO01
|
||||
273 0.005634 -0.528155 0.100000 0.040000 MZO02
|
||||
274 0.003722 -0.675585 0.100000 0.040000 MZO03
|
||||
275 0.008864 -0.248776 0.100000 0.040000 MZP01
|
||||
337
mne/channels/data/layouts/EEG1005.lay
Normal file
@@ -0,0 +1,337 @@
|
||||
1 -0.485328 1.493835 0.069221 0.051916 Fp1
|
||||
2 0.000000 1.570696 0.069221 0.051916 Fpz
|
||||
3 0.485501 1.493884 0.069221 0.051916 Fp2
|
||||
4 -1.154207 1.588656 0.069221 0.051916 AF9
|
||||
5 -0.923319 1.270781 0.069221 0.051916 AF7
|
||||
6 -0.706117 1.226029 0.069221 0.051916 AF5
|
||||
7 -0.477022 1.197254 0.069221 0.051916 AF3
|
||||
8 -0.240008 1.182594 0.069221 0.051916 AF1
|
||||
9 0.000000 1.178022 0.069221 0.051916 AFz
|
||||
10 0.240008 1.182594 0.069221 0.051916 AF2
|
||||
11 0.476904 1.197159 0.069221 0.051916 AF4
|
||||
12 0.706117 1.226029 0.069221 0.051916 AF6
|
||||
13 0.923319 1.270781 0.069221 0.051916 AF8
|
||||
14 1.154207 1.588656 0.069221 0.051916 AF10
|
||||
15 -1.588376 1.154294 0.069221 0.051916 F9
|
||||
16 -1.270781 0.923319 0.069221 0.051916 F7
|
||||
17 -0.968950 0.852434 0.069221 0.051916 F5
|
||||
18 -0.652084 0.812357 0.069221 0.051916 F3
|
||||
19 -0.327689 0.791876 0.069221 0.051916 F1
|
||||
20 0.000000 0.785398 0.069221 0.051916 Fz
|
||||
21 0.327689 0.791876 0.069221 0.051916 F2
|
||||
22 0.652084 0.812357 0.069221 0.051916 F4
|
||||
23 0.968950 0.852434 0.069221 0.051916 F6
|
||||
24 1.270781 0.923319 0.069221 0.051916 F8
|
||||
25 1.588496 1.154168 0.069221 0.051916 F10
|
||||
26 -1.867677 0.606883 0.069221 0.051916 FT9
|
||||
27 -1.493930 0.485359 0.069221 0.051916 FT7
|
||||
28 -1.126134 0.436152 0.069221 0.051916 FC5
|
||||
29 -0.752811 0.409634 0.069221 0.051916 FC3
|
||||
30 -0.376942 0.396836 0.069221 0.051916 FC1
|
||||
31 0.000000 0.392844 0.069221 0.051916 FCz
|
||||
32 0.376942 0.396836 0.069221 0.051916 FC2
|
||||
33 0.752811 0.409634 0.069221 0.051916 FC4
|
||||
34 1.126134 0.436152 0.069221 0.051916 FC6
|
||||
35 1.493930 0.485359 0.069221 0.051916 FT8
|
||||
36 1.867677 0.606883 0.069221 0.051916 FT10
|
||||
37 -1.963487 -0.000213 0.069221 0.051916 T9
|
||||
38 -1.570796 0.000000 0.069221 0.051916 T7
|
||||
39 -1.178106 0.000128 0.069221 0.051916 C5
|
||||
40 -0.785398 0.000111 0.069221 0.051916 C3
|
||||
41 -0.392736 0.000205 0.069221 0.051916 C1
|
||||
42 0.000000 0.000200 0.069221 0.051916 Cz
|
||||
43 0.392736 0.000103 0.069221 0.051916 C2
|
||||
44 0.785398 0.000111 0.069221 0.051916 C4
|
||||
45 1.178106 0.000128 0.069221 0.051916 C6
|
||||
46 1.570796 -0.000000 0.069221 0.051916 T8
|
||||
47 1.963487 -0.000000 0.069221 0.051916 T10
|
||||
48 -1.867677 -0.606883 0.069221 0.051916 TP9
|
||||
49 -1.494026 -0.485389 0.069221 0.051916 TP7
|
||||
50 -1.126048 -0.435839 0.069221 0.051916 CP5
|
||||
51 -0.752775 -0.409460 0.069221 0.051916 CP3
|
||||
52 -0.376804 -0.396486 0.069221 0.051916 CP1
|
||||
53 -0.000000 -0.392551 0.069221 0.051916 CPz
|
||||
54 0.376804 -0.396486 0.069221 0.051916 CP2
|
||||
55 0.752795 -0.409357 0.069221 0.051916 CP4
|
||||
56 1.126048 -0.435839 0.069221 0.051916 CP6
|
||||
57 1.494026 -0.485389 0.069221 0.051916 TP8
|
||||
58 1.867603 -0.607072 0.069221 0.051916 TP10
|
||||
59 -1.588496 -1.154168 0.069221 0.051916 P9
|
||||
60 -1.270862 -0.923378 0.069221 0.051916 P7
|
||||
61 -0.969077 -0.852293 0.069221 0.051916 P5
|
||||
62 -0.652231 -0.811998 0.069221 0.051916 P3
|
||||
63 -0.327776 -0.791360 0.069221 0.051916 P1
|
||||
64 -0.000000 -0.785257 0.069221 0.051916 Pz
|
||||
65 0.327776 -0.791360 0.069221 0.051916 P2
|
||||
66 0.652231 -0.811998 0.069221 0.051916 P4
|
||||
67 0.969077 -0.852293 0.069221 0.051916 P6
|
||||
68 1.270862 -0.923378 0.069221 0.051916 P8
|
||||
69 1.588496 -1.154168 0.069221 0.051916 P10
|
||||
70 -1.154207 -1.588656 0.069221 0.051916 PO9
|
||||
71 -0.923319 -1.270781 0.069221 0.051916 PO7
|
||||
72 -0.706303 -1.225606 0.069221 0.051916 PO5
|
||||
73 -0.476710 -1.197888 0.069221 0.051916 PO3
|
||||
74 -0.240097 -1.182523 0.069221 0.051916 PO1
|
||||
75 -0.000000 -1.178022 0.069221 0.051916 POz
|
||||
76 0.240223 -1.182505 0.069221 0.051916 PO2
|
||||
77 0.476710 -1.197888 0.069221 0.051916 PO4
|
||||
78 0.706303 -1.225606 0.069221 0.051916 PO6
|
||||
79 0.923319 -1.270781 0.069221 0.051916 PO8
|
||||
80 1.154207 -1.588656 0.069221 0.051916 PO10
|
||||
81 -0.485359 -1.493930 0.069221 0.051916 O1
|
||||
82 -0.000000 -1.570796 0.069221 0.051916 Oz
|
||||
83 0.485359 -1.493930 0.069221 0.051916 O2
|
||||
84 -0.606613 -1.867239 0.069221 0.051916 I1
|
||||
85 -0.000000 -1.963478 0.069221 0.051916 Iz
|
||||
86 0.606613 -1.867239 0.069221 0.051916 I2
|
||||
87 -0.802226 1.574520 0.069221 0.051916 AFp9h
|
||||
88 -0.626475 1.393612 0.069221 0.051916 AFp7h
|
||||
89 -0.451133 1.382849 0.069221 0.051916 AFp5h
|
||||
90 -0.271959 1.376738 0.069221 0.051916 AFp3h
|
||||
91 -0.090887 1.374548 0.069221 0.051916 AFp1h
|
||||
92 0.090887 1.374548 0.069221 0.051916 AFp2h
|
||||
93 0.271959 1.376738 0.069221 0.051916 AFp4h
|
||||
94 0.451133 1.382849 0.069221 0.051916 AFp6h
|
||||
95 0.626475 1.393612 0.069221 0.051916 AFp8h
|
||||
96 0.802226 1.574520 0.069221 0.051916 AFp10h
|
||||
97 -1.249550 1.249550 0.069221 0.051916 AFF9h
|
||||
98 -0.982948 1.075122 0.069221 0.051916 AFF7h
|
||||
99 -0.713694 1.024626 0.069221 0.051916 AFF5h
|
||||
100 -0.432315 0.996167 0.069221 0.051916 AFF3h
|
||||
101 -0.144727 0.983315 0.069221 0.051916 AFF1h
|
||||
102 0.144727 0.983315 0.069221 0.051916 AFF2h
|
||||
103 0.432315 0.996167 0.069221 0.051916 AFF4h
|
||||
104 0.713694 1.024626 0.069221 0.051916 AFF6h
|
||||
105 0.982881 1.075049 0.069221 0.051916 AFF8h
|
||||
106 1.249550 1.249550 0.069221 0.051916 AFF10h
|
||||
107 -1.574645 0.802293 0.069221 0.051916 FFT9h
|
||||
108 -1.232019 0.675885 0.069221 0.051916 FFT7h
|
||||
109 -0.886990 0.627578 0.069221 0.051916 FFC5h
|
||||
110 -0.534535 0.601827 0.069221 0.051916 FFC3h
|
||||
111 -0.178478 0.590622 0.069221 0.051916 FFC1h
|
||||
112 0.178478 0.590622 0.069221 0.051916 FFC2h
|
||||
113 0.534535 0.601827 0.069221 0.051916 FFC4h
|
||||
114 0.886990 0.627578 0.069221 0.051916 FFC6h
|
||||
115 1.232019 0.675885 0.069221 0.051916 FFT8h
|
||||
116 1.574645 0.802293 0.069221 0.051916 FFT10h
|
||||
117 -1.745475 0.276484 0.069221 0.051916 FTT9h
|
||||
118 -1.358553 0.230430 0.069221 0.051916 FTT7h
|
||||
119 -0.971386 0.211155 0.069221 0.051916 FCC5h
|
||||
120 -0.583084 0.201295 0.069221 0.051916 FCC3h
|
||||
121 -0.194460 0.196994 0.069221 0.051916 FCC1h
|
||||
122 0.194460 0.196994 0.069221 0.051916 FCC2h
|
||||
123 0.583084 0.201295 0.069221 0.051916 FCC4h
|
||||
124 0.971386 0.211155 0.069221 0.051916 FCC6h
|
||||
125 1.358553 0.230430 0.069221 0.051916 FTT8h
|
||||
126 1.745475 0.276484 0.069221 0.051916 FTT10h
|
||||
127 -1.745506 -0.276309 0.069221 0.051916 TTP9h
|
||||
128 -1.358573 -0.230293 0.069221 0.051916 TTP7h
|
||||
129 -0.971375 -0.211008 0.069221 0.051916 CCP5h
|
||||
130 -0.583085 -0.200906 0.069221 0.051916 CCP3h
|
||||
131 -0.194448 -0.196679 0.069221 0.051916 CCP1h
|
||||
132 0.194448 -0.196679 0.069221 0.051916 CCP2h
|
||||
133 0.583078 -0.201010 0.069221 0.051916 CCP4h
|
||||
134 0.971375 -0.211008 0.069221 0.051916 CCP6h
|
||||
135 1.358573 -0.230293 0.069221 0.051916 TTP8h
|
||||
136 1.745475 -0.276484 0.069221 0.051916 TTP10h
|
||||
137 -1.574667 -0.802213 0.069221 0.051916 TPP9h
|
||||
138 -1.232021 -0.675979 0.069221 0.051916 TPP7h
|
||||
139 -0.887025 -0.627306 0.069221 0.051916 CPP5h
|
||||
140 -0.534524 -0.601312 0.069221 0.051916 CPP3h
|
||||
141 -0.178473 -0.590144 0.069221 0.051916 CPP1h
|
||||
142 0.178473 -0.590144 0.069221 0.051916 CPP2h
|
||||
143 0.534524 -0.601312 0.069221 0.051916 CPP4h
|
||||
144 0.887025 -0.627306 0.069221 0.051916 CPP6h
|
||||
145 1.231976 -0.676032 0.069221 0.051916 TPP8h
|
||||
146 1.574586 -0.802352 0.069221 0.051916 TPP10h
|
||||
147 -1.249639 -1.249639 0.069221 0.051916 PPO9h
|
||||
148 -0.983137 -1.074700 0.069221 0.051916 PPO7h
|
||||
149 -0.713821 -1.024109 0.069221 0.051916 PPO5h
|
||||
150 -0.432363 -0.995909 0.069221 0.051916 PPO3h
|
||||
151 -0.144761 -0.982953 0.069221 0.051916 PPO1h
|
||||
152 0.144761 -0.982953 0.069221 0.051916 PPO2h
|
||||
153 0.432253 -0.995937 0.069221 0.051916 PPO4h
|
||||
154 0.713967 -1.023998 0.069221 0.051916 PPO6h
|
||||
155 0.983137 -1.074700 0.069221 0.051916 PPO8h
|
||||
156 1.249639 -1.249639 0.069221 0.051916 PPO10h
|
||||
157 -0.802293 -1.574645 0.069221 0.051916 POO9h
|
||||
158 -0.626849 -1.393237 0.069221 0.051916 POO7h
|
||||
159 -0.451236 -1.382715 0.069221 0.051916 POO5h
|
||||
160 -0.271951 -1.377572 0.069221 0.051916 POO3h
|
||||
161 -0.090910 -1.374606 0.069221 0.051916 POO1h
|
||||
162 0.090910 -1.374606 0.069221 0.051916 POO2h
|
||||
163 0.271951 -1.377572 0.069221 0.051916 POO4h
|
||||
164 0.451236 -1.382715 0.069221 0.051916 POO6h
|
||||
165 0.626849 -1.393237 0.069221 0.051916 POO8h
|
||||
166 0.802293 -1.574645 0.069221 0.051916 POO10h
|
||||
167 -0.276453 -1.745460 0.069221 0.051916 OI1h
|
||||
168 0.276453 -1.745460 0.069221 0.051916 OI2h
|
||||
169 -0.245655 1.551367 0.069221 0.051916 Fp1h
|
||||
170 0.245655 1.551367 0.069221 0.051916 Fp2h
|
||||
171 -1.038573 1.429729 0.069221 0.051916 AF9h
|
||||
172 -0.816811 1.245775 0.069221 0.051916 AF7h
|
||||
173 -0.592502 1.210176 0.069221 0.051916 AF5h
|
||||
174 -0.359066 1.188527 0.069221 0.051916 AF3h
|
||||
175 -0.120203 1.179114 0.069221 0.051916 AF1h
|
||||
176 0.120212 1.179076 0.069221 0.051916 AF2h
|
||||
177 0.359066 1.188527 0.069221 0.051916 AF4h
|
||||
178 0.592545 1.210263 0.069221 0.051916 AF6h
|
||||
179 0.816811 1.245775 0.069221 0.051916 AF8h
|
||||
180 1.038668 1.429679 0.069221 0.051916 AF10h
|
||||
181 -1.429588 1.038701 0.069221 0.051916 F9h
|
||||
182 -1.122287 0.883303 0.069221 0.051916 F7h
|
||||
183 -0.811863 0.829210 0.069221 0.051916 F5h
|
||||
184 -0.490601 0.800049 0.069221 0.051916 F3h
|
||||
185 -0.164017 0.787126 0.069221 0.051916 F1h
|
||||
186 0.164017 0.787126 0.069221 0.051916 F2h
|
||||
187 0.490601 0.800049 0.069221 0.051916 F4h
|
||||
188 0.811863 0.829210 0.069221 0.051916 F6h
|
||||
189 1.122287 0.883303 0.069221 0.051916 F8h
|
||||
190 1.429588 1.038701 0.069221 0.051916 F10h
|
||||
191 -1.680799 0.546075 0.069221 0.051916 FT9h
|
||||
192 -1.310995 0.457012 0.069221 0.051916 FT7h
|
||||
193 -0.939857 0.420814 0.069221 0.051916 FC5h
|
||||
194 -0.565142 0.401905 0.069221 0.051916 FC3h
|
||||
195 -0.188491 0.393826 0.069221 0.051916 FC1h
|
||||
196 0.188491 0.393826 0.069221 0.051916 FC2h
|
||||
197 0.565142 0.401905 0.069221 0.051916 FC4h
|
||||
198 0.939857 0.420814 0.069221 0.051916 FC6h
|
||||
199 1.310995 0.457012 0.069221 0.051916 FT8h
|
||||
200 1.680740 0.546236 0.069221 0.051916 FT10h
|
||||
201 -1.767191 0.000000 0.069221 0.051916 T9h
|
||||
202 -1.374500 0.000000 0.069221 0.051916 T7h
|
||||
203 -0.981850 0.000118 0.069221 0.051916 C5h
|
||||
204 -0.589058 0.000212 0.069221 0.051916 C3h
|
||||
205 -0.196395 0.000101 0.069221 0.051916 C1h
|
||||
206 0.196395 0.000201 0.069221 0.051916 C2h
|
||||
207 0.589058 0.000212 0.069221 0.051916 C4h
|
||||
208 0.981850 0.000118 0.069221 0.051916 C6h
|
||||
209 1.374500 -0.000000 0.069221 0.051916 T8h
|
||||
210 1.767191 -0.000000 0.069221 0.051916 T10h
|
||||
211 -1.680646 -0.546088 0.069221 0.051916 TP9h
|
||||
212 -1.310970 -0.456960 0.069221 0.051916 TP7h
|
||||
213 -0.939815 -0.420500 0.069221 0.051916 CP5h
|
||||
214 -0.565062 -0.401491 0.069221 0.051916 CP3h
|
||||
215 -0.188515 -0.393352 0.069221 0.051916 CP1h
|
||||
216 0.188515 -0.393352 0.069221 0.051916 CP2h
|
||||
217 0.565062 -0.401491 0.069221 0.051916 CP4h
|
||||
218 0.939815 -0.420500 0.069221 0.051916 CP6h
|
||||
219 1.310970 -0.456960 0.069221 0.051916 TP8h
|
||||
220 1.680646 -0.546088 0.069221 0.051916 TP10h
|
||||
221 -1.429668 -1.038758 0.069221 0.051916 P9h
|
||||
222 -1.122286 -0.883271 0.069221 0.051916 P7h
|
||||
223 -0.812037 -0.829137 0.069221 0.051916 P5h
|
||||
224 -0.490726 -0.799336 0.069221 0.051916 P3h
|
||||
225 -0.164146 -0.786762 0.069221 0.051916 P1h
|
||||
226 0.164146 -0.786762 0.069221 0.051916 P2h
|
||||
227 0.490600 -0.799436 0.069221 0.051916 P4h
|
||||
228 0.812037 -0.829137 0.069221 0.051916 P6h
|
||||
229 1.122286 -0.883271 0.069221 0.051916 P8h
|
||||
230 1.429668 -1.038758 0.069221 0.051916 P10h
|
||||
231 -1.038821 -1.429709 0.069221 0.051916 PO9h
|
||||
232 -0.816502 -1.246067 0.069221 0.051916 PO7h
|
||||
233 -0.593079 -1.209372 0.069221 0.051916 PO5h
|
||||
234 -0.359230 -1.188332 0.069221 0.051916 PO3h
|
||||
235 -0.120221 -1.179168 0.069221 0.051916 PO1h
|
||||
236 0.120348 -1.179159 0.069221 0.051916 PO2h
|
||||
237 0.359230 -1.188332 0.069221 0.051916 PO4h
|
||||
238 0.593079 -1.209372 0.069221 0.051916 PO6h
|
||||
239 0.816502 -1.246067 0.069221 0.051916 PO8h
|
||||
240 1.038710 -1.429804 0.069221 0.051916 PO10h
|
||||
241 -0.245671 -1.551466 0.069221 0.051916 O1h
|
||||
242 0.245671 -1.551466 0.069221 0.051916 O2h
|
||||
243 -0.307129 -1.939338 0.069221 0.051916 I1h
|
||||
244 0.307129 -1.939338 0.069221 0.051916 I2h
|
||||
245 -0.891328 1.749684 0.069221 0.051916 AFp9
|
||||
246 -0.713143 1.399582 0.069221 0.051916 AFp7
|
||||
247 -0.539182 1.387878 0.069221 0.051916 AFp5
|
||||
248 -0.361777 1.379743 0.069221 0.051916 AFp3
|
||||
249 -0.181624 1.374948 0.069221 0.051916 AFp1
|
||||
250 0.000000 1.374461 0.069221 0.051916 AFpz
|
||||
251 0.181624 1.374948 0.069221 0.051916 AFp2
|
||||
252 0.361802 1.379839 0.069221 0.051916 AFp4
|
||||
253 0.539182 1.387878 0.069221 0.051916 AFp6
|
||||
254 0.713143 1.399582 0.069221 0.051916 AFp8
|
||||
255 0.891489 1.749582 0.069221 0.051916 AFp10
|
||||
256 -1.388504 1.388504 0.069221 0.051916 AFF9
|
||||
257 -1.110721 1.110721 0.069221 0.051916 AFF7
|
||||
258 -0.850463 1.046170 0.069221 0.051916 AFF5
|
||||
259 -0.574170 1.008058 0.069221 0.051916 AFF3
|
||||
260 -0.288981 0.988233 0.069221 0.051916 AFF1
|
||||
261 0.000000 0.981739 0.069221 0.051916 AFFz
|
||||
262 0.288981 0.988233 0.069221 0.051916 AFF2
|
||||
263 0.574170 1.008058 0.069221 0.051916 AFF4
|
||||
264 0.850463 1.046170 0.069221 0.051916 AFF6
|
||||
265 1.110721 1.110721 0.069221 0.051916 AFF8
|
||||
266 1.388504 1.388504 0.069221 0.051916 AFF10
|
||||
267 -1.749576 0.891591 0.069221 0.051916 FFT9
|
||||
268 -1.399582 0.713143 0.069221 0.051916 FFT7
|
||||
269 -1.060830 0.648168 0.069221 0.051916 FFC5
|
||||
270 -0.711350 0.612390 0.069221 0.051916 FFC3
|
||||
271 -0.356750 0.594619 0.069221 0.051916 FFC1
|
||||
272 0.000000 0.589085 0.069221 0.051916 FFCz
|
||||
273 0.356750 0.594619 0.069221 0.051916 FFC2
|
||||
274 0.711350 0.612390 0.069221 0.051916 FFC4
|
||||
275 1.060749 0.648119 0.069221 0.051916 FFC6
|
||||
276 1.399582 0.713143 0.069221 0.051916 FFT8
|
||||
277 1.749576 0.891591 0.069221 0.051916 FFT10
|
||||
278 -1.939489 0.307119 0.069221 0.051916 FTT9
|
||||
279 -1.551442 0.245824 0.069221 0.051916 FTT7
|
||||
280 -1.165132 0.219351 0.069221 0.051916 FCC5
|
||||
281 -0.777319 0.205363 0.069221 0.051916 FCC3
|
||||
282 -0.388766 0.198515 0.069221 0.051916 FCC1
|
||||
283 0.000000 0.196434 0.069221 0.051916 FCCz
|
||||
284 0.388766 0.198515 0.069221 0.051916 FCC2
|
||||
285 0.777319 0.205363 0.069221 0.051916 FCC4
|
||||
286 1.165132 0.219351 0.069221 0.051916 FCC6
|
||||
287 1.551466 0.245671 0.069221 0.051916 FTT8
|
||||
288 1.939489 0.307119 0.069221 0.051916 FTT10
|
||||
289 -1.939553 -0.307197 0.069221 0.051916 TTP9
|
||||
290 -1.551565 -0.245687 0.069221 0.051916 TTP7
|
||||
291 -1.165206 -0.219084 0.069221 0.051916 CCP5
|
||||
292 -0.777275 -0.205069 0.069221 0.051916 CCP3
|
||||
293 -0.388806 -0.198175 0.069221 0.051916 CCP1
|
||||
294 -0.000000 -0.196218 0.069221 0.051916 CCPz
|
||||
295 0.388801 -0.198275 0.069221 0.051916 CCP2
|
||||
296 0.777275 -0.205069 0.069221 0.051916 CCP4
|
||||
297 1.165206 -0.219084 0.069221 0.051916 CCP6
|
||||
298 1.551565 -0.245687 0.069221 0.051916 TTP8
|
||||
299 1.939553 -0.307197 0.069221 0.051916 TTP10
|
||||
300 -1.749664 -0.891531 0.069221 0.051916 TPP9
|
||||
301 -1.399671 -0.713188 0.069221 0.051916 TPP7
|
||||
302 -1.060852 -0.647970 0.069221 0.051916 CPP5
|
||||
303 -0.711356 -0.612379 0.069221 0.051916 CPP3
|
||||
304 -0.356663 -0.594548 0.069221 0.051916 CPP1
|
||||
305 -0.000000 -0.588863 0.069221 0.051916 CPPz
|
||||
306 0.356778 -0.594448 0.069221 0.051916 CPP2
|
||||
307 0.711384 -0.612287 0.069221 0.051916 CPP4
|
||||
308 1.060852 -0.647970 0.069221 0.051916 CPP6
|
||||
309 1.399671 -0.713188 0.069221 0.051916 TPP8
|
||||
310 1.749664 -0.891531 0.069221 0.051916 TPP10
|
||||
311 -1.388427 -1.388427 0.069221 0.051916 PPO9
|
||||
312 -1.110721 -1.110721 0.069221 0.051916 PPO7
|
||||
313 -0.850511 -1.046155 0.069221 0.051916 PPO5
|
||||
314 -0.574228 -1.007462 0.069221 0.051916 PPO3
|
||||
315 -0.289055 -0.987715 0.069221 0.051916 PPO1
|
||||
316 -0.000000 -0.981655 0.069221 0.051916 PPOz
|
||||
317 0.289055 -0.987715 0.069221 0.051916 PPO2
|
||||
318 0.574228 -1.007462 0.069221 0.051916 PPO4
|
||||
319 0.850454 -1.046223 0.069221 0.051916 PPO6
|
||||
320 1.110721 -1.110721 0.069221 0.051916 PPO8
|
||||
321 1.388427 -1.388427 0.069221 0.051916 PPO10
|
||||
322 -0.891143 -1.749540 0.069221 0.051916 POO9
|
||||
323 -0.713143 -1.399582 0.069221 0.051916 POO7
|
||||
324 -0.539360 -1.387717 0.069221 0.051916 POO5
|
||||
325 -0.362020 -1.379310 0.069221 0.051916 POO3
|
||||
326 -0.181486 -1.375484 0.069221 0.051916 POO1
|
||||
327 -0.000000 -1.374422 0.069221 0.051916 POOz
|
||||
328 0.181626 -1.375468 0.069221 0.051916 POO2
|
||||
329 0.362020 -1.379310 0.069221 0.051916 POO4
|
||||
330 0.539360 -1.387717 0.069221 0.051916 POO6
|
||||
331 0.713143 -1.399582 0.069221 0.051916 POO8
|
||||
332 0.891143 -1.749540 0.069221 0.051916 POO10
|
||||
333 -0.546073 -1.680586 0.069221 0.051916 OI1
|
||||
334 -0.000000 -1.767132 0.069221 0.051916 OIz
|
||||
335 0.546073 -1.680586 0.069221 0.051916 OI2
|
||||
336 -1.963487 1.749684 0.069221 0.051916 COMNT
|
||||
337 1.963487 1.749684 0.069221 0.051916 SCALE
|
||||
259
mne/channels/data/layouts/EGI256.lout
Normal file
@@ -0,0 +1,259 @@
|
||||
-42.19 43.52 -41.70 28.71
|
||||
001 0.235020883 0.231411875 0.023840595 0.024283894 EEG 001
|
||||
002 0.180062322 0.24066255 0.023840595 0.024283894 EEG 002
|
||||
003 0.134498312 0.239722125 0.023840595 0.024283894 EEG 003
|
||||
004 0.098183698 0.230899463 0.023840595 0.024283894 EEG 004
|
||||
005 0.066117291 0.206774428 0.023840595 0.024283894 EEG 005
|
||||
006 0.038417416 0.175224454 0.023840595 0.024283894 EEG 006
|
||||
007 0.019093339 0.142334211 0.023840595 0.024283894 EEG 007
|
||||
008 0 0.106825455 0.023840595 0.024283894 EEG 008
|
||||
009 -0.017539353 0.062826857 0.023840595 0.024283894 EEG 009
|
||||
010 0.181942866 0.296413546 0.023840595 0.024283894 EEG 010
|
||||
011 0.13038807 0.293232492 0.023840595 0.024283894 EEG 011
|
||||
012 0.084273706 0.277147412 0.023840595 0.024283894 EEG 012
|
||||
013 0.050175359 0.251802841 0.023840595 0.024283894 EEG 013
|
||||
014 0.021773201 0.21699757 0.023840595 0.024283894 EEG 014
|
||||
015 0 0.180469732 0.023840595 0.024283894 EEG 015
|
||||
016 -0.019093339 0.142334211 0.023840595 0.024283894 EEG 016
|
||||
017 -0.036255497 0.09269913 0.023840595 0.024283894 EEG 017
|
||||
018 0.113098849 0.348229946 0.023840595 0.024283894 EEG 018
|
||||
019 0.069000992 0.329792276 0.023840595 0.024283894 EEG 019
|
||||
020 0.029776066 0.297506089 0.023840595 0.024283894 EEG 020
|
||||
021 0 0.258687873 0.023840595 0.024283894 EEG 021
|
||||
022 -0.021773201 0.21699757 0.023840595 0.024283894 EEG 022
|
||||
023 -0.038417416 0.175224454 0.023840595 0.024283894 EEG 023
|
||||
024 -0.055153266 0.126645408 0.023840595 0.024283894 EEG 024
|
||||
025 0.036940443 0.37703699 0.023840595 0.024283894 EEG 025
|
||||
026 0 0.343720309 0.023840595 0.024283894 EEG 026
|
||||
027 -0.029776066 0.297506089 0.023840595 0.024283894 EEG 027
|
||||
028 -0.050175359 0.251802841 0.023840595 0.024283894 EEG 028
|
||||
029 -0.066117291 0.206774428 0.023840595 0.024283894 EEG 029
|
||||
030 -0.079525249 0.158534511 0.023840595 0.024283894 EEG 030
|
||||
031 0 0.415202995 0.023840595 0.024283894 EEG 031
|
||||
032 -0.036940443 0.37703699 0.023840595 0.024283894 EEG 032
|
||||
033 -0.069000992 0.329792276 0.023840595 0.024283894 EEG 033
|
||||
034 -0.084273706 0.277147412 0.023840595 0.024283894 EEG 034
|
||||
035 -0.098183698 0.230899463 0.023840595 0.024283894 EEG 035
|
||||
036 -0.098479668 0.187945851 0.023840595 0.024283894 EEG 036
|
||||
037 -0.113098849 0.348229946 0.023840595 0.024283894 EEG 037
|
||||
038 -0.13038807 0.293232492 0.023840595 0.024283894 EEG 038
|
||||
039 -0.134498312 0.239722125 0.023840595 0.024283894 EEG 039
|
||||
040 -0.130890927 0.191286703 0.023840595 0.024283894 EEG 040
|
||||
041 -0.116009122 0.150111634 0.023840595 0.024283894 EEG 041
|
||||
042 -0.094840856 0.116834626 0.023840595 0.024283894 EEG 042
|
||||
043 -0.076990927 0.086006856 0.023840595 0.024283894 EEG 043
|
||||
044 -0.055587556 0.053147386 0.023840595 0.024283894 EEG 044
|
||||
045 -0.029699902 0.019405615 0.023840595 0.024283894 EEG 045
|
||||
046 -0.181942866 0.296413546 0.023840595 0.024283894 EEG 046
|
||||
047 -0.180062322 0.24066255 0.023840595 0.024283894 EEG 047
|
||||
048 -0.17285275 0.187572361 0.023840595 0.024283894 EEG 048
|
||||
049 -0.156410469 0.141423921 0.023840595 0.024283894 EEG 049
|
||||
050 -0.132742164 0.104084677 0.023840595 0.024283894 EEG 050
|
||||
051 -0.108362109 0.07207399 0.023840595 0.024283894 EEG 051
|
||||
052 -0.087032894 0.041560718 0.023840595 0.024283894 EEG 052
|
||||
053 -0.057033727 0.006635523 0.023840595 0.024283894 EEG 053
|
||||
054 -0.235020883 0.231411875 0.023840595 0.024283894 EEG 054
|
||||
055 -0.21721779 0.1735557 0.023840595 0.024283894 EEG 055
|
||||
056 -0.196096643 0.121848964 0.023840595 0.024283894 EEG 056
|
||||
057 -0.169122926 0.084563661 0.023840595 0.024283894 EEG 057
|
||||
058 -0.142622009 0.056366314 0.023840595 0.024283894 EEG 058
|
||||
059 -0.11607512 0.026701856 0.023840595 0.024283894 EEG 059
|
||||
060 -0.086703907 -0.006962228 0.023840595 0.024283894 EEG 060
|
||||
061 -0.271241865 0.131933691 0.023840595 0.024283894 EEG 061
|
||||
062 -0.237546771 0.082946276 0.023840595 0.024283894 EEG 062
|
||||
063 -0.20434592 0.049982898 0.023840595 0.024283894 EEG 063
|
||||
064 -0.175001011 0.027246728 0.023840595 0.024283894 EEG 064
|
||||
065 -0.144183544 0.006552794 0.023840595 0.024283894 EEG 065
|
||||
066 -0.117629392 -0.020953359 0.023840595 0.024283894 EEG 066
|
||||
067 -0.32017538 0.064356008 0.023840595 0.024283894 EEG 067
|
||||
068 -0.277394242 0.035815905 0.023840595 0.024283894 EEG 068
|
||||
069 -0.241320281 0.000293927 0.023840595 0.024283894 EEG 069
|
||||
070 -0.202988841 -0.017932839 0.023840595 0.024283894 EEG 070
|
||||
071 -0.170816713 -0.027588171 0.023840595 0.024283894 EEG 071
|
||||
072 -0.142940198 -0.038849379 0.023840595 0.024283894 EEG 072
|
||||
073 -0.364333595 -0.009526546 0.023840595 0.024283894 EEG 073
|
||||
074 -0.227828247 -0.074709585 0.023840595 0.024283894 EEG 074
|
||||
075 -0.186334435 -0.079063391 0.023840595 0.024283894 EEG 075
|
||||
076 -0.152612576 -0.080357072 0.023840595 0.024283894 EEG 076
|
||||
077 -0.122986168 -0.070147895 0.023840595 0.024283894 EEG 077
|
||||
078 -0.092860036 -0.059724481 0.023840595 0.024283894 EEG 078
|
||||
079 -0.063373134 -0.044961361 0.023840595 0.024283894 EEG 079
|
||||
080 -0.033138055 -0.028518783 0.023840595 0.024283894 EEG 080
|
||||
081 0 -0.006448832 0.023840595 0.024283894 EEG 081
|
||||
082 -0.384631539 -0.115563191 0.023840595 0.024283894 EEG 082
|
||||
083 -0.230231782 -0.157310034 0.023840595 0.024283894 EEG 083
|
||||
084 -0.201004697 -0.132397774 0.023840595 0.024283894 EEG 084
|
||||
085 -0.158874627 -0.130476761 0.023840595 0.024283894 EEG 085
|
||||
086 -0.125435162 -0.117006671 0.023840595 0.024283894 EEG 086
|
||||
087 -0.093818787 -0.102184911 0.023840595 0.024283894 EEG 087
|
||||
088 -0.063690231 -0.085009427 0.023840595 0.024283894 EEG 088
|
||||
089 -0.034226984 -0.069230419 0.023840595 0.024283894 EEG 089
|
||||
090 0 -0.043222928 0.023840595 0.024283894 EEG 090
|
||||
091 -0.376606255 -0.236283155 0.023840595 0.024283894 EEG 091
|
||||
092 -0.320841548 -0.246056831 0.023840595 0.024283894 EEG 092
|
||||
093 -0.264511728 -0.247963981 0.023840595 0.024283894 EEG 093
|
||||
094 -0.235119884 -0.22133859 0.023840595 0.024283894 EEG 094
|
||||
095 -0.200260526 -0.201104991 0.023840595 0.024283894 EEG 095
|
||||
096 -0.16089296 -0.182074387 0.023840595 0.024283894 EEG 096
|
||||
097 -0.123315473 -0.169463521 0.023840595 0.024283894 EEG 097
|
||||
098 -0.093577895 -0.148219199 0.023840595 0.024283894 EEG 098
|
||||
099 -0.062757092 -0.127508907 0.023840595 0.024283894 EEG 099
|
||||
100 -0.033465994 -0.105718695 0.023840595 0.024283894 EEG 100
|
||||
101 0 -0.123212516 0.023840595 0.024283894 EEG 101
|
||||
102 -0.309236143 -0.330394078 0.023840595 0.024283894 EEG 102
|
||||
103 -0.264402365 -0.317489099 0.023840595 0.024283894 EEG 103
|
||||
104 -0.215607267 -0.297916345 0.023840595 0.024283894 EEG 104
|
||||
105 -0.194042397 -0.266008675 0.023840595 0.024283894 EEG 105
|
||||
106 -0.156365562 -0.241406814 0.023840595 0.024283894 EEG 106
|
||||
107 -0.117304936 -0.222733874 0.023840595 0.024283894 EEG 107
|
||||
108 -0.08375779 -0.200153314 0.023840595 0.024283894 EEG 108
|
||||
109 -0.056791169 -0.173578646 0.023840595 0.024283894 EEG 109
|
||||
110 -0.028490371 -0.146436894 0.023840595 0.024283894 EEG 110
|
||||
111 -0.235425173 -0.391140875 0.023840595 0.024283894 EEG 111
|
||||
112 -0.20031364 -0.367491502 0.023840595 0.024283894 EEG 112
|
||||
113 -0.160198907 -0.335751192 0.023840595 0.024283894 EEG 113
|
||||
114 -0.148968879 -0.297338854 0.023840595 0.024283894 EEG 114
|
||||
115 -0.09913078 -0.279612547 0.023840595 0.024283894 EEG 115
|
||||
116 -0.06561825 -0.2506161 0.023840595 0.024283894 EEG 116
|
||||
117 -0.036528871 -0.219887692 0.023840595 0.024283894 EEG 117
|
||||
118 -0.01914107 -0.187670154 0.023840595 0.024283894 EEG 118
|
||||
119 0 -0.159638357 0.023840595 0.024283894 EEG 119
|
||||
120 -0.178151028 -0.424680349 0.023840595 0.024283894 EEG 120
|
||||
121 -0.142872329 -0.395550026 0.023840595 0.024283894 EEG 121
|
||||
122 -0.106134228 -0.360226213 0.023840595 0.024283894 EEG 122
|
||||
123 -0.074015552 -0.317797572 0.023840595 0.024283894 EEG 123
|
||||
124 -0.049414286 -0.292978277 0.023840595 0.024283894 EEG 124
|
||||
125 -0.020856534 -0.260833466 0.023840595 0.024283894 EEG 125
|
||||
126 0 -0.223512279 0.023840595 0.024283894 EEG 126
|
||||
127 0.01914107 -0.187670154 0.023840595 0.024283894 EEG 127
|
||||
128 0.028490371 -0.146436894 0.023840595 0.024283894 EEG 128
|
||||
129 0.033465994 -0.105718695 0.023840595 0.024283894 EEG 129
|
||||
130 0.034226984 -0.069230419 0.023840595 0.024283894 EEG 130
|
||||
131 0.033138055 -0.028518783 0.023840595 0.024283894 EEG 131
|
||||
132 0.029699902 0.019405615 0.023840595 0.024283894 EEG 132
|
||||
133 -0.11640639 -0.433892117 0.023840595 0.024283894 EEG 133
|
||||
134 -0.085226238 -0.411234759 0.023840595 0.024283894 EEG 134
|
||||
135 -0.054701526 -0.36252645 0.023840595 0.024283894 EEG 135
|
||||
136 -0.02321088 -0.335534555 0.023840595 0.024283894 EEG 136
|
||||
137 0 -0.303018075 0.023840595 0.024283894 EEG 137
|
||||
138 0.020856534 -0.260833466 0.023840595 0.024283894 EEG 138
|
||||
139 0.036528871 -0.219887692 0.023840595 0.024283894 EEG 139
|
||||
140 0.056791169 -0.173578646 0.023840595 0.024283894 EEG 140
|
||||
141 0.062757092 -0.127508907 0.023840595 0.024283894 EEG 141
|
||||
142 0.063690231 -0.085009427 0.023840595 0.024283894 EEG 142
|
||||
143 0.063373134 -0.044961361 0.023840595 0.024283894 EEG 143
|
||||
144 0.057033727 0.006635523 0.023840595 0.024283894 EEG 144
|
||||
145 -0.061719572 -0.45 0.023840595 0.024283894 EEG 145
|
||||
146 -0.032116421 -0.419782634 0.023840595 0.024283894 EEG 146
|
||||
147 -9.99E-17 -0.379508917 0.023840595 0.024283894 EEG 147
|
||||
148 0.02321088 -0.335534555 0.023840595 0.024283894 EEG 148
|
||||
149 0.049414286 -0.292978277 0.023840595 0.024283894 EEG 149
|
||||
150 0.06561825 -0.2506161 0.023840595 0.024283894 EEG 150
|
||||
151 0.08375779 -0.200153314 0.023840595 0.024283894 EEG 151
|
||||
152 0.093577895 -0.148219199 0.023840595 0.024283894 EEG 152
|
||||
153 0.093818787 -0.102184911 0.023840595 0.024283894 EEG 153
|
||||
154 0.092860036 -0.059724481 0.023840595 0.024283894 EEG 154
|
||||
155 0.086703907 -0.006962228 0.023840595 0.024283894 EEG 155
|
||||
156 0.032116421 -0.419782634 0.023840595 0.024283894 EEG 156
|
||||
157 0.054701526 -0.36252645 0.023840595 0.024283894 EEG 157
|
||||
158 0.074015552 -0.317797572 0.023840595 0.024283894 EEG 158
|
||||
159 0.09913078 -0.279612547 0.023840595 0.024283894 EEG 159
|
||||
160 0.117304936 -0.222733874 0.023840595 0.024283894 EEG 160
|
||||
161 0.123315473 -0.169463521 0.023840595 0.024283894 EEG 161
|
||||
162 0.125435162 -0.117006671 0.023840595 0.024283894 EEG 162
|
||||
163 0.122986168 -0.070147895 0.023840595 0.024283894 EEG 163
|
||||
164 0.117629392 -0.020953359 0.023840595 0.024283894 EEG 164
|
||||
165 0.061719572 -0.45 0.023840595 0.024283894 EEG 165
|
||||
166 0.085226238 -0.411234759 0.023840595 0.024283894 EEG 166
|
||||
167 0.106134228 -0.360226213 0.023840595 0.024283894 EEG 167
|
||||
168 0.148968879 -0.297338854 0.023840595 0.024283894 EEG 168
|
||||
169 0.156365562 -0.241406814 0.023840595 0.024283894 EEG 169
|
||||
170 0.16089296 -0.182074387 0.023840595 0.024283894 EEG 170
|
||||
171 0.158874627 -0.130476761 0.023840595 0.024283894 EEG 171
|
||||
172 0.152612576 -0.080357072 0.023840595 0.024283894 EEG 172
|
||||
173 0.142940198 -0.038849379 0.023840595 0.024283894 EEG 173
|
||||
174 0.11640639 -0.433892117 0.023840595 0.024283894 EEG 174
|
||||
175 0.142872329 -0.395550026 0.023840595 0.024283894 EEG 175
|
||||
176 0.160198907 -0.335751192 0.023840595 0.024283894 EEG 176
|
||||
177 0.194042397 -0.266008675 0.023840595 0.024283894 EEG 177
|
||||
178 0.200260526 -0.201104991 0.023840595 0.024283894 EEG 178
|
||||
179 0.201004697 -0.132397774 0.023840595 0.024283894 EEG 179
|
||||
180 0.186334435 -0.079063391 0.023840595 0.024283894 EEG 180
|
||||
181 0.170816713 -0.027588171 0.023840595 0.024283894 EEG 181
|
||||
182 0.144183544 0.006552794 0.023840595 0.024283894 EEG 182
|
||||
183 0.11607512 0.026701856 0.023840595 0.024283894 EEG 183
|
||||
184 0.087032894 0.041560718 0.023840595 0.024283894 EEG 184
|
||||
185 0.055587556 0.053147386 0.023840595 0.024283894 EEG 185
|
||||
186 0.017539353 0.062826857 0.023840595 0.024283894 EEG 186
|
||||
187 0.178151028 -0.424680349 0.023840595 0.024283894 EEG 187
|
||||
188 0.20031364 -0.367491502 0.023840595 0.024283894 EEG 188
|
||||
189 0.215607267 -0.297916345 0.023840595 0.024283894 EEG 189
|
||||
190 0.235119884 -0.22133859 0.023840595 0.024283894 EEG 190
|
||||
191 0.230231782 -0.157310034 0.023840595 0.024283894 EEG 191
|
||||
192 0.227828247 -0.074709585 0.023840595 0.024283894 EEG 192
|
||||
193 0.202988841 -0.017932839 0.023840595 0.024283894 EEG 193
|
||||
194 0.175001011 0.027246728 0.023840595 0.024283894 EEG 194
|
||||
195 0.142622009 0.056366314 0.023840595 0.024283894 EEG 195
|
||||
196 0.108362109 0.07207399 0.023840595 0.024283894 EEG 196
|
||||
197 0.076990927 0.086006856 0.023840595 0.024283894 EEG 197
|
||||
198 0.036255497 0.09269913 0.023840595 0.024283894 EEG 198
|
||||
199 0.235425173 -0.391140875 0.023840595 0.024283894 EEG 199
|
||||
200 0.264402365 -0.317489099 0.023840595 0.024283894 EEG 200
|
||||
201 0.264511728 -0.247963981 0.023840595 0.024283894 EEG 201
|
||||
202 0.241320281 0.000293927 0.023840595 0.024283894 EEG 202
|
||||
203 0.20434592 0.049982898 0.023840595 0.024283894 EEG 203
|
||||
204 0.169122926 0.084563661 0.023840595 0.024283894 EEG 204
|
||||
205 0.132742164 0.104084677 0.023840595 0.024283894 EEG 205
|
||||
206 0.094840856 0.116834626 0.023840595 0.024283894 EEG 206
|
||||
207 0.055153266 0.126645408 0.023840595 0.024283894 EEG 207
|
||||
208 0.309236143 -0.330394078 0.023840595 0.024283894 EEG 208
|
||||
209 0.320841548 -0.246056831 0.023840595 0.024283894 EEG 209
|
||||
210 0.277394242 0.035815905 0.023840595 0.024283894 EEG 210
|
||||
211 0.237546771 0.082946276 0.023840595 0.024283894 EEG 211
|
||||
212 0.196096643 0.121848964 0.023840595 0.024283894 EEG 212
|
||||
213 0.156410469 0.141423921 0.023840595 0.024283894 EEG 213
|
||||
214 0.116009122 0.150111634 0.023840595 0.024283894 EEG 214
|
||||
215 0.079525249 0.158534511 0.023840595 0.024283894 EEG 215
|
||||
216 0.376606255 -0.236283155 0.023840595 0.024283894 EEG 216
|
||||
217 0.384631539 -0.115563191 0.023840595 0.024283894 EEG 217
|
||||
218 0.364333595 -0.009526546 0.023840595 0.024283894 EEG 218
|
||||
219 0.32017538 0.064356008 0.023840595 0.024283894 EEG 219
|
||||
220 0.271241865 0.131933691 0.023840595 0.024283894 EEG 220
|
||||
221 0.21721779 0.1735557 0.023840595 0.024283894 EEG 221
|
||||
222 0.17285275 0.187572361 0.023840595 0.024283894 EEG 222
|
||||
223 0.130890927 0.191286703 0.023840595 0.024283894 EEG 223
|
||||
224 0.098479668 0.187945851 0.023840595 0.024283894 EEG 224
|
||||
225 0.316289645 0.145736715 0.023840595 0.024283894 EEG 225
|
||||
226 0.302702771 0.230332844 0.023840595 0.024283894 EEG 226
|
||||
227 0.368412876 0.104246485 0.023840595 0.024283894 EEG 227
|
||||
228 0.409165374 0.012374488 0.023840595 0.024283894 EEG 228
|
||||
229 0.423731189 -0.12797492 0.023840595 0.024283894 EEG 229
|
||||
230 0.298254153 0.303894316 0.023840595 0.024283894 EEG 230
|
||||
231 0.362100214 0.20909316 0.023840595 0.024283894 EEG 231
|
||||
232 0.410199617 0.143137194 0.023840595 0.024283894 EEG 232
|
||||
233 0.447869069 0.013249996 0.023840595 0.024283894 EEG 233
|
||||
234 0.269381414 0.382730951 0.023840595 0.024283894 EEG 234
|
||||
235 0.342518502 0.308483235 0.023840595 0.024283894 EEG 235
|
||||
236 0.395968691 0.254174349 0.023840595 0.024283894 EEG 236
|
||||
237 0.45 0.157922288 0.023840595 0.024283894 EEG 237
|
||||
238 0.2187115 0.45 0.023840595 0.024283894 EEG 238
|
||||
239 0.327880174 0.384827106 0.023840595 0.024283894 EEG 239
|
||||
240 0.38583302 0.329449945 0.023840595 0.024283894 EEG 240
|
||||
241 -0.2187115 0.45 0.023840595 0.024283894 EEG 241
|
||||
242 -0.327880174 0.384827106 0.023840595 0.024283894 EEG 242
|
||||
243 -0.38583302 0.329449945 0.023840595 0.024283894 EEG 243
|
||||
244 -0.269381414 0.382730951 0.023840595 0.024283894 EEG 244
|
||||
245 -0.342518502 0.308483235 0.023840595 0.024283894 EEG 245
|
||||
246 -0.395968691 0.254174349 0.023840595 0.024283894 EEG 246
|
||||
247 -0.45 0.157922288 0.023840595 0.024283894 EEG 247
|
||||
248 -0.298254153 0.303894316 0.023840595 0.024283894 EEG 248
|
||||
249 -0.362100214 0.20909316 0.023840595 0.024283894 EEG 249
|
||||
250 -0.410199617 0.143137194 0.023840595 0.024283894 EEG 250
|
||||
251 -0.447869069 0.013249996 0.023840595 0.024283894 EEG 251
|
||||
252 -0.302702771 0.230332844 0.023840595 0.024283894 EEG 252
|
||||
253 -0.316289645 0.145736715 0.023840595 0.024283894 EEG 253
|
||||
254 -0.368412876 0.104246485 0.023840595 0.024283894 EEG 254
|
||||
255 -0.409165374 0.012374488 0.023840595 0.024283894 EEG 255
|
||||
256 -0.423731189 -0.12797492 0.023840595 0.024283894 EEG 256
|
||||
257 -0.45 -0.45 0.023840595 0.024283894 EEG 257
|
||||
258 0.45 -0.45 0.023840595 0.024283894 EEG 258
|
||||
132
mne/channels/data/layouts/GeodesicHeadWeb-130.lout
Normal file
@@ -0,0 +1,132 @@
|
||||
-42.19 43.52 -41.70 28.71
|
||||
001 0.50 0.74 0.02 0.02 E1
|
||||
002 0.53 0.79 0.02 0.02 E2
|
||||
003 0.55 0.73 0.02 0.02 E3
|
||||
004 0.50 0.69 0.02 0.02 E4
|
||||
005 0.45 0.73 0.02 0.02 E5
|
||||
006 0.46 0.79 0.02 0.02 E6
|
||||
007 0.50 0.85 0.02 0.02 E7
|
||||
008 0.58 0.84 0.02 0.02 E8
|
||||
009 0.60 0.77 0.02 0.02 E9
|
||||
010 0.60 0.70 0.02 0.02 E10
|
||||
011 0.55 0.68 0.02 0.02 E11
|
||||
012 0.50 0.64 0.02 0.02 E12
|
||||
013 0.45 0.68 0.02 0.02 E13
|
||||
014 0.40 0.70 0.02 0.02 E14
|
||||
015 0.39 0.77 0.02 0.02 E15
|
||||
016 0.41 0.84 0.02 0.02 E16
|
||||
017 0.44 0.91 0.02 0.02 E17
|
||||
018 0.66 0.79 0.02 0.02 E18
|
||||
019 0.60 0.64 0.02 0.02 E19
|
||||
020 0.45 0.62 0.02 0.02 E20
|
||||
021 0.34 0.72 0.02 0.02 E21
|
||||
022 0.73 0.87 0.02 0.02 E22
|
||||
023 0.76 0.93 0.02 0.02 E23
|
||||
024 0.85 0.83 0.02 0.02 E24
|
||||
025 0.86 0.74 0.02 0.02 E25
|
||||
026 0.80 0.72 0.02 0.02 E26
|
||||
027 0.74 0.81 0.02 0.02 E27
|
||||
028 0.65 0.88 0.02 0.02 E28
|
||||
029 0.55 0.91 0.02 0.02 E29
|
||||
030 0.50 0.96 0.02 0.02 E30
|
||||
031 0.63 0.98 0.02 0.02 E31
|
||||
032 0.83 0.63 0.02 0.02 E32
|
||||
033 0.72 0.73 0.02 0.02 E33
|
||||
034 0.67 0.62 0.02 0.02 E34
|
||||
035 0.72 0.61 0.02 0.02 E35
|
||||
036 0.68 0.56 0.02 0.02 E36
|
||||
037 0.62 0.59 0.02 0.02 E37
|
||||
038 0.63 0.66 0.02 0.02 E38
|
||||
039 0.69 0.67 0.02 0.02 E39
|
||||
040 0.76 0.64 0.02 0.02 E40
|
||||
041 0.77 0.55 0.02 0.02 E41
|
||||
042 0.72 0.51 0.02 0.02 E42
|
||||
043 0.67 0.49 0.02 0.02 E43
|
||||
044 0.63 0.53 0.02 0.02 E44
|
||||
045 0.58 0.58 0.02 0.02 E45
|
||||
046 0.66 0.72 0.02 0.02 E46
|
||||
047 0.90 0.49 0.02 0.02 E47
|
||||
048 0.84 0.51 0.02 0.02 E48
|
||||
049 0.88 0.23 0.02 0.02 E49
|
||||
050 0.79 0.23 0.02 0.02 E50
|
||||
051 0.74 0.29 0.02 0.02 E51
|
||||
052 0.72 0.37 0.02 0.02 E52
|
||||
053 0.76 0.46 0.02 0.02 E53
|
||||
054 0.61 0.39 0.02 0.02 E54
|
||||
055 0.61 0.33 0.02 0.02 E55
|
||||
056 0.56 0.37 0.02 0.02 E56
|
||||
057 0.57 0.43 0.02 0.02 E57
|
||||
058 0.64 0.44 0.02 0.02 E58
|
||||
059 0.65 0.37 0.02 0.02 E59
|
||||
060 0.66 0.30 0.02 0.02 E60
|
||||
061 0.58 0.26 0.02 0.02 E61
|
||||
062 0.54 0.30 0.02 0.02 E62
|
||||
063 0.53 0.41 0.02 0.02 E63
|
||||
064 0.55 0.47 0.02 0.02 E64
|
||||
065 0.61 0.48 0.02 0.02 E65
|
||||
066 0.70 0.44 0.02 0.02 E66
|
||||
067 0.50 0.12 0.02 0.02 E67
|
||||
068 0.45 0.11 0.02 0.02 E68
|
||||
069 0.47 0.18 0.02 0.02 E69
|
||||
070 0.53 0.18 0.02 0.02 E70
|
||||
071 0.55 0.11 0.02 0.02 E71
|
||||
072 0.73 0.08 0.02 0.02 E72
|
||||
073 0.50 0.02 0.02 0.02 E73
|
||||
074 0.28 0.07 0.02 0.02 E74
|
||||
075 0.22 0.22 0.02 0.02 E75
|
||||
076 0.35 0.22 0.02 0.02 E76
|
||||
077 0.41 0.26 0.02 0.02 E77
|
||||
078 0.50 0.25 0.02 0.02 E78
|
||||
079 0.65 0.22 0.02 0.02 E79
|
||||
080 0.39 0.39 0.02 0.02 E80
|
||||
081 0.34 0.36 0.02 0.02 E81
|
||||
082 0.36 0.43 0.02 0.02 E82
|
||||
083 0.42 0.44 0.02 0.02 E83
|
||||
084 0.45 0.37 0.02 0.02 E84
|
||||
085 0.40 0.33 0.02 0.02 E85
|
||||
086 0.34 0.30 0.02 0.02 E86
|
||||
087 0.28 0.37 0.02 0.02 E87
|
||||
088 0.30 0.43 0.02 0.02 E88
|
||||
089 0.33 0.49 0.02 0.02 E89
|
||||
090 0.39 0.48 0.02 0.02 E90
|
||||
091 0.45 0.47 0.02 0.02 E91
|
||||
092 0.47 0.41 0.02 0.02 E92
|
||||
093 0.46 0.30 0.02 0.02 E93
|
||||
094 0.47 0.51 0.02 0.02 E94
|
||||
095 0.46 0.57 0.02 0.02 E95
|
||||
096 0.50 0.60 0.02 0.02 E96
|
||||
097 0.54 0.57 0.02 0.02 E97
|
||||
098 0.52 0.51 0.02 0.02 E98
|
||||
099 0.50 0.46 0.02 0.02 E99
|
||||
100 0.42 0.52 0.02 0.02 E100
|
||||
101 0.42 0.58 0.02 0.02 E101
|
||||
102 0.55 0.62 0.02 0.02 E102
|
||||
103 0.58 0.52 0.02 0.02 E103
|
||||
104 0.16 0.52 0.02 0.02 E104
|
||||
105 0.10 0.49 0.02 0.02 E105
|
||||
106 0.09 0.27 0.02 0.02 E106
|
||||
107 0.15 0.75 0.02 0.02 E107
|
||||
108 0.17 0.63 0.02 0.02 E108
|
||||
109 0.22 0.55 0.02 0.02 E109
|
||||
110 0.24 0.45 0.02 0.02 E110
|
||||
111 0.26 0.29 0.02 0.02 E111
|
||||
112 0.33 0.61 0.02 0.02 E112
|
||||
113 0.30 0.66 0.02 0.02 E113
|
||||
114 0.36 0.66 0.02 0.02 E114
|
||||
115 0.37 0.59 0.02 0.02 E115
|
||||
116 0.33 0.56 0.02 0.02 E116
|
||||
117 0.28 0.60 0.02 0.02 E117
|
||||
118 0.24 0.64 0.02 0.02 E118
|
||||
119 0.27 0.73 0.02 0.02 E119
|
||||
120 0.40 0.64 0.02 0.02 E120
|
||||
121 0.37 0.53 0.02 0.02 E121
|
||||
122 0.27 0.51 0.02 0.02 E122
|
||||
123 0.27 0.88 0.02 0.02 E123
|
||||
124 0.26 0.81 0.02 0.02 E124
|
||||
125 0.20 0.72 0.02 0.02 E125
|
||||
126 0.16 0.83 0.02 0.02 E126
|
||||
127 0.25 0.93 0.02 0.02 E127
|
||||
128 0.37 0.98 0.02 0.02 E128
|
||||
129 0.35 0.88 0.02 0.02 E129
|
||||
130 0.33 0.79 0.02 0.02 E130
|
||||
131 0.50 0.55 0.02 0.02 E131
|
||||
282
mne/channels/data/layouts/GeodesicHeadWeb-280.lout
Normal file
@@ -0,0 +1,282 @@
|
||||
-42.19 43.52 -41.70 28.71
|
||||
001 0.49 0.77 0.02 0.02 E1
|
||||
002 0.52 0.80 0.02 0.02 E2
|
||||
003 0.53 0.76 0.02 0.02 E3
|
||||
004 0.49 0.73 0.02 0.02 E4
|
||||
005 0.46 0.76 0.02 0.02 E5
|
||||
006 0.47 0.80 0.02 0.02 E6
|
||||
007 0.49 0.84 0.02 0.02 E7
|
||||
008 0.54 0.84 0.02 0.02 E8
|
||||
009 0.55 0.80 0.02 0.02 E9
|
||||
010 0.57 0.74 0.02 0.02 E10
|
||||
011 0.53 0.71 0.02 0.02 E11
|
||||
012 0.49 0.68 0.02 0.02 E12
|
||||
013 0.46 0.71 0.02 0.02 E13
|
||||
014 0.42 0.74 0.02 0.02 E14
|
||||
015 0.43 0.79 0.02 0.02 E15
|
||||
016 0.45 0.84 0.02 0.02 E16
|
||||
017 0.47 0.87 0.02 0.02 E17
|
||||
018 0.52 0.87 0.02 0.02 E18
|
||||
019 0.57 0.86 0.02 0.02 E19
|
||||
020 0.59 0.83 0.02 0.02 E20
|
||||
021 0.59 0.79 0.02 0.02 E21
|
||||
022 0.60 0.73 0.02 0.02 E22
|
||||
023 0.57 0.71 0.02 0.02 E23
|
||||
024 0.53 0.67 0.02 0.02 E24
|
||||
025 0.49 0.65 0.02 0.02 E25
|
||||
026 0.46 0.67 0.02 0.02 E26
|
||||
027 0.43 0.70 0.02 0.02 E27
|
||||
028 0.39 0.73 0.02 0.02 E28
|
||||
029 0.39 0.78 0.02 0.02 E29
|
||||
030 0.40 0.83 0.02 0.02 E30
|
||||
031 0.41 0.86 0.02 0.02 E31
|
||||
032 0.49 0.93 0.02 0.02 E32
|
||||
033 0.64 0.81 0.02 0.02 E33
|
||||
034 0.56 0.66 0.02 0.02 E34
|
||||
035 0.43 0.66 0.02 0.02 E35
|
||||
036 0.35 0.80 0.02 0.02 E36
|
||||
037 0.73 0.86 0.02 0.02 E37
|
||||
038 0.76 0.89 0.02 0.02 E38
|
||||
039 0.76 0.84 0.02 0.02 E39
|
||||
040 0.72 0.82 0.02 0.02 E40
|
||||
041 0.69 0.86 0.02 0.02 E41
|
||||
042 0.67 0.99 0.02 0.02 E42
|
||||
043 0.79 0.91 0.02 0.02 E43
|
||||
044 0.85 0.83 0.02 0.02 E44
|
||||
045 0.84 0.77 0.02 0.02 E45
|
||||
046 0.82 0.74 0.02 0.02 E46
|
||||
047 0.76 0.77 0.02 0.02 E47
|
||||
048 0.72 0.76 0.02 0.02 E48
|
||||
049 0.68 0.81 0.02 0.02 E49
|
||||
050 0.64 0.83 0.02 0.02 E50
|
||||
051 0.62 0.85 0.02 0.02 E51
|
||||
052 0.58 0.98 0.02 0.02 E52
|
||||
053 0.90 0.82 0.02 0.02 E53
|
||||
054 0.80 0.70 0.02 0.02 E54
|
||||
055 0.76 0.70 0.02 0.02 E55
|
||||
056 0.68 0.64 0.02 0.02 E56
|
||||
057 0.69 0.68 0.02 0.02 E57
|
||||
058 0.71 0.64 0.02 0.02 E58
|
||||
059 0.68 0.60 0.02 0.02 E59
|
||||
060 0.65 0.62 0.02 0.02 E60
|
||||
061 0.65 0.67 0.02 0.02 E61
|
||||
062 0.67 0.71 0.02 0.02 E62
|
||||
063 0.71 0.72 0.02 0.02 E63
|
||||
064 0.73 0.68 0.02 0.02 E64
|
||||
065 0.75 0.63 0.02 0.02 E65
|
||||
066 0.72 0.59 0.02 0.02 E66
|
||||
067 0.69 0.56 0.02 0.02 E67
|
||||
068 0.65 0.58 0.02 0.02 E68
|
||||
069 0.61 0.60 0.02 0.02 E69
|
||||
070 0.61 0.66 0.02 0.02 E70
|
||||
071 0.62 0.70 0.02 0.02 E71
|
||||
072 0.64 0.76 0.02 0.02 E72
|
||||
073 0.69 0.76 0.02 0.02 E73
|
||||
074 0.79 0.61 0.02 0.02 E74
|
||||
075 0.76 0.57 0.02 0.02 E75
|
||||
076 0.73 0.53 0.02 0.02 E76
|
||||
077 0.69 0.49 0.02 0.02 E77
|
||||
078 0.65 0.53 0.02 0.02 E78
|
||||
079 0.62 0.54 0.02 0.02 E79
|
||||
080 0.59 0.57 0.02 0.02 E80
|
||||
081 0.59 0.63 0.02 0.02 E81
|
||||
082 0.60 0.69 0.02 0.02 E82
|
||||
083 0.76 0.48 0.02 0.02 E83
|
||||
084 0.61 0.50 0.02 0.02 E84
|
||||
085 0.90 0.51 0.02 0.02 E85
|
||||
086 0.91 0.63 0.02 0.02 E86
|
||||
087 0.94 0.58 0.02 0.02 E87
|
||||
088 0.97 0.54 0.02 0.02 E88
|
||||
089 0.94 0.51 0.02 0.02 E89
|
||||
090 0.91 0.46 0.02 0.02 E90
|
||||
091 0.87 0.48 0.02 0.02 E91
|
||||
092 0.82 0.49 0.02 0.02 E92
|
||||
093 0.91 0.73 0.02 0.02 E93
|
||||
094 0.97 0.68 0.02 0.02 E94
|
||||
095 0.94 0.33 0.02 0.02 E95
|
||||
096 0.88 0.31 0.02 0.02 E96
|
||||
097 0.77 0.22 0.02 0.02 E97
|
||||
098 0.82 0.34 0.02 0.02 E98
|
||||
099 0.79 0.37 0.02 0.02 E99
|
||||
100 0.77 0.41 0.02 0.02 E100
|
||||
101 0.79 0.50 0.02 0.02 E101
|
||||
102 0.83 0.17 0.02 0.02 E102
|
||||
103 0.74 0.29 0.02 0.02 E103
|
||||
104 0.62 0.36 0.02 0.02 E104
|
||||
105 0.64 0.39 0.02 0.02 E105
|
||||
106 0.66 0.35 0.02 0.02 E106
|
||||
107 0.62 0.32 0.02 0.02 E107
|
||||
108 0.59 0.35 0.02 0.02 E108
|
||||
109 0.60 0.39 0.02 0.02 E109
|
||||
110 0.62 0.43 0.02 0.02 E110
|
||||
111 0.67 0.43 0.02 0.02 E111
|
||||
112 0.68 0.39 0.02 0.02 E112
|
||||
113 0.70 0.33 0.02 0.02 E113
|
||||
114 0.66 0.31 0.02 0.02 E114
|
||||
115 0.62 0.27 0.02 0.02 E115
|
||||
116 0.58 0.31 0.02 0.02 E116
|
||||
117 0.55 0.34 0.02 0.02 E117
|
||||
118 0.56 0.39 0.02 0.02 E118
|
||||
119 0.58 0.43 0.02 0.02 E119
|
||||
120 0.59 0.46 0.02 0.02 E120
|
||||
121 0.65 0.48 0.02 0.02 E121
|
||||
122 0.71 0.44 0.02 0.02 E122
|
||||
123 0.73 0.40 0.02 0.02 E123
|
||||
124 0.73 0.34 0.02 0.02 E124
|
||||
125 0.67 0.27 0.02 0.02 E125
|
||||
126 0.60 0.23 0.02 0.02 E126
|
||||
127 0.56 0.25 0.02 0.02 E127
|
||||
128 0.53 0.28 0.02 0.02 E128
|
||||
129 0.49 0.31 0.02 0.02 E129
|
||||
130 0.52 0.36 0.02 0.02 E130
|
||||
131 0.53 0.41 0.02 0.02 E131
|
||||
132 0.55 0.45 0.02 0.02 E132
|
||||
133 0.49 0.24 0.02 0.02 E133
|
||||
134 0.49 0.40 0.02 0.02 E134
|
||||
135 0.49 0.13 0.02 0.02 E135
|
||||
136 0.51 0.16 0.02 0.02 E136
|
||||
137 0.52 0.11 0.02 0.02 E137
|
||||
138 0.49 0.08 0.02 0.02 E138
|
||||
139 0.46 0.11 0.02 0.02 E139
|
||||
140 0.47 0.16 0.02 0.02 E140
|
||||
141 0.49 0.19 0.02 0.02 E141
|
||||
142 0.54 0.19 0.02 0.02 E142
|
||||
143 0.55 0.14 0.02 0.02 E143
|
||||
144 0.57 0.09 0.02 0.02 E144
|
||||
145 0.53 0.06 0.02 0.02 E145
|
||||
146 0.49 0.03 0.02 0.02 E146
|
||||
147 0.45 0.06 0.02 0.02 E147
|
||||
148 0.42 0.09 0.02 0.02 E148
|
||||
149 0.43 0.15 0.02 0.02 E149
|
||||
150 0.45 0.19 0.02 0.02 E150
|
||||
151 0.47 0.21 0.02 0.02 E151
|
||||
152 0.52 0.21 0.02 0.02 E152
|
||||
153 0.62 0.21 0.02 0.02 E153
|
||||
154 0.68 0.19 0.02 0.02 E154
|
||||
155 0.75 0.15 0.02 0.02 E155
|
||||
156 0.68 0.06 0.02 0.02 E156
|
||||
157 0.49 0.01 0.02 0.02 E157
|
||||
158 0.31 0.05 0.02 0.02 E158
|
||||
159 0.28 0.12 0.02 0.02 E159
|
||||
160 0.21 0.21 0.02 0.02 E160
|
||||
161 0.29 0.20 0.02 0.02 E161
|
||||
162 0.34 0.21 0.02 0.02 E162
|
||||
163 0.38 0.24 0.02 0.02 E163
|
||||
164 0.15 0.16 0.02 0.02 E164
|
||||
165 0.25 0.28 0.02 0.02 E165
|
||||
166 0.47 0.51 0.02 0.02 E166
|
||||
167 0.46 0.55 0.02 0.02 E167
|
||||
168 0.49 0.58 0.02 0.02 E168
|
||||
169 0.52 0.55 0.02 0.02 E169
|
||||
170 0.51 0.52 0.02 0.02 E170
|
||||
171 0.46 0.48 0.02 0.02 E171
|
||||
172 0.44 0.53 0.02 0.02 E172
|
||||
173 0.43 0.56 0.02 0.02 E173
|
||||
174 0.46 0.59 0.02 0.02 E174
|
||||
175 0.49 0.61 0.02 0.02 E175
|
||||
176 0.52 0.59 0.02 0.02 E176
|
||||
177 0.55 0.56 0.02 0.02 E177
|
||||
178 0.54 0.53 0.02 0.02 E178
|
||||
179 0.53 0.48 0.02 0.02 E179
|
||||
180 0.51 0.44 0.02 0.02 E180
|
||||
181 0.47 0.44 0.02 0.02 E181
|
||||
182 0.43 0.46 0.02 0.02 E182
|
||||
183 0.41 0.49 0.02 0.02 E183
|
||||
184 0.40 0.53 0.02 0.02 E184
|
||||
185 0.41 0.58 0.02 0.02 E185
|
||||
186 0.43 0.61 0.02 0.02 E186
|
||||
187 0.46 0.64 0.02 0.02 E187
|
||||
188 0.53 0.64 0.02 0.02 E188
|
||||
189 0.56 0.61 0.02 0.02 E189
|
||||
190 0.59 0.53 0.02 0.02 E190
|
||||
191 0.57 0.48 0.02 0.02 E191
|
||||
192 0.37 0.50 0.02 0.02 E192
|
||||
193 0.36 0.36 0.02 0.02 E193
|
||||
194 0.39 0.39 0.02 0.02 E194
|
||||
195 0.40 0.35 0.02 0.02 E195
|
||||
196 0.36 0.32 0.02 0.02 E196
|
||||
197 0.33 0.35 0.02 0.02 E197
|
||||
198 0.34 0.39 0.02 0.02 E198
|
||||
199 0.36 0.44 0.02 0.02 E199
|
||||
200 0.41 0.43 0.02 0.02 E200
|
||||
201 0.43 0.38 0.02 0.02 E201
|
||||
202 0.44 0.33 0.02 0.02 E202
|
||||
203 0.40 0.31 0.02 0.02 E203
|
||||
204 0.36 0.28 0.02 0.02 E204
|
||||
205 0.33 0.31 0.02 0.02 E205
|
||||
206 0.29 0.34 0.02 0.02 E206
|
||||
207 0.31 0.39 0.02 0.02 E207
|
||||
208 0.32 0.43 0.02 0.02 E208
|
||||
209 0.35 0.48 0.02 0.02 E209
|
||||
210 0.39 0.46 0.02 0.02 E210
|
||||
211 0.45 0.41 0.02 0.02 E211
|
||||
212 0.47 0.36 0.02 0.02 E212
|
||||
213 0.46 0.28 0.02 0.02 E213
|
||||
214 0.42 0.25 0.02 0.02 E214
|
||||
215 0.31 0.28 0.02 0.02 E215
|
||||
216 0.26 0.34 0.02 0.02 E216
|
||||
217 0.22 0.44 0.02 0.02 E217
|
||||
218 0.26 0.40 0.02 0.02 E218
|
||||
219 0.28 0.45 0.02 0.02 E219
|
||||
220 0.30 0.49 0.02 0.02 E220
|
||||
221 0.23 0.48 0.02 0.02 E221
|
||||
222 0.10 0.51 0.02 0.02 E222
|
||||
223 0.18 0.49 0.02 0.02 E223
|
||||
224 0.13 0.48 0.02 0.02 E224
|
||||
225 0.09 0.46 0.02 0.02 E225
|
||||
226 0.06 0.51 0.02 0.02 E226
|
||||
227 0.03 0.54 0.02 0.02 E227
|
||||
228 0.06 0.58 0.02 0.02 E228
|
||||
229 0.09 0.63 0.02 0.02 E229
|
||||
230 0.18 0.76 0.02 0.02 E230
|
||||
231 0.19 0.71 0.02 0.02 E231
|
||||
232 0.21 0.64 0.02 0.02 E232
|
||||
233 0.20 0.54 0.02 0.02 E233
|
||||
234 0.19 0.39 0.02 0.02 E234
|
||||
235 0.17 0.33 0.02 0.02 E235
|
||||
236 0.10 0.31 0.02 0.02 E236
|
||||
237 0.05 0.33 0.02 0.02 E237
|
||||
238 0.03 0.67 0.02 0.02 E238
|
||||
239 0.09 0.74 0.02 0.02 E239
|
||||
240 0.15 0.79 0.02 0.02 E240
|
||||
241 0.23 0.78 0.02 0.02 E241
|
||||
242 0.08 0.81 0.02 0.02 E242
|
||||
243 0.31 0.64 0.02 0.02 E243
|
||||
244 0.34 0.67 0.02 0.02 E244
|
||||
245 0.34 0.62 0.02 0.02 E245
|
||||
246 0.31 0.60 0.02 0.02 E246
|
||||
247 0.27 0.63 0.02 0.02 E247
|
||||
248 0.29 0.67 0.02 0.02 E248
|
||||
249 0.32 0.71 0.02 0.02 E249
|
||||
250 0.37 0.70 0.02 0.02 E250
|
||||
251 0.37 0.65 0.02 0.02 E251
|
||||
252 0.38 0.60 0.02 0.02 E252
|
||||
253 0.34 0.58 0.02 0.02 E253
|
||||
254 0.30 0.55 0.02 0.02 E254
|
||||
255 0.27 0.58 0.02 0.02 E255
|
||||
256 0.23 0.62 0.02 0.02 E256
|
||||
257 0.25 0.67 0.02 0.02 E257
|
||||
258 0.28 0.72 0.02 0.02 E258
|
||||
259 0.30 0.76 0.02 0.02 E259
|
||||
260 0.35 0.75 0.02 0.02 E260
|
||||
261 0.40 0.68 0.02 0.02 E261
|
||||
262 0.40 0.64 0.02 0.02 E262
|
||||
263 0.37 0.55 0.02 0.02 E263
|
||||
264 0.34 0.52 0.02 0.02 E264
|
||||
265 0.26 0.53 0.02 0.02 E265
|
||||
266 0.23 0.56 0.02 0.02 E266
|
||||
267 0.23 0.70 0.02 0.02 E267
|
||||
268 0.28 0.77 0.02 0.02 E268
|
||||
269 0.32 0.81 0.02 0.02 E269
|
||||
270 0.27 0.87 0.02 0.02 E270
|
||||
271 0.23 0.89 0.02 0.02 E271
|
||||
272 0.24 0.84 0.02 0.02 E272
|
||||
273 0.28 0.83 0.02 0.02 E273
|
||||
274 0.30 0.87 0.02 0.02 E274
|
||||
275 0.32 0.99 0.02 0.02 E275
|
||||
276 0.21 0.91 0.02 0.02 E276
|
||||
277 0.16 0.87 0.02 0.02 E277
|
||||
278 0.34 0.83 0.02 0.02 E278
|
||||
279 0.37 0.84 0.02 0.02 E279
|
||||
280 0.41 0.98 0.02 0.02 E280
|
||||
281 0.49 0.54 0.02 0.02 E281
|
||||
126
mne/channels/data/layouts/KIT-125.lout
Normal file
@@ -0,0 +1,126 @@
|
||||
-0.50 0.50 -0.50 0.50
|
||||
001 0.12 -0.10 0.04 0.03 MEG 001
|
||||
002 0.15 -0.06 0.04 0.03 MEG 002
|
||||
003 0.03 -0.15 0.04 0.03 MEG 003
|
||||
004 -0.22 -0.29 0.04 0.03 MEG 004
|
||||
005 -0.28 -0.23 0.04 0.03 MEG 005
|
||||
006 -0.33 -0.15 0.04 0.03 MEG 006
|
||||
007 -0.07 -0.36 0.04 0.03 MEG 007
|
||||
008 0.09 -0.36 0.04 0.03 MEG 008
|
||||
009 -0.06 -0.25 0.04 0.03 MEG 009
|
||||
010 -0.18 0.18 0.04 0.03 MEG 010
|
||||
011 -0.10 0.25 0.04 0.03 MEG 011
|
||||
012 -0.15 0.22 0.04 0.03 MEG 012
|
||||
013 -0.37 0.13 0.04 0.03 MEG 013
|
||||
014 -0.36 -0.06 0.04 0.03 MEG 014
|
||||
015 -0.18 -0.41 0.04 0.03 MEG 015
|
||||
016 -0.27 -0.35 0.04 0.03 MEG 016
|
||||
017 -0.16 -0.19 0.04 0.03 MEG 017
|
||||
018 -0.18 -0.10 0.04 0.03 MEG 018
|
||||
019 -0.14 -0.14 0.04 0.03 MEG 019
|
||||
020 -0.30 -0.04 0.04 0.03 MEG 020
|
||||
021 -0.31 0.11 0.04 0.03 MEG 021
|
||||
022 -0.37 0.04 0.04 0.03 MEG 022
|
||||
023 -0.20 -0.14 0.04 0.03 MEG 023
|
||||
024 -0.11 -0.23 0.04 0.03 MEG 024
|
||||
025 -0.11 -0.11 0.04 0.03 MEG 025
|
||||
026 -0.02 -0.14 0.04 0.03 MEG 026
|
||||
027 -0.13 -0.28 0.04 0.03 MEG 027
|
||||
028 -0.24 -0.18 0.04 0.03 MEG 028
|
||||
029 -0.19 -0.23 0.04 0.03 MEG 029
|
||||
030 -0.21 0.01 0.04 0.03 MEG 030
|
||||
031 -0.21 0.07 0.04 0.03 MEG 031
|
||||
032 -0.20 0.13 0.04 0.03 MEG 032
|
||||
033 -0.12 0.08 0.04 0.03 MEG 033
|
||||
034 -0.09 -0.07 0.04 0.03 MEG 034
|
||||
035 -0.12 0.03 0.04 0.03 MEG 035
|
||||
036 -0.25 0.11 0.04 0.03 MEG 036
|
||||
037 -0.25 -0.03 0.04 0.03 MEG 037
|
||||
038 -0.23 -0.09 0.04 0.03 MEG 038
|
||||
039 -0.26 0.04 0.04 0.03 MEG 039
|
||||
040 -0.14 -0.06 0.04 0.03 MEG 040
|
||||
041 -0.00 0.29 0.04 0.03 MEG 041
|
||||
042 0.09 0.26 0.04 0.03 MEG 042
|
||||
043 -0.07 -0.00 0.04 0.03 MEG 043
|
||||
044 -0.07 0.09 0.04 0.03 MEG 044
|
||||
045 -0.34 -0.28 0.04 0.03 MEG 045
|
||||
046 -0.43 -0.09 0.04 0.03 MEG 046
|
||||
047 -0.45 0.03 0.04 0.03 MEG 047
|
||||
048 -0.44 0.14 0.04 0.03 MEG 048
|
||||
049 -0.07 0.21 0.04 0.03 MEG 049
|
||||
050 -0.15 0.15 0.04 0.03 MEG 050
|
||||
051 -0.16 -0.02 0.04 0.03 MEG 051
|
||||
052 -0.17 0.04 0.04 0.03 MEG 052
|
||||
053 0.07 0.17 0.04 0.03 MEG 053
|
||||
054 -0.07 0.17 0.04 0.03 MEG 054
|
||||
055 0.00 0.14 0.04 0.03 MEG 055
|
||||
056 0.08 0.09 0.04 0.03 MEG 056
|
||||
057 0.21 -0.39 0.04 0.03 MEG 057
|
||||
058 0.09 -0.06 0.04 0.03 MEG 058
|
||||
059 -0.04 -0.09 0.04 0.03 MEG 059
|
||||
060 0.05 -0.09 0.04 0.03 MEG 060
|
||||
061 0.17 -0.18 0.04 0.03 MEG 061
|
||||
062 0.06 -0.19 0.04 0.03 MEG 062
|
||||
063 -0.04 -0.19 0.04 0.03 MEG 063
|
||||
064 0.01 -0.20 0.04 0.03 MEG 064
|
||||
065 0.19 -0.09 0.04 0.03 MEG 065
|
||||
066 0.01 -0.31 0.04 0.03 MEG 066
|
||||
067 0.14 -0.27 0.04 0.03 MEG 067
|
||||
068 0.24 -0.28 0.04 0.03 MEG 068
|
||||
069 0.34 -0.13 0.04 0.03 MEG 069
|
||||
070 0.29 -0.21 0.04 0.03 MEG 070
|
||||
071 0.30 -0.33 0.04 0.03 MEG 071
|
||||
072 0.02 -0.45 0.04 0.03 MEG 072
|
||||
073 0.21 -0.14 0.04 0.03 MEG 073
|
||||
074 0.24 -0.08 0.04 0.03 MEG 074
|
||||
075 0.26 0.12 0.04 0.03 MEG 075
|
||||
076 0.26 0.05 0.04 0.03 MEG 076
|
||||
077 0.07 -0.24 0.04 0.03 MEG 077
|
||||
078 0.12 -0.22 0.04 0.03 MEG 078
|
||||
079 0.22 0.02 0.04 0.03 MEG 079
|
||||
080 0.15 -0.13 0.04 0.03 MEG 080
|
||||
081 0.43 0.16 0.04 0.03 MEG 081
|
||||
082 0.22 0.09 0.04 0.03 MEG 082
|
||||
083 0.18 0.19 0.04 0.03 MEG 083
|
||||
084 0.14 0.23 0.04 0.03 MEG 084
|
||||
085 0.20 0.14 0.04 0.03 MEG 085
|
||||
086 0.36 -0.04 0.04 0.03 MEG 086
|
||||
087 0.36 0.15 0.04 0.03 MEG 087
|
||||
088 0.26 -0.02 0.04 0.03 MEG 088
|
||||
089 0.25 -0.17 0.04 0.03 MEG 089
|
||||
090 0.30 0.13 0.04 0.03 MEG 090
|
||||
091 0.30 -0.03 0.04 0.03 MEG 091
|
||||
092 0.37 0.05 0.04 0.03 MEG 092
|
||||
093 0.14 0.15 0.04 0.03 MEG 093
|
||||
094 0.17 0.05 0.04 0.03 MEG 094
|
||||
095 0.17 -0.01 0.04 0.03 MEG 095
|
||||
096 0.45 0.06 0.04 0.03 MEG 096
|
||||
097 0.13 0.03 0.04 0.03 MEG 097
|
||||
098 -0.04 0.07 0.04 0.03 MEG 098
|
||||
099 0.04 0.07 0.04 0.03 MEG 099
|
||||
100 -0.04 0.01 0.04 0.03 MEG 100
|
||||
101 0.04 0.02 0.04 0.03 MEG 101
|
||||
102 0.36 -0.25 0.04 0.03 MEG 102
|
||||
103 0.44 -0.05 0.04 0.03 MEG 103
|
||||
104 0.20 -0.23 0.04 0.03 MEG 104
|
||||
105 0.08 -0.00 0.04 0.03 MEG 105
|
||||
106 -0.04 -0.04 0.04 0.03 MEG 106
|
||||
107 0.00 -0.05 0.04 0.03 MEG 107
|
||||
108 0.05 -0.04 0.04 0.03 MEG 108
|
||||
109 0.02 0.23 0.04 0.03 MEG 109
|
||||
110 -0.03 0.23 0.04 0.03 MEG 110
|
||||
111 0.07 0.22 0.04 0.03 MEG 111
|
||||
112 0.13 0.09 0.04 0.03 MEG 112
|
||||
113 0.18 -0.33 0.04 0.03 MEG 113
|
||||
114 -0.10 0.13 0.04 0.03 MEG 114
|
||||
115 0.11 -0.43 0.04 0.03 MEG 115
|
||||
116 0.29 -0.10 0.04 0.03 MEG 116
|
||||
117 -0.06 -0.30 0.04 0.03 MEG 117
|
||||
118 0.11 0.13 0.04 0.03 MEG 118
|
||||
119 0.21 -0.03 0.04 0.03 MEG 119
|
||||
120 0.08 -0.30 0.04 0.03 MEG 120
|
||||
121 -0.20 -0.05 0.04 0.03 MEG 121
|
||||
122 -0.08 -0.44 0.04 0.03 MEG 122
|
||||
123 -0.15 -0.34 0.04 0.03 MEG 123
|
||||
124 0.02 -0.37 0.04 0.03 MEG 124
|
||||
125 -0.28 -0.11 0.04 0.03 MEG 125
|
||||
158
mne/channels/data/layouts/KIT-157.lout
Normal file
@@ -0,0 +1,158 @@
|
||||
-42.19 43.52 -41.7 28.71
|
||||
001 9.78 -14.18 4.00 3.00 MEG 001
|
||||
002 3.31 -16.56 4.00 3.00 MEG 002
|
||||
003 12.02 -19.42 4.00 3.00 MEG 003
|
||||
004 8.08 -21.05 4.00 3.00 MEG 004
|
||||
005 4.12 -22.01 4.00 3.00 MEG 005
|
||||
006 15.80 -16.63 4.00 3.00 MEG 006
|
||||
007 10.21 -12.01 4.00 3.00 MEG 007
|
||||
008 7.23 -13.67 4.00 3.00 MEG 008
|
||||
009 -22.12 -3.07 4.00 3.00 MEG 009
|
||||
010 -13.99 -13.09 4.00 3.00 MEG 010
|
||||
011 -21.05 -7.51 4.00 3.00 MEG 011
|
||||
012 -18.85 -12.06 4.00 3.00 MEG 012
|
||||
013 -0.14 -16.77 4.00 3.00 MEG 013
|
||||
014 -6.69 -15.41 4.00 3.00 MEG 014
|
||||
015 -10.69 -15.56 4.00 3.00 MEG 015
|
||||
016 -3.91 -10.00 4.00 3.00 MEG 016
|
||||
017 0.80 -6.66 4.00 3.00 MEG 017
|
||||
018 3.74 -20.66 4.00 3.00 MEG 018
|
||||
019 15.01 -15.63 4.00 3.00 MEG 019
|
||||
020 4.16 -14.75 4.00 3.00 MEG 020
|
||||
021 16.72 -0.60 4.00 3.00 MEG 021
|
||||
022 14.31 -7.30 4.00 3.00 MEG 022
|
||||
023 1.27 -13.23 4.00 3.00 MEG 023
|
||||
024 9.63 -10.10 4.00 3.00 MEG 024
|
||||
025 -1.74 -14.94 4.00 3.00 MEG 025
|
||||
026 -4.68 -14.12 4.00 3.00 MEG 026
|
||||
027 -1.65 -8.33 4.00 3.00 MEG 027
|
||||
028 -6.53 -8.53 4.00 3.00 MEG 028
|
||||
029 -8.52 -6.61 4.00 3.00 MEG 029
|
||||
030 -10.18 -4.27 4.00 3.00 MEG 030
|
||||
031 -11.14 -1.21 4.00 3.00 MEG 031
|
||||
032 -4.02 -18.39 4.00 3.00 MEG 032
|
||||
033 19.69 0.13 4.00 3.00 MEG 033
|
||||
034 4.03 -8.21 4.00 3.00 MEG 034
|
||||
035 3.56 0.14 4.00 3.00 MEG 035
|
||||
036 4.19 -12.79 4.00 3.00 MEG 036
|
||||
037 19.43 -3.03 4.00 3.00 MEG 037
|
||||
038 20.99 -9.54 4.00 3.00 MEG 038
|
||||
039 15.93 -11.27 4.00 3.00 MEG 039
|
||||
040 22.46 -5.52 4.00 3.00 MEG 040
|
||||
041 -9.37 -8.82 4.00 3.00 MEG 041
|
||||
042 -6.93 -10.92 4.00 3.00 MEG 042
|
||||
043 -1.56 -13.07 4.00 3.00 MEG 043
|
||||
044 -7.75 -20.89 4.00 3.00 MEG 044
|
||||
045 -11.74 -19.07 4.00 3.00 MEG 045
|
||||
046 0.31 -22.23 4.00 3.00 MEG 046
|
||||
047 -3.75 -21.89 4.00 3.00 MEG 047
|
||||
048 -3.89 -5.28 4.00 3.00 MEG 048
|
||||
049 23.23 -0.95 4.00 3.00 MEG 049
|
||||
050 13.94 -14.13 4.00 3.00 MEG 050
|
||||
051 7.41 -17.72 4.00 3.00 MEG 051
|
||||
052 19.50 -8.59 4.00 3.00 MEG 052
|
||||
053 18.26 -7.47 4.00 3.00 MEG 053
|
||||
054 18.19 -2.34 4.00 3.00 MEG 054
|
||||
055 14.76 -9.91 4.00 3.00 MEG 055
|
||||
056 21.32 -0.18 4.00 3.00 MEG 056
|
||||
057 -1.88 -3.98 4.00 3.00 MEG 057
|
||||
058 3.56 -3.73 4.00 3.00 MEG 058
|
||||
059 -12.57 -8.25 4.00 3.00 MEG 059
|
||||
060 -7.56 -12.70 4.00 3.00 MEG 060
|
||||
061 -15.02 -1.73 4.00 3.00 MEG 061
|
||||
062 -11.53 -17.47 4.00 3.00 MEG 062
|
||||
063 -0.18 -18.90 4.00 3.00 MEG 063
|
||||
064 -6.61 -0.05 4.00 3.00 MEG 064
|
||||
065 6.73 -9.47 4.00 3.00 MEG 065
|
||||
066 1.16 -8.63 4.00 3.00 MEG 066
|
||||
067 18.43 8.05 4.00 3.00 MEG 067
|
||||
068 16.27 12.00 4.00 3.00 MEG 068
|
||||
069 19.53 3.47 4.00 3.00 MEG 069
|
||||
070 11.49 5.68 4.00 3.00 MEG 070
|
||||
071 12.54 -0.07 4.00 3.00 MEG 071
|
||||
072 12.40 3.05 4.00 3.00 MEG 072
|
||||
073 -15.98 -9.55 4.00 3.00 MEG 073
|
||||
074 -18.65 -1.75 4.00 3.00 MEG 074
|
||||
075 -17.81 -5.83 4.00 3.00 MEG 075
|
||||
076 -1.09 0.06 4.00 3.00 MEG 076
|
||||
077 -1.11 2.07 4.00 3.00 MEG 077
|
||||
078 -17.59 -10.78 4.00 3.00 MEG 078
|
||||
079 -20.36 -2.47 4.00 3.00 MEG 079
|
||||
080 -16.06 10.29 4.00 3.00 MEG 080
|
||||
081 10.71 -5.93 4.00 3.00 MEG 081
|
||||
082 12.02 -3.35 4.00 3.00 MEG 082
|
||||
083 19.99 8.66 4.00 3.00 MEG 083
|
||||
084 15.61 15.53 4.00 3.00 MEG 084
|
||||
085 5.76 -4.95 4.00 3.00 MEG 085
|
||||
086 12.48 13.62 4.00 3.00 MEG 086
|
||||
087 18.03 3.69 4.00 3.00 MEG 087
|
||||
088 14.69 11.11 4.00 3.00 MEG 088
|
||||
089 -19.42 6.89 4.00 3.00 MEG 089
|
||||
090 -16.09 14.39 4.00 3.00 MEG 090
|
||||
091 -6.70 -5.77 4.00 3.00 MEG 091
|
||||
092 -12.37 -11.31 4.00 3.00 MEG 092
|
||||
093 -1.72 9.34 4.00 3.00 MEG 093
|
||||
094 -4.12 1.65 4.00 3.00 MEG 094
|
||||
095 -18.66 2.58 4.00 3.00 MEG 095
|
||||
096 -17.76 6.59 4.00 3.00 MEG 096
|
||||
097 8.82 -5.11 4.00 3.00 MEG 097
|
||||
098 8.79 -7.85 4.00 3.00 MEG 098
|
||||
099 15.43 6.10 4.00 3.00 MEG 099
|
||||
100 11.93 11.57 4.00 3.00 MEG 100
|
||||
101 16.58 7.80 4.00 3.00 MEG 101
|
||||
102 8.27 6.69 4.00 3.00 MEG 102
|
||||
103 11.62 -8.00 4.00 3.00 MEG 103
|
||||
104 13.11 -5.40 4.00 3.00 MEG 104
|
||||
105 -13.38 0.11 4.00 3.00 MEG 105
|
||||
106 -12.78 -3.22 4.00 3.00 MEG 106
|
||||
107 -12.98 3.35 4.00 3.00 MEG 107
|
||||
108 -11.84 6.58 4.00 3.00 MEG 108
|
||||
109 -10.08 9.11 4.00 3.00 MEG 109
|
||||
110 -16.27 -5.03 4.00 3.00 MEG 110
|
||||
111 -11.45 -6.21 4.00 3.00 MEG 111
|
||||
112 -0.59 5.83 4.00 3.00 MEG 112
|
||||
113 14.18 -2.06 4.00 3.00 MEG 113
|
||||
114 14.48 1.15 4.00 3.00 MEG 114
|
||||
115 12.68 7.37 4.00 3.00 MEG 115
|
||||
116 13.93 4.46 4.00 3.00 MEG 116
|
||||
117 8.98 11.57 4.00 3.00 MEG 117
|
||||
118 6.35 12.95 4.00 3.00 MEG 118
|
||||
119 11.01 9.71 4.00 3.00 MEG 119
|
||||
120 0.01 16.08 4.00 3.00 MEG 120
|
||||
121 -16.87 2.69 4.00 3.00 MEG 121
|
||||
122 -16.02 6.38 4.00 3.00 MEG 122
|
||||
123 -14.38 9.83 4.00 3.00 MEG 123
|
||||
124 -12.23 12.65 4.00 3.00 MEG 124
|
||||
125 -10.14 5.19 4.00 3.00 MEG 125
|
||||
126 -5.63 12.72 4.00 3.00 MEG 126
|
||||
127 -2.90 13.72 4.00 3.00 MEG 127
|
||||
128 -7.93 11.11 4.00 3.00 MEG 128
|
||||
129 6.83 14.86 4.00 3.00 MEG 129
|
||||
130 7.63 3.51 4.00 3.00 MEG 130
|
||||
131 8.56 0.40 4.00 3.00 MEG 131
|
||||
132 -2.70 7.01 4.00 3.00 MEG 132
|
||||
133 3.09 11.73 4.00 3.00 MEG 133
|
||||
134 8.14 9.62 4.00 3.00 MEG 134
|
||||
135 2.84 2.47 4.00 3.00 MEG 135
|
||||
136 4.05 6.89 4.00 3.00 MEG 136
|
||||
137 -6.16 14.64 4.00 3.00 MEG 137
|
||||
138 -11.02 2.49 4.00 3.00 MEG 138
|
||||
139 -6.78 6.65 4.00 3.00 MEG 139
|
||||
140 -6.24 3.18 4.00 3.00 MEG 140
|
||||
141 -6.83 9.47 4.00 3.00 MEG 141
|
||||
142 -2.48 11.64 4.00 3.00 MEG 142
|
||||
143 -17.59 14.92 4.00 3.00 MEG 143
|
||||
144 -22.23 2.07 4.00 3.00 MEG 144
|
||||
145 3.20 13.71 4.00 3.00 MEG 145
|
||||
146 2.06 5.84 4.00 3.00 MEG 146
|
||||
147 5.76 1.93 4.00 3.00 MEG 147
|
||||
148 23.08 3.86 4.00 3.00 MEG 148
|
||||
149 21.96 8.34 4.00 3.00 MEG 149
|
||||
150 20.00 12.43 4.00 3.00 MEG 150
|
||||
151 17.22 16.08 4.00 3.00 MEG 151
|
||||
152 3.91 9.37 4.00 3.00 MEG 152
|
||||
153 -21.58 6.32 4.00 3.00 MEG 153
|
||||
154 -20.17 10.61 4.00 3.00 MEG 154
|
||||
155 -11.01 10.95 4.00 3.00 MEG 155
|
||||
156 -14.51 5.43 4.00 3.00 MEG 156
|
||||
157 1.28 9.74 4.00 3.00 MEG 157
|
||||
162
mne/channels/data/layouts/KIT-160.lay
Normal file
@@ -0,0 +1,162 @@
|
||||
001 -0.0758202152 0.3520500341 0.03188472676 0.02713339699 MEG 001
|
||||
002 -0.1261117022 0.328933222 0.03188472676 0.02713339699 MEG 002
|
||||
003 -0.1696053658 0.2965692769 0.03188472676 0.02713339699 MEG 003
|
||||
004 0.1650030446 0.2798950608 0.03188472676 0.02713339699 MEG 004
|
||||
005 -0.1114275357 0.2868555816 0.03188472676 0.02713339699 MEG 005
|
||||
006 -0.06544380774 0.2622312709 0.03188472676 0.02713339699 MEG 006
|
||||
007 -0.1353647314 0.2073255917 0.03188472676 0.02713339699 MEG 007
|
||||
008 -0.17422271 0.1205755843 0.03188472676 0.02713339699 MEG 008
|
||||
009 -0.01368858767 0.2301473849 0.03188472676 0.02713339699 MEG 009
|
||||
010 -0.06470805562 0.2189319658 0.03188472676 0.02713339699 MEG 010
|
||||
011 -0.1247701784 0.1499178411 0.03188472676 0.02713339699 MEG 011
|
||||
012 -0.03961772545 0.1793694653 0.03188472676 0.02713339699 MEG 012
|
||||
013 -0.0711276654 0.1599000923 0.03188472676 0.02713339699 MEG 013
|
||||
014 -0.09668684076 0.1249745081 0.03188472676 0.02713339699 MEG 014
|
||||
015 -0.1103655395 0.08862749713 0.03188472676 0.02713339699 MEG 015
|
||||
016 -0.03953495363 0.1363424548 0.03188472676 0.02713339699 MEG 016
|
||||
017 -0.1781804786 0.01931847664 0.03188472676 0.02713339699 MEG 017
|
||||
018 -0.142520225 -0.06752066402 0.03188472676 0.02713339699 MEG 018
|
||||
019 -0.08088893708 -0.1241365481 0.03188472676 0.02713339699 MEG 019
|
||||
020 -0.04456843369 -0.1415706457 0.03188472676 0.02713339699 MEG 020
|
||||
021 -0.1426655535 0.05244256024 0.03188472676 0.02713339699 MEG 021
|
||||
022 -0.1340581452 0.000388349131 0.03188472676 0.02713339699 MEG 022
|
||||
023 -0.08512707038 -0.07696214533 0.03188472676 0.02713339699 MEG 023
|
||||
024 -0.04736054836 -0.09618399923 0.03188472676 0.02713339699 MEG 024
|
||||
025 -0.114643504 -0.04085422212 0.03188472676 0.02713339699 MEG 025
|
||||
026 -0.1103503321 0.03823179105 0.03188472676 0.02713339699 MEG 026
|
||||
027 -0.03958310463 -0.05556958642 0.03188472676 0.02713339699 MEG 027
|
||||
028 -0.06993629917 0.01943095503 0.03188472676 0.02713339699 MEG 028
|
||||
029 -0.04398320652 -0.01300040853 0.03188472676 0.02713339699 MEG 029
|
||||
030 -0.004227454924 -0.01962159408 0.03188472676 0.02713339699 MEG 030
|
||||
031 -0.01056467818 0.1062293634 0.03188472676 0.02713339699 MEG 031
|
||||
032 -0.04021127484 0.08385147042 0.03188472676 0.02713339699 MEG 032
|
||||
033 -0.3500780541 0.3978039282 0.03188472676 0.02713339699 MEG 033
|
||||
034 -0.400516673 0.3077821901 0.03188472676 0.02713339699 MEG 034
|
||||
035 -0.4325895921 0.2136911051 0.03188472676 0.02713339699 MEG 035
|
||||
036 -0.45 0.1074214926 0.03188472676 0.02713339699 MEG 036
|
||||
037 -0.3046138565 0.3570489454 0.03188472676 0.02713339699 MEG 037
|
||||
038 -0.3775870934 0.1989319321 0.03188472676 0.02713339699 MEG 038
|
||||
039 -0.3470032996 0.2860012743 0.03188472676 0.02713339699 MEG 039
|
||||
040 -0.2596101607 0.2361677074 0.03188472676 0.02713339699 MEG 040
|
||||
041 -0.3370312654 0.1080933205 0.03188472676 0.02713339699 MEG 041
|
||||
042 -0.2054494635 0.2529931344 0.03188472676 0.02713339699 MEG 042
|
||||
043 -0.2819761985 0.1711718789 0.03188472676 0.02713339699 MEG 043
|
||||
044 -0.2293126541 0.2020325726 0.03188472676 0.02713339699 MEG 044
|
||||
045 -0.253186216 0.08822084019 0.03188472676 0.02713339699 MEG 045
|
||||
046 -0.177239753 0.2148932642 0.03188472676 0.02713339699 MEG 046
|
||||
047 -0.1982663002 0.1636997157 0.03188472676 0.02713339699 MEG 047
|
||||
048 -0.2443663193 0.1429437606 0.03188472676 0.02713339699 MEG 048
|
||||
049 -0.3888843678 0.1059383909 0.03188472676 0.02713339699 MEG 049
|
||||
050 -0.4270282413 -0.09637491351 0.03188472676 0.02713339699 MEG 050
|
||||
051 -0.2842037041 -0.02907823435 0.03188472676 0.02713339699 MEG 051
|
||||
052 -0.3447270537 -0.2595887593 0.03188472676 0.02713339699 MEG 052
|
||||
053 -0.3909909615 0.01655882049 0.03188472676 0.02713339699 MEG 053
|
||||
054 -0.2988307343 -0.1206055812 0.03188472676 0.02713339699 MEG 054
|
||||
055 -0.2625165926 -0.18469877 0.03188472676 0.02713339699 MEG 055
|
||||
056 -0.3742205763 -0.06701211297 0.03188472676 0.02713339699 MEG 056
|
||||
057 -0.3368815045 0.02914339448 0.03188472676 0.02713339699 MEG 057
|
||||
058 -0.2614922293 -0.09693316038 0.03188472676 0.02713339699 MEG 058
|
||||
059 -0.2296354398 -0.1520887173 0.03188472676 0.02713339699 MEG 059
|
||||
060 -0.2424341314 -0.03356215166 0.03188472676 0.02713339699 MEG 060
|
||||
061 -0.1876464844 -0.1390883676 0.03188472676 0.02713339699 MEG 061
|
||||
062 -0.2141382597 0.06121102293 0.03188472676 0.02713339699 MEG 062
|
||||
063 -0.210559287 0.002243140577 0.03188472676 0.02713339699 MEG 063
|
||||
064 -0.1972138638 -0.04829819556 0.03188472676 0.02713339699 MEG 064
|
||||
065 0.1239897025 0.3184822507 0.03188472676 0.02713339699 MEG 065
|
||||
066 0.07602269198 0.346841814 0.03188472676 0.02713339699 MEG 066
|
||||
067 0.02730949028 0.3618289046 0.03188472676 0.02713339699 MEG 067
|
||||
068 -0.02876209065 0.3665275653 0.03188472676 0.02713339699 MEG 068
|
||||
069 0.06023566248 0.305037035 0.03188472676 0.02713339699 MEG 069
|
||||
070 0.01553893996 0.3208156125 0.03188472676 0.02713339699 MEG 070
|
||||
071 0.1455353008 0.1519564037 0.03188472676 0.02713339699 MEG 071
|
||||
072 0.09261086754 0.2300225572 0.03188472676 0.02713339699 MEG 072
|
||||
073 0.01800727232 0.2722816956 0.03188472676 0.02713339699 MEG 073
|
||||
074 0.09471660492 0.1660243591 0.03188472676 0.02713339699 MEG 074
|
||||
075 0.02256442482 0.2241822666 0.03188472676 0.02713339699 MEG 075
|
||||
076 0.1172275823 0.121354496 0.03188472676 0.02713339699 MEG 076
|
||||
077 0.06434989605 0.1443350384 0.03188472676 0.02713339699 MEG 077
|
||||
078 0.03192340214 0.1736460766 0.03188472676 0.02713339699 MEG 078
|
||||
079 0.002050178715 0.1879975831 0.03188472676 0.02713339699 MEG 079
|
||||
080 0.003697062517 0.143421051 0.03188472676 0.02713339699 MEG 080
|
||||
081 -0.003899772644 -0.1490601771 0.03188472676 0.02713339699 MEG 081
|
||||
082 0.0711394085 -0.1177609441 0.03188472676 0.02713339699 MEG 082
|
||||
083 0.1339233002 -0.04641972764 0.03188472676 0.02713339699 MEG 083
|
||||
084 0.1624045334 0.04808542023 0.03188472676 0.02713339699 MEG 084
|
||||
085 0.03165333222 -0.09469832945 0.03188472676 0.02713339699 MEG 085
|
||||
086 0.07137560881 -0.06228631109 0.03188472676 0.02713339699 MEG 086
|
||||
087 0.1185350219 0.01900269558 0.03188472676 0.02713339699 MEG 087
|
||||
088 0.1266742656 0.06930579768 0.03188472676 0.02713339699 MEG 088
|
||||
089 -0.004420218989 -0.06278528823 0.03188472676 0.02713339699 MEG 089
|
||||
090 0.06173501644 -0.0229233209 0.03188472676 0.02713339699 MEG 090
|
||||
091 0.08381840152 0.01449327322 0.03188472676 0.02713339699 MEG 091
|
||||
092 0.02911019425 -0.004626517545 0.03188472676 0.02713339699 MEG 092
|
||||
093 0.05293614742 0.03703628974 0.03188472676 0.02713339699 MEG 093
|
||||
094 0.08589158435 0.06075797622 0.03188472676 0.02713339699 MEG 094
|
||||
095 -0.007916726978 0.01526702488 0.03188472676 0.02713339699 MEG 095
|
||||
096 0.02152774438 0.08873530965 0.03188472676 0.02713339699 MEG 096
|
||||
097 0.4428288832 0.1535592899 0.03188472676 0.02713339699 MEG 097
|
||||
098 0.4162971034 0.267171892 0.03188472676 0.02713339699 MEG 098
|
||||
099 0.3668411201 0.3681231645 0.03188472676 0.02713339699 MEG 099
|
||||
100 0.3105057204 0.45 0.03188472676 0.02713339699 MEG 100
|
||||
101 0.3522874782 0.2435209125 0.03188472676 0.02713339699 MEG 101
|
||||
102 0.2611099363 0.4005591579 0.03188472676 0.02713339699 MEG 102
|
||||
103 0.3199035742 0.1404206704 0.03188472676 0.02713339699 MEG 103
|
||||
104 0.2620111685 0.2979083124 0.03188472676 0.02713339699 MEG 104
|
||||
105 0.2183237036 0.3586832133 0.03188472676 0.02713339699 MEG 105
|
||||
106 0.253424964 0.2038387029 0.03188472676 0.02713339699 MEG 106
|
||||
107 0.1821371767 0.3235092766 0.03188472676 0.02713339699 MEG 107
|
||||
108 0.2320142778 0.1055366971 0.03188472676 0.02713339699 MEG 108
|
||||
109 0.1969983757 0.2287392657 0.03188472676 0.02713339699 MEG 109
|
||||
110 0.1892169645 0.138858437 0.03188472676 0.02713339699 MEG 110
|
||||
111 0.1718069319 0.1949879663 0.03188472676 0.02713339699 MEG 111
|
||||
112 0.1412427238 0.2390846129 0.03188472676 0.02713339699 MEG 112
|
||||
113 0.3413341674 -0.2749014578 0.03188472676 0.02713339699 MEG 113
|
||||
114 0.3957163081 -0.1867381122 0.03188472676 0.02713339699 MEG 114
|
||||
115 0.4343284389 -0.0791376981 0.03188472676 0.02713339699 MEG 115
|
||||
116 0.45 0.04115848657 0.03188472676 0.02713339699 MEG 116
|
||||
117 0.294108122 -0.2248146657 0.03188472676 0.02713339699 MEG 117
|
||||
118 0.3408651095 -0.144258791 0.03188472676 0.02713339699 MEG 118
|
||||
119 0.3829160873 0.05059902865 0.03188472676 0.02713339699 MEG 119
|
||||
120 0.3147171717 -0.02712556599 0.03188472676 0.02713339699 MEG 120
|
||||
121 0.2904098027 -0.1079793618 0.03188472676 0.02713339699 MEG 121
|
||||
122 0.2489284377 -0.08302604569 0.03188472676 0.02713339699 MEG 122
|
||||
123 0.2791450822 0.06065203717 0.03188472676 0.02713339699 MEG 123
|
||||
124 0.1699476764 -0.1323891552 0.03188472676 0.02713339699 MEG 124
|
||||
125 0.2213406675 -0.02048593019 0.03188472676 0.02713339699 MEG 125
|
||||
126 0.1793293141 -0.03692175528 0.03188472676 0.02713339699 MEG 126
|
||||
127 0.2340431716 0.04272096725 0.03188472676 0.02713339699 MEG 127
|
||||
128 0.1989990214 0.07992534312 0.03188472676 0.02713339699 MEG 128
|
||||
129 -0.2893372271 -0.3287872551 0.03188472676 0.02713339699 MEG 129
|
||||
130 -0.2271848223 -0.3869397712 0.03188472676 0.02713339699 MEG 130
|
||||
131 -0.1541857375 -0.4262216107 0.03188472676 0.02713339699 MEG 131
|
||||
132 -0.07352758894 -0.45 0.03188472676 0.02713339699 MEG 132
|
||||
133 -0.2537949872 -0.2821367359 0.03188472676 0.02713339699 MEG 133
|
||||
134 -0.05789427224 -0.3854591968 0.03188472676 0.02713339699 MEG 134
|
||||
135 -0.2180547699 -0.2381599549 0.03188472676 0.02713339699 MEG 135
|
||||
136 -0.1654458556 -0.2836078687 0.03188472676 0.02713339699 MEG 136
|
||||
137 -0.1282115583 -0.3636295479 0.03188472676 0.02713339699 MEG 137
|
||||
138 -0.1869048087 -0.2008317859 0.03188472676 0.02713339699 MEG 138
|
||||
139 -0.092414085 -0.2712662931 0.03188472676 0.02713339699 MEG 139
|
||||
140 -0.04464737067 -0.3262626614 0.03188472676 0.02713339699 MEG 140
|
||||
141 -0.1084802139 -0.2080301215 0.03188472676 0.02713339699 MEG 141
|
||||
142 -0.008347885446 -0.2337992621 0.03188472676 0.02713339699 MEG 142
|
||||
143 -0.1346335691 -0.1372039628 0.03188472676 0.02713339699 MEG 143
|
||||
144 -0.05019800217 -0.1837431338 0.03188472676 0.02713339699 MEG 144
|
||||
145 0.08934861049 -0.3726540907 0.03188472676 0.02713339699 MEG 145
|
||||
146 0.106172944 -0.4435639299 0.03188472676 0.02713339699 MEG 146
|
||||
147 0.2218612721 0.2682623426 0.03188472676 0.02713339699 MEG 147
|
||||
148 0.2670027616 -0.3555067924 0.03188472676 0.02713339699 MEG 148
|
||||
149 0.01625933145 -0.3877305948 0.03188472676 0.02713339699 MEG 149
|
||||
150 0.1626843509 -0.342433819 0.03188472676 0.02713339699 MEG 150
|
||||
151 0.07960240502 -0.3134489525 0.03188472676 0.02713339699 MEG 151
|
||||
152 0.1456745581 -0.2843789795 0.03188472676 0.02713339699 MEG 152
|
||||
153 0.2343957441 -0.2951725192 0.03188472676 0.02713339699 MEG 153
|
||||
154 0.01783071962 -0.2738066839 0.03188472676 0.02713339699 MEG 154
|
||||
155 0.1274451621 -0.2352949445 0.03188472676 0.02713339699 MEG 155
|
||||
156 0.1746647823 -0.1970760538 0.03188472676 0.02713339699 MEG 156
|
||||
157 0.0872449245 -0.2076405522 0.03188472676 0.02713339699 MEG 157
|
||||
158 0.03888945369 -0.183846741 0.03188472676 0.02713339699 MEG 158
|
||||
159 0.08527772847 -0.1590694194 0.03188472676 0.02713339699 MEG 159
|
||||
160 0.1230026134 -0.1283845973 0.03188472676 0.02713339699 MEG 160
|
||||
161 -0.547000000 -0.5000000000 0.03188472676 0.02713339699 COMNT
|
||||
162 -0.547000000 -0.5000000000 0.03188472676 0.02713339699 SCALE
|
||||
209
mne/channels/data/layouts/KIT-AD.lout
Normal file
@@ -0,0 +1,209 @@
|
||||
0.00 1.00 0.00 1.00
|
||||
001 0.61 0.56 0.02 0.04 MEG 001
|
||||
002 0.59 0.50 0.02 0.04 MEG 002
|
||||
003 0.48 0.42 0.02 0.04 MEG 003
|
||||
004 0.52 0.43 0.02 0.04 MEG 004
|
||||
005 0.43 0.44 0.02 0.04 MEG 005
|
||||
006 0.39 0.48 0.02 0.04 MEG 006
|
||||
007 0.52 0.70 0.02 0.04 MEG 007
|
||||
008 0.58 0.59 0.02 0.04 MEG 008
|
||||
009 0.47 0.71 0.02 0.04 MEG 009
|
||||
010 0.53 0.49 0.02 0.04 MEG 010
|
||||
011 0.57 0.53 0.02 0.04 MEG 011
|
||||
012 0.43 0.50 0.02 0.04 MEG 012
|
||||
013 0.40 0.55 0.02 0.04 MEG 013
|
||||
014 0.57 0.39 0.02 0.04 MEG 014
|
||||
015 0.38 0.41 0.02 0.04 MEG 015
|
||||
016 0.48 0.37 0.02 0.04 MEG 016
|
||||
017 0.16 0.84 0.02 0.04 MEG 017
|
||||
018 0.53 0.63 0.02 0.04 MEG 018
|
||||
019 0.48 0.53 0.02 0.04 MEG 019
|
||||
020 0.44 0.63 0.02 0.04 MEG 020
|
||||
021 0.53 0.56 0.02 0.04 MEG 021
|
||||
022 0.44 0.57 0.02 0.04 MEG 022
|
||||
023 0.56 0.46 0.02 0.04 MEG 023
|
||||
024 0.59 0.68 0.02 0.04 MEG 024
|
||||
025 0.34 0.86 0.02 0.04 MEG 025
|
||||
026 0.39 0.89 0.02 0.04 MEG 026
|
||||
027 0.50 0.91 0.02 0.04 MEG 027
|
||||
028 0.61 0.87 0.02 0.04 MEG 028
|
||||
029 0.66 0.84 0.02 0.04 MEG 029
|
||||
030 0.59 0.76 0.02 0.04 MEG 030
|
||||
031 0.39 0.62 0.02 0.04 MEG 031
|
||||
032 0.55 0.85 0.02 0.04 MEG 032
|
||||
033 0.28 0.39 0.02 0.04 MEG 033
|
||||
034 0.37 0.52 0.02 0.04 MEG 034
|
||||
035 0.36 0.59 0.02 0.04 MEG 035
|
||||
036 0.38 0.70 0.02 0.04 MEG 036
|
||||
037 0.07 0.87 0.02 0.04 MEG 037
|
||||
038 0.24 0.61 0.02 0.04 MEG 038
|
||||
039 0.32 0.68 0.02 0.04 MEG 039
|
||||
040 0.30 0.81 0.02 0.04 MEG 040
|
||||
041 0.43 0.96 0.02 0.04 MEG 041
|
||||
042 0.55 0.95 0.02 0.04 MEG 042
|
||||
043 0.42 0.74 0.02 0.04 MEG 043
|
||||
044 0.56 0.72 0.02 0.04 MEG 044
|
||||
045 0.47 0.76 0.02 0.04 MEG 045
|
||||
046 0.52 0.75 0.02 0.04 MEG 046
|
||||
047 0.45 0.85 0.02 0.04 MEG 047
|
||||
048 0.40 0.79 0.02 0.04 MEG 048
|
||||
049 0.24 0.79 0.02 0.04 MEG 049
|
||||
050 0.21 0.46 0.02 0.04 MEG 050
|
||||
051 0.32 0.76 0.02 0.04 MEG 051
|
||||
052 0.20 0.63 0.02 0.04 MEG 052
|
||||
053 0.27 0.33 0.02 0.04 MEG 053
|
||||
054 0.17 0.74 0.02 0.04 MEG 054
|
||||
055 0.05 0.65 0.02 0.04 MEG 055
|
||||
056 0.28 0.63 0.02 0.04 MEG 056
|
||||
057 0.70 0.62 0.02 0.04 MEG 057
|
||||
058 0.94 0.38 0.02 0.04 MEG 058
|
||||
059 0.91 0.73 0.02 0.04 MEG 059
|
||||
060 0.82 0.93 0.02 0.04 MEG 060
|
||||
061 0.93 0.63 0.02 0.04 MEG 061
|
||||
062 0.75 0.78 0.02 0.04 MEG 062
|
||||
063 0.69 0.78 0.02 0.04 MEG 063
|
||||
064 0.43 0.00 0.02 0.04 MEG 064
|
||||
065 0.18 0.40 0.02 0.04 MEG 065
|
||||
066 0.19 0.29 0.02 0.04 MEG 066
|
||||
067 0.15 0.56 0.02 0.04 MEG 067
|
||||
068 0.33 0.53 0.02 0.04 MEG 068
|
||||
069 0.35 0.47 0.02 0.04 MEG 069
|
||||
070 0.25 0.89 0.02 0.04 MEG 070
|
||||
071 0.24 0.53 0.02 0.04 MEG 071
|
||||
072 0.16 0.95 0.02 0.04 MEG 072
|
||||
073 0.67 0.75 0.02 0.04 MEG 073
|
||||
074 0.74 0.86 0.02 0.04 MEG 074
|
||||
075 0.81 0.71 0.02 0.04 MEG 075
|
||||
076 0.78 0.62 0.02 0.04 MEG 076
|
||||
077 0.65 0.65 0.02 0.04 MEG 077
|
||||
078 0.83 0.81 0.02 0.04 MEG 078
|
||||
079 0.82 0.53 0.02 0.04 MEG 079
|
||||
080 0.78 0.36 0.02 0.04 MEG 080
|
||||
081 0.56 0.65 0.02 0.04 MEG 081
|
||||
082 0.35 0.74 0.02 0.04 MEG 082
|
||||
083 0.21 0.71 0.02 0.04 MEG 083
|
||||
084 0.12 0.75 0.02 0.04 MEG 084
|
||||
085 0.11 0.66 0.02 0.04 MEG 085
|
||||
086 0.21 0.92 0.02 0.04 MEG 086
|
||||
087 0.13 0.96 0.02 0.04 MEG 087
|
||||
088 0.03 0.76 0.02 0.04 MEG 088
|
||||
089 0.66 0.89 0.02 0.04 MEG 089
|
||||
090 0.61 0.93 0.02 0.04 MEG 090
|
||||
091 0.63 0.79 0.02 0.04 MEG 091
|
||||
092 0.71 0.84 0.02 0.04 MEG 092
|
||||
093 0.44 0.91 0.02 0.04 MEG 093
|
||||
094 0.56 0.89 0.02 0.04 MEG 094
|
||||
095 0.42 0.68 0.02 0.04 MEG 095
|
||||
096 0.54 0.79 0.02 0.04 MEG 096
|
||||
097 0.11 0.86 0.02 0.04 MEG 097
|
||||
098 0.14 0.36 0.02 0.04 MEG 098
|
||||
099 0.32 0.60 0.02 0.04 MEG 099
|
||||
100 0.25 0.45 0.02 0.04 MEG 100
|
||||
101 0.19 0.54 0.02 0.04 MEG 101
|
||||
102 0.27 0.85 0.02 0.04 MEG 102
|
||||
103 0.27 0.75 0.02 0.04 MEG 103
|
||||
104 0.01 0.64 0.02 0.04 MEG 104
|
||||
105 0.69 0.68 0.02 0.04 MEG 105
|
||||
106 0.88 0.82 0.02 0.04 MEG 106
|
||||
107 0.45 0.80 0.02 0.04 MEG 107
|
||||
108 0.50 0.86 0.02 0.04 MEG 108
|
||||
109 0.36 0.80 0.02 0.04 MEG 109
|
||||
110 0.49 0.96 0.02 0.04 MEG 110
|
||||
111 0.37 0.93 0.02 0.04 MEG 111
|
||||
112 0.32 0.90 0.02 0.04 MEG 112
|
||||
113 0.07 0.42 0.02 0.04 MEG 113
|
||||
114 0.73 0.72 0.02 0.04 MEG 114
|
||||
115 0.19 0.12 0.02 0.04 MEG 115
|
||||
116 0.01 0.51 0.02 0.04 MEG 116
|
||||
117 0.07 0.29 0.02 0.04 MEG 117
|
||||
118 0.16 0.47 0.02 0.04 MEG 118
|
||||
119 0.22 0.33 0.02 0.04 MEG 119
|
||||
120 0.10 0.54 0.02 0.04 MEG 120
|
||||
121 0.78 0.89 0.02 0.04 MEG 121
|
||||
122 0.87 0.63 0.02 0.04 MEG 122
|
||||
123 0.86 0.72 0.02 0.04 MEG 123
|
||||
124 0.77 0.70 0.02 0.04 MEG 124
|
||||
125 0.63 0.71 0.02 0.04 MEG 125
|
||||
126 0.89 0.27 0.02 0.04 MEG 126
|
||||
127 0.97 0.62 0.02 0.04 MEG 127
|
||||
128 0.83 0.62 0.02 0.04 MEG 128
|
||||
129 0.77 0.11 0.02 0.04 MEG 129
|
||||
130 0.86 0.95 0.02 0.04 MEG 130
|
||||
131 0.71 0.42 0.02 0.04 MEG 131
|
||||
132 0.78 0.53 0.02 0.04 MEG 132
|
||||
133 0.65 0.57 0.02 0.04 MEG 133
|
||||
134 0.16 0.67 0.02 0.04 MEG 134
|
||||
135 0.29 0.71 0.02 0.04 MEG 135
|
||||
136 0.16 0.23 0.02 0.04 MEG 136
|
||||
137 0.82 0.34 0.02 0.04 MEG 137
|
||||
138 0.87 0.52 0.02 0.04 MEG 138
|
||||
139 0.81 0.22 0.02 0.04 MEG 139
|
||||
140 0.90 0.40 0.02 0.04 MEG 140
|
||||
141 0.97 0.49 0.02 0.04 MEG 141
|
||||
142 0.74 0.30 0.02 0.04 MEG 142
|
||||
143 0.81 0.44 0.02 0.04 MEG 143
|
||||
144 0.95 0.75 0.02 0.04 MEG 144
|
||||
145 0.13 0.19 0.02 0.04 MEG 145
|
||||
146 0.28 0.56 0.02 0.04 MEG 146
|
||||
147 0.74 0.15 0.02 0.04 MEG 147
|
||||
148 0.10 0.33 0.02 0.04 MEG 148
|
||||
149 0.35 0.02 0.02 0.04 MEG 149
|
||||
150 0.03 0.39 0.02 0.04 MEG 150
|
||||
151 0.27 0.06 0.02 0.04 MEG 151
|
||||
152 0.31 0.43 0.02 0.04 MEG 152
|
||||
153 0.77 0.26 0.02 0.04 MEG 153
|
||||
154 0.67 0.10 0.02 0.04 MEG 154
|
||||
155 0.76 0.44 0.02 0.04 MEG 155
|
||||
156 0.83 0.18 0.02 0.04 MEG 156
|
||||
157 0.61 0.02 0.02 0.04 MEG 157
|
||||
158 0.91 0.86 0.02 0.04 MEG 158
|
||||
159 0.92 0.51 0.02 0.04 MEG 159
|
||||
160 0.86 0.30 0.02 0.04 MEG 160
|
||||
161 0.44 0.12 0.02 0.04 MEG 161
|
||||
162 0.37 0.30 0.02 0.04 MEG 162
|
||||
163 0.30 0.17 0.02 0.04 MEG 163
|
||||
164 0.36 0.25 0.02 0.04 MEG 164
|
||||
165 0.41 0.22 0.02 0.04 MEG 165
|
||||
166 0.31 0.28 0.02 0.04 MEG 166
|
||||
167 0.05 0.53 0.02 0.04 MEG 167
|
||||
168 0.08 0.76 0.02 0.04 MEG 168
|
||||
169 0.69 0.24 0.02 0.04 MEG 169
|
||||
170 0.57 0.18 0.02 0.04 MEG 170
|
||||
171 0.50 0.17 0.02 0.04 MEG 171
|
||||
172 0.64 0.20 0.02 0.04 MEG 172
|
||||
173 0.65 0.42 0.02 0.04 MEG 173
|
||||
174 0.69 0.53 0.02 0.04 MEG 174
|
||||
175 0.61 0.44 0.02 0.04 MEG 175
|
||||
176 0.70 0.32 0.02 0.04 MEG 176
|
||||
177 0.44 0.17 0.02 0.04 MEG 177
|
||||
178 0.38 0.18 0.02 0.04 MEG 178
|
||||
179 0.32 0.22 0.02 0.04 MEG 179
|
||||
180 0.44 0.06 0.02 0.04 MEG 180
|
||||
181 0.22 0.16 0.02 0.04 MEG 181
|
||||
182 0.36 0.07 0.02 0.04 MEG 182
|
||||
183 0.28 0.11 0.02 0.04 MEG 183
|
||||
184 0.42 0.27 0.02 0.04 MEG 184
|
||||
185 0.52 0.32 0.02 0.04 MEG 185
|
||||
186 0.57 0.33 0.02 0.04 MEG 186
|
||||
187 0.47 0.32 0.02 0.04 MEG 187
|
||||
188 0.62 0.37 0.02 0.04 MEG 188
|
||||
189 0.73 0.49 0.02 0.04 MEG 189
|
||||
190 0.67 0.36 0.02 0.04 MEG 190
|
||||
191 0.74 0.57 0.02 0.04 MEG 191
|
||||
192 0.64 0.49 0.02 0.04 MEG 192
|
||||
193 0.59 0.06 0.02 0.04 MEG 193
|
||||
194 0.52 -0.00 0.02 0.04 MEG 194
|
||||
195 0.58 0.29 0.02 0.04 MEG 195
|
||||
196 0.53 0.27 0.02 0.04 MEG 196
|
||||
197 0.47 0.26 0.02 0.04 MEG 197
|
||||
198 0.34 0.39 0.02 0.04 MEG 198
|
||||
199 0.42 0.33 0.02 0.04 MEG 199
|
||||
200 0.38 0.35 0.02 0.04 MEG 200
|
||||
201 0.53 0.22 0.02 0.04 MEG 201
|
||||
202 0.59 0.24 0.02 0.04 MEG 202
|
||||
203 0.65 0.27 0.02 0.04 MEG 203
|
||||
204 0.27 0.26 0.02 0.04 MEG 204
|
||||
205 0.51 0.11 0.02 0.04 MEG 205
|
||||
206 0.65 0.15 0.02 0.04 MEG 206
|
||||
207 0.51 0.05 0.02 0.04 MEG 207
|
||||
208 0.69 0.05 0.02 0.04 MEG 208
|
||||
158
mne/channels/data/layouts/KIT-AS-2008.lout
Normal file
@@ -0,0 +1,158 @@
|
||||
0.00 0.00 0.04 0.02
|
||||
000 0.43 0.98 0.10 0.05 MEG 001
|
||||
001 0.38 0.96 0.10 0.05 MEG 002
|
||||
002 0.32 0.92 0.10 0.05 MEG 003
|
||||
003 0.44 0.93 0.10 0.05 MEG 004
|
||||
004 0.39 0.91 0.10 0.05 MEG 005
|
||||
005 0.45 0.88 0.10 0.05 MEG 006
|
||||
006 0.36 0.82 0.10 0.05 MEG 007
|
||||
007 0.32 0.78 0.10 0.05 MEG 008
|
||||
008 0.33 0.68 0.10 0.05 MEG 009
|
||||
009 0.40 0.79 0.10 0.05 MEG 010
|
||||
010 0.36 0.74 0.10 0.05 MEG 011
|
||||
011 0.48 0.78 0.10 0.05 MEG 012
|
||||
012 0.39 0.71 0.10 0.05 MEG 013
|
||||
013 0.37 0.66 0.10 0.05 MEG 014
|
||||
014 0.48 0.72 0.10 0.05 MEG 015
|
||||
015 0.44 0.69 0.10 0.05 MEG 016
|
||||
016 0.28 0.57 0.10 0.05 MEG 017
|
||||
017 0.29 0.51 0.10 0.05 MEG 018
|
||||
018 0.32 0.45 0.10 0.05 MEG 019
|
||||
019 0.40 0.36 0.10 0.05 MEG 020
|
||||
020 0.46 0.44 0.10 0.05 MEG 021
|
||||
021 0.33 0.60 0.10 0.05 MEG 022
|
||||
022 0.34 0.53 0.10 0.05 MEG 023
|
||||
023 0.41 0.42 0.10 0.05 MEG 024
|
||||
024 0.46 0.51 0.10 0.05 MEG 025
|
||||
025 0.38 0.59 0.10 0.05 MEG 026
|
||||
026 0.50 0.38 0.10 0.05 MEG 027
|
||||
027 0.41 0.48 0.10 0.05 MEG 028
|
||||
028 0.42 0.56 0.10 0.05 MEG 029
|
||||
029 0.51 0.49 0.10 0.05 MEG 030
|
||||
030 0.46 0.58 0.10 0.05 MEG 031
|
||||
031 0.47 0.64 0.10 0.05 MEG 032
|
||||
032 0.12 0.99 0.10 0.05 MEG 033
|
||||
033 0.07 0.90 0.10 0.05 MEG 034
|
||||
034 0.11 0.88 0.10 0.05 MEG 035
|
||||
035 0.13 0.77 0.10 0.05 MEG 036
|
||||
036 0.16 0.97 0.10 0.05 MEG 037
|
||||
037 0.07 0.78 0.10 0.05 MEG 038
|
||||
038 0.20 0.94 0.10 0.05 MEG 039
|
||||
039 0.16 0.86 0.10 0.05 MEG 040
|
||||
040 0.10 0.67 0.10 0.05 MEG 041
|
||||
041 0.25 0.90 0.10 0.05 MEG 042
|
||||
042 0.20 0.83 0.10 0.05 MEG 043
|
||||
043 0.17 0.76 0.10 0.05 MEG 044
|
||||
044 0.24 0.80 0.10 0.05 MEG 045
|
||||
045 0.20 0.65 0.10 0.05 MEG 046
|
||||
046 0.29 0.82 0.10 0.05 MEG 047
|
||||
047 0.25 0.69 0.10 0.05 MEG 048
|
||||
048 0.00 0.52 0.10 0.05 MEG 049
|
||||
049 0.02 0.40 0.10 0.05 MEG 050
|
||||
050 0.07 0.30 0.10 0.05 MEG 051
|
||||
051 0.12 0.20 0.10 0.05 MEG 052
|
||||
052 0.05 0.53 0.10 0.05 MEG 053
|
||||
053 0.07 0.42 0.10 0.05 MEG 054
|
||||
054 0.16 0.24 0.10 0.05 MEG 055
|
||||
055 0.10 0.56 0.10 0.05 MEG 056
|
||||
056 0.15 0.37 0.10 0.05 MEG 057
|
||||
057 0.16 0.56 0.10 0.05 MEG 058
|
||||
058 0.17 0.48 0.10 0.05 MEG 059
|
||||
059 0.20 0.40 0.10 0.05 MEG 060
|
||||
060 0.21 0.48 0.10 0.05 MEG 061
|
||||
061 0.28 0.34 0.10 0.05 MEG 062
|
||||
062 0.24 0.61 0.10 0.05 MEG 063
|
||||
063 0.30 0.39 0.10 0.05 MEG 064
|
||||
064 0.67 0.93 0.10 0.05 MEG 065
|
||||
065 0.62 0.96 0.10 0.05 MEG 066
|
||||
066 0.56 0.98 0.10 0.05 MEG 067
|
||||
067 0.50 0.99 0.10 0.05 MEG 068
|
||||
068 0.60 0.86 0.10 0.05 MEG 069
|
||||
069 0.56 0.93 0.10 0.05 MEG 070
|
||||
070 0.71 0.72 0.10 0.05 MEG 071
|
||||
071 0.65 0.83 0.10 0.05 MEG 072
|
||||
072 0.56 0.88 0.10 0.05 MEG 073
|
||||
073 0.65 0.76 0.10 0.05 MEG 074
|
||||
074 0.56 0.83 0.10 0.05 MEG 075
|
||||
075 0.64 0.66 0.10 0.05 MEG 076
|
||||
076 0.62 0.71 0.10 0.05 MEG 077
|
||||
077 0.53 0.78 0.10 0.05 MEG 078
|
||||
078 0.57 0.68 0.10 0.05 MEG 079
|
||||
079 0.53 0.72 0.10 0.05 MEG 080
|
||||
080 0.50 0.33 0.10 0.05 MEG 081
|
||||
081 0.55 0.34 0.10 0.05 MEG 082
|
||||
082 0.60 0.36 0.10 0.05 MEG 083
|
||||
083 0.69 0.44 0.10 0.05 MEG 084
|
||||
084 0.72 0.57 0.10 0.05 MEG 085
|
||||
085 0.61 0.42 0.10 0.05 MEG 086
|
||||
086 0.67 0.53 0.10 0.05 MEG 087
|
||||
087 0.69 0.61 0.10 0.05 MEG 088
|
||||
088 0.56 0.45 0.10 0.05 MEG 089
|
||||
089 0.60 0.48 0.10 0.05 MEG 090
|
||||
090 0.64 0.59 0.10 0.05 MEG 091
|
||||
091 0.56 0.51 0.10 0.05 MEG 092
|
||||
092 0.59 0.55 0.10 0.05 MEG 093
|
||||
093 0.51 0.55 0.10 0.05 MEG 094
|
||||
094 0.54 0.58 0.10 0.05 MEG 095
|
||||
095 0.54 0.64 0.10 0.05 MEG 096
|
||||
096 1.00 0.69 0.10 0.05 MEG 097
|
||||
097 0.97 0.81 0.10 0.05 MEG 098
|
||||
098 0.93 0.92 0.10 0.05 MEG 099
|
||||
099 0.87 1.00 0.10 0.05 MEG 100
|
||||
100 0.93 0.80 0.10 0.05 MEG 101
|
||||
101 0.83 0.97 0.10 0.05 MEG 102
|
||||
102 0.89 0.68 0.10 0.05 MEG 103
|
||||
103 0.84 0.87 0.10 0.05 MEG 104
|
||||
104 0.79 0.94 0.10 0.05 MEG 105
|
||||
105 0.85 0.68 0.10 0.05 MEG 106
|
||||
106 0.83 0.76 0.10 0.05 MEG 107
|
||||
107 0.76 0.91 0.10 0.05 MEG 108
|
||||
108 0.74 0.76 0.10 0.05 MEG 109
|
||||
109 0.76 0.81 0.10 0.05 MEG 110
|
||||
110 0.76 0.69 0.10 0.05 MEG 111
|
||||
111 0.71 0.83 0.10 0.05 MEG 112
|
||||
112 0.88 0.22 0.10 0.05 MEG 113
|
||||
113 0.94 0.32 0.10 0.05 MEG 114
|
||||
114 0.98 0.42 0.10 0.05 MEG 115
|
||||
115 1.00 0.54 0.10 0.05 MEG 116
|
||||
116 0.84 0.26 0.10 0.05 MEG 117
|
||||
117 0.93 0.45 0.10 0.05 MEG 118
|
||||
118 0.95 0.56 0.10 0.05 MEG 119
|
||||
119 0.81 0.30 0.10 0.05 MEG 120
|
||||
120 0.85 0.38 0.10 0.05 MEG 121
|
||||
121 0.81 0.41 0.10 0.05 MEG 122
|
||||
122 0.83 0.49 0.10 0.05 MEG 123
|
||||
123 0.85 0.58 0.10 0.05 MEG 124
|
||||
124 0.73 0.35 0.10 0.05 MEG 125
|
||||
125 0.79 0.49 0.10 0.05 MEG 126
|
||||
126 0.74 0.46 0.10 0.05 MEG 127
|
||||
127 0.77 0.61 0.10 0.05 MEG 128
|
||||
128 0.20 0.12 0.10 0.05 MEG 129
|
||||
129 0.37 0.02 0.10 0.05 MEG 130
|
||||
130 0.46 0.00 0.10 0.05 MEG 131
|
||||
131 0.30 0.11 0.10 0.05 MEG 132
|
||||
132 0.47 0.06 0.10 0.05 MEG 133
|
||||
133 0.25 0.21 0.10 0.05 MEG 134
|
||||
134 0.32 0.17 0.10 0.05 MEG 135
|
||||
135 0.39 0.13 0.10 0.05 MEG 136
|
||||
136 0.29 0.26 0.10 0.05 MEG 137
|
||||
137 0.41 0.19 0.10 0.05 MEG 138
|
||||
138 0.47 0.18 0.10 0.05 MEG 139
|
||||
139 0.39 0.26 0.10 0.05 MEG 140
|
||||
140 0.50 0.22 0.10 0.05 MEG 141
|
||||
141 0.33 0.29 0.10 0.05 MEG 142
|
||||
142 0.45 0.29 0.10 0.05 MEG 143
|
||||
143 0.50 0.28 0.10 0.05 MEG 144
|
||||
144 0.65 0.03 0.10 0.05 MEG 145
|
||||
145 0.82 0.13 0.10 0.05 MEG 146
|
||||
146 0.55 0.06 0.10 0.05 MEG 147
|
||||
147 0.71 0.12 0.10 0.05 MEG 148
|
||||
148 0.62 0.14 0.10 0.05 MEG 149
|
||||
149 0.69 0.18 0.10 0.05 MEG 150
|
||||
150 0.76 0.23 0.10 0.05 MEG 151
|
||||
151 0.54 0.18 0.10 0.05 MEG 152
|
||||
152 0.61 0.20 0.10 0.05 MEG 153
|
||||
153 0.73 0.27 0.10 0.05 MEG 154
|
||||
154 0.63 0.25 0.10 0.05 MEG 155
|
||||
155 0.56 0.28 0.10 0.05 MEG 156
|
||||
156 0.67 0.35 0.10 0.05 MEG 157
|
||||
158
mne/channels/data/layouts/KIT-UMD-3.lout
Normal file
@@ -0,0 +1,158 @@
|
||||
-25.00 28.00 -21.35 23.75
|
||||
000 -23.42 20.48 3.20 2.40 MEG 001
|
||||
001 -22.32 15.16 3.20 2.40 MEG 002
|
||||
002 -24.20 10.24 3.20 2.40 MEG 003
|
||||
003 -25.00 5.27 3.20 2.40 MEG 004
|
||||
004 -24.75 -0.21 3.20 2.40 MEG 005
|
||||
005 -23.41 -5.22 3.20 2.40 MEG 006
|
||||
006 -22.35 -11.37 3.20 2.40 MEG 007
|
||||
007 -14.06 -15.64 3.20 2.40 MEG 008
|
||||
008 -15.12 -18.15 3.20 2.40 MEG 009
|
||||
009 -11.26 -20.73 3.20 2.40 MEG 010
|
||||
010 -6.28 -20.94 3.20 2.40 MEG 011
|
||||
011 -2.04 -21.35 3.20 2.40 MEG 012
|
||||
012 2.04 -21.35 3.20 2.40 MEG 013
|
||||
013 6.28 -20.94 3.20 2.40 MEG 014
|
||||
014 11.26 -20.73 3.20 2.40 MEG 015
|
||||
015 15.12 -18.15 3.20 2.40 MEG 016
|
||||
016 19.41 -14.06 3.20 2.40 MEG 017
|
||||
017 22.35 -11.37 3.20 2.40 MEG 018
|
||||
018 24.06 -3.70 3.20 2.40 MEG 019
|
||||
019 24.23 1.80 3.20 2.40 MEG 020
|
||||
020 24.80 5.19 3.20 2.40 MEG 021
|
||||
021 22.03 13.42 3.20 2.40 MEG 022
|
||||
022 21.58 16.68 3.20 2.40 MEG 023
|
||||
023 23.42 20.48 3.20 2.40 MEG 024
|
||||
024 20.15 19.33 3.20 2.40 MEG 025
|
||||
025 7.46 -2.58 3.20 2.40 MEG 026
|
||||
026 22.86 7.70 3.20 2.40 MEG 027
|
||||
027 20.76 2.91 3.20 2.40 MEG 028
|
||||
028 19.70 -8.80 3.20 2.40 MEG 029
|
||||
029 3.41 -5.91 3.20 2.40 MEG 030
|
||||
030 14.06 -15.64 3.20 2.40 MEG 031
|
||||
031 0.12 -5.34 3.20 2.40 MEG 032
|
||||
032 1.80 -18.87 3.20 2.40 MEG 033
|
||||
033 -1.80 -18.87 3.20 2.40 MEG 034
|
||||
034 -10.12 -18.16 3.20 2.40 MEG 035
|
||||
035 -3.41 -5.91 3.20 2.40 MEG 036
|
||||
036 -18.35 -13.97 3.20 2.40 MEG 037
|
||||
037 -19.70 -8.80 3.20 2.40 MEG 038
|
||||
038 -20.76 2.91 3.20 2.40 MEG 039
|
||||
039 -22.86 7.70 3.20 2.40 MEG 040
|
||||
040 -7.46 -2.58 3.20 2.40 MEG 041
|
||||
041 -20.15 19.33 3.20 2.40 MEG 042
|
||||
042 -16.84 18.53 3.20 2.40 MEG 043
|
||||
043 -18.55 14.46 3.20 2.40 MEG 044
|
||||
044 -20.31 10.64 3.20 2.40 MEG 045
|
||||
045 -10.05 0.17 3.20 2.40 MEG 046
|
||||
046 -20.62 -2.66 3.20 2.40 MEG 047
|
||||
047 -17.20 -6.26 3.20 2.40 MEG 048
|
||||
048 -16.21 -11.50 3.20 2.40 MEG 049
|
||||
049 -8.92 -15.60 3.20 2.40 MEG 050
|
||||
050 -5.79 -18.42 3.20 2.40 MEG 051
|
||||
051 -1.62 -16.14 3.20 2.40 MEG 052
|
||||
052 -8.25 6.10 3.20 2.40 MEG 053
|
||||
053 5.79 -18.42 3.20 2.40 MEG 054
|
||||
054 8.92 -15.60 3.20 2.40 MEG 055
|
||||
055 16.21 -11.50 3.20 2.40 MEG 056
|
||||
056 17.20 -6.26 3.20 2.40 MEG 057
|
||||
057 20.62 -2.66 3.20 2.40 MEG 058
|
||||
058 -6.11 13.61 3.20 2.40 MEG 059
|
||||
059 20.31 10.64 3.20 2.40 MEG 060
|
||||
060 17.58 15.92 3.20 2.40 MEG 061
|
||||
061 16.84 18.53 3.20 2.40 MEG 062
|
||||
062 13.49 18.47 3.20 2.40 MEG 063
|
||||
063 15.28 13.32 3.20 2.40 MEG 064
|
||||
064 -4.11 11.13 3.20 2.40 MEG 065
|
||||
065 19.39 7.54 3.20 2.40 MEG 066
|
||||
066 17.50 3.47 3.20 2.40 MEG 067
|
||||
067 -6.54 8.57 3.20 2.40 MEG 068
|
||||
068 11.44 -8.04 3.20 2.40 MEG 069
|
||||
069 12.41 -13.14 3.20 2.40 MEG 070
|
||||
070 8.16 -13.13 3.20 2.40 MEG 071
|
||||
071 -7.60 2.77 3.20 2.40 MEG 072
|
||||
072 1.62 -16.14 3.20 2.40 MEG 073
|
||||
073 -6.80 0.14 3.20 2.40 MEG 074
|
||||
074 -5.40 -15.93 3.20 2.40 MEG 075
|
||||
075 -8.16 -13.13 3.20 2.40 MEG 076
|
||||
076 -12.41 -13.14 3.20 2.40 MEG 077
|
||||
077 -14.81 -8.97 3.20 2.40 MEG 078
|
||||
078 -3.23 -2.94 3.20 2.40 MEG 079
|
||||
079 -17.50 3.47 3.20 2.40 MEG 080
|
||||
080 -19.39 7.54 3.20 2.40 MEG 081
|
||||
081 4.03 -2.84 3.20 2.40 MEG 082
|
||||
082 -15.28 13.32 3.20 2.40 MEG 083
|
||||
083 -13.49 18.47 3.20 2.40 MEG 084
|
||||
084 -12.29 15.99 3.20 2.40 MEG 085
|
||||
085 -16.74 10.63 3.20 2.40 MEG 086
|
||||
086 6.80 0.14 3.20 2.40 MEG 087
|
||||
087 -17.30 -2.88 3.20 2.40 MEG 088
|
||||
088 -13.99 -4.86 3.20 2.40 MEG 089
|
||||
089 11.58 6.13 3.20 2.40 MEG 090
|
||||
090 -11.44 -8.04 3.20 2.40 MEG 091
|
||||
091 -3.30 -13.45 3.20 2.40 MEG 092
|
||||
092 6.54 8.57 3.20 2.40 MEG 093
|
||||
093 -9.52 -10.67 3.20 2.40 MEG 094
|
||||
094 9.52 -10.67 3.20 2.40 MEG 095
|
||||
095 4.11 11.13 3.20 2.40 MEG 096
|
||||
096 13.99 -4.86 3.20 2.40 MEG 097
|
||||
097 18.10 -0.17 3.20 2.40 MEG 098
|
||||
098 0.74 11.38 3.20 2.40 MEG 099
|
||||
099 16.74 10.63 3.20 2.40 MEG 100
|
||||
100 12.29 15.99 3.20 2.40 MEG 101
|
||||
101 10.11 18.86 3.20 2.40 MEG 102
|
||||
102 6.83 19.80 3.20 2.40 MEG 103
|
||||
103 3.48 21.35 3.20 2.40 MEG 104
|
||||
104 0.00 21.35 3.20 2.40 MEG 105
|
||||
105 -3.48 21.35 3.20 2.40 MEG 106
|
||||
106 -6.83 19.80 3.20 2.40 MEG 107
|
||||
107 -10.11 18.86 3.20 2.40 MEG 108
|
||||
108 -12.03 13.52 3.20 2.40 MEG 109
|
||||
109 -1.63 8.64 3.20 2.40 MEG 110
|
||||
110 -3.36 18.88 3.20 2.40 MEG 111
|
||||
111 -0.02 18.88 3.20 2.40 MEG 112
|
||||
112 3.36 18.88 3.20 2.40 MEG 113
|
||||
113 1.63 8.64 3.20 2.40 MEG 114
|
||||
114 9.01 16.34 3.20 2.40 MEG 115
|
||||
115 4.97 5.29 3.20 2.40 MEG 116
|
||||
116 13.28 10.76 3.20 2.40 MEG 117
|
||||
117 15.78 7.58 3.20 2.40 MEG 118
|
||||
118 14.24 3.60 3.20 2.40 MEG 119
|
||||
119 14.69 -0.31 3.20 2.40 MEG 120
|
||||
120 3.37 -0.21 3.20 2.40 MEG 121
|
||||
121 8.20 -8.14 3.20 2.40 MEG 122
|
||||
122 6.11 -10.67 3.20 2.40 MEG 123
|
||||
123 2.77 -10.98 3.20 2.40 MEG 124
|
||||
124 0.10 -13.43 3.20 2.40 MEG 125
|
||||
125 0.02 -0.57 3.20 2.40 MEG 126
|
||||
126 -2.77 -10.98 3.20 2.40 MEG 127
|
||||
127 -8.20 -8.14 3.20 2.40 MEG 128
|
||||
128 -3.37 -0.21 3.20 2.40 MEG 129
|
||||
129 -14.69 -0.31 3.20 2.40 MEG 130
|
||||
130 -14.24 3.60 3.20 2.40 MEG 131
|
||||
131 -15.78 7.58 3.20 2.40 MEG 132
|
||||
132 -13.28 10.76 3.20 2.40 MEG 133
|
||||
133 -4.97 5.29 3.20 2.40 MEG 134
|
||||
134 -9.46 11.02 3.20 2.40 MEG 135
|
||||
135 -12.21 7.84 3.20 2.40 MEG 136
|
||||
136 -10.93 3.58 3.20 2.40 MEG 137
|
||||
137 -10.71 -3.82 3.20 2.40 MEG 138
|
||||
138 -6.89 -5.51 3.20 2.40 MEG 139
|
||||
139 -1.66 5.24 3.20 2.40 MEG 140
|
||||
140 -2.40 -8.39 3.20 2.40 MEG 141
|
||||
141 2.40 -8.39 3.20 2.40 MEG 142
|
||||
142 -4.29 2.66 3.20 2.40 MEG 143
|
||||
143 6.89 -5.51 3.20 2.40 MEG 144
|
||||
144 10.71 -3.82 3.20 2.40 MEG 145
|
||||
145 10.93 3.58 3.20 2.40 MEG 146
|
||||
146 4.29 2.66 3.20 2.40 MEG 147
|
||||
147 9.46 11.02 3.20 2.40 MEG 148
|
||||
148 5.70 16.39 3.20 2.40 MEG 149
|
||||
149 1.66 5.24 3.20 2.40 MEG 150
|
||||
150 -2.37 16.38 3.20 2.40 MEG 151
|
||||
151 -5.70 16.39 3.20 2.40 MEG 152
|
||||
152 8.25 6.10 3.20 2.40 MEG 153
|
||||
153 -0.58 13.96 3.20 2.40 MEG 154
|
||||
154 2.81 13.89 3.20 2.40 MEG 155
|
||||
155 6.11 13.61 3.20 2.40 MEG 156
|
||||
156 2.37 16.38 3.20 2.40 MEG 157
|
||||
123
mne/channels/data/layouts/Neuromag_122.lout
Normal file
@@ -0,0 +1,123 @@
|
||||
-3 28 -17 15
|
||||
1 25.381295 -0.771781 2 1.5 MEG 001
|
||||
2 25.381295 0.727697 2 1.5 MEG 002
|
||||
3 22.715372 -0.733246 2 1.5 MEG 003
|
||||
4 22.715372 0.766753 2 1.5 MEG 004
|
||||
5 19.911143 -0.608748 2 1.5 MEG 005
|
||||
6 19.911143 0.891252 2 1.5 MEG 006
|
||||
7 24.481102 4.347077 2 1.5 MEG 007
|
||||
8 24.481102 5.847077 2 1.5 MEG 008
|
||||
9 21.9673 3.613717 2 1.5 MEG 009
|
||||
10 21.9673 5.113717 2 1.5 MEG 010
|
||||
11 19.345958 3.110359 2 1.5 MEG 011
|
||||
12 19.345958 4.610058 2 1.5 MEG 012
|
||||
13 16.706588 2.875744 2 1.5 MEG 013
|
||||
14 16.706588 4.375643 2 1.5 MEG 014
|
||||
15 14.09047 2.753697 2 1.5 MEG 015
|
||||
16 14.09047 4.253697 2 1.5 MEG 016
|
||||
17 19.559995 7.243332 2 1.5 MEG 017
|
||||
18 19.559995 8.743163 2 1.5 MEG 018
|
||||
19 16.942979 6.237191 2 1.5 MEG 019
|
||||
20 16.942979 7.737225 2 1.5 MEG 020
|
||||
21 14.204774 5.792745 2 1.5 MEG 021
|
||||
22 14.204774 7.292858 2 1.5 MEG 022
|
||||
23 11.5 5.70429 2 1.5 MEG 023
|
||||
24 11.5 7.204446 2 1.5 MEG 024
|
||||
25 16.662514 9.87843 2 1.5 MEG 025
|
||||
26 16.662514 11.37843 2 1.5 MEG 026
|
||||
27 13.466339 11.859999 2 1.5 MEG 027
|
||||
28 13.466339 13.359952 2 1.5 MEG 028
|
||||
29 13.450371 8.807222 2 1.5 MEG 029
|
||||
30 13.450371 10.307518 2 1.5 MEG 030
|
||||
31 9.533661 11.859999 2 1.5 MEG 031
|
||||
32 9.533661 13.359952 2 1.5 MEG 032
|
||||
33 9.54963 8.807222 2 1.5 MEG 033
|
||||
34 9.54963 10.307518 2 1.5 MEG 034
|
||||
35 6.3374865 9.87843 2 1.5 MEG 035
|
||||
36 6.337486 11.37843 2 1.5 MEG 036
|
||||
37 3.440005 7.243332 2 1.5 MEG 037
|
||||
38 3.440005 8.743163 2 1.5 MEG 038
|
||||
39 6.057021 6.237192 2 1.5 MEG 039
|
||||
40 6.057021 7.737225 2 1.5 MEG 040
|
||||
41 8.795226 5.792745 2 1.5 MEG 041
|
||||
42 8.795226 7.292858 2 1.5 MEG 042
|
||||
43 -1.481102 4.347078 2 1.5 MEG 043
|
||||
44 -1.481102 5.847078 2 1.5 MEG 044
|
||||
45 1.0327 3.613581 2 1.5 MEG 045
|
||||
46 1.0327 5.113717 2 1.5 MEG 046
|
||||
47 3.654042 3.11036 2 1.5 MEG 047
|
||||
48 3.654042 4.610058 2 1.5 MEG 048
|
||||
49 6.293412 2.875744 2 1.5 MEG 049
|
||||
50 6.293412 4.375643 2 1.5 MEG 050
|
||||
51 8.90953 2.753697 2 1.5 MEG 051
|
||||
52 8.90953 4.253697 2 1.5 MEG 052
|
||||
53 11.5 2.731327 2 1.5 MEG 053
|
||||
54 11.5 4.231464 2 1.5 MEG 054
|
||||
55 -2.381295 -0.771781 2 1.5 MEG 055
|
||||
56 -2.381295 0.727697 2 1.5 MEG 056
|
||||
57 0.284628 -0.733246 2 1.5 MEG 057
|
||||
58 0.284628 0.766753 2 1.5 MEG 058
|
||||
59 3.088857 -0.608748 2 1.5 MEG 059
|
||||
60 3.088857 0.891252 2 1.5 MEG 060
|
||||
61 5.895393 -0.521429 2 1.5 MEG 061
|
||||
62 5.895393 0.978571 2 1.5 MEG 062
|
||||
63 8.696664 -0.481488 2 1.5 MEG 063
|
||||
64 8.696664 1.018793 2 1.5 MEG 064
|
||||
65 11.5 -0.46314 2 1.5 MEG 065
|
||||
66 11.5 1.036853 2 1.5 MEG 066
|
||||
67 -1.590015 -6.177621 2 1.5 MEG 067
|
||||
68 -1.590015 -4.677286 2 1.5 MEG 068
|
||||
69 0.893853 -5.313065 2 1.5 MEG 069
|
||||
70 0.893853 -3.813065 2 1.5 MEG 070
|
||||
71 3.788197 -4.494587 2 1.5 MEG 071
|
||||
72 3.788197 -2.994811 2 1.5 MEG 072
|
||||
73 6.749538 -3.95458 2 1.5 MEG 073
|
||||
74 6.749538 -2.454261 2 1.5 MEG 074
|
||||
75 1.096738 -10.894836 2 1.5 MEG 075
|
||||
76 1.096738 -9.394836 2 1.5 MEG 076
|
||||
77 3.402274 -9.346367 2 1.5 MEG 077
|
||||
78 3.402274 -7.846579 2 1.5 MEG 078
|
||||
79 6.182132 -8.131419 2 1.5 MEG 079
|
||||
80 6.182132 -6.631304 2 1.5 MEG 080
|
||||
81 6.102499 -15.409053 2 1.5 MEG 081
|
||||
82 6.102499 -13.908834 2 1.5 MEG 082
|
||||
83 6.914234 -12.406122 2 1.5 MEG 083
|
||||
84 6.914234 -10.906034 2 1.5 MEG 084
|
||||
85 9.307503 -10.644013 2 1.5 MEG 085
|
||||
86 9.307503 -9.143762 2 1.5 MEG 086
|
||||
87 9.660984 -7.199067 2 1.5 MEG 087
|
||||
88 9.660984 -5.699067 2 1.5 MEG 088
|
||||
89 9.807536 -3.822648 2 1.5 MEG 089
|
||||
90 9.807536 -2.322552 2 1.5 MEG 090
|
||||
91 11.5 -16.259918 2 1.5 MEG 091
|
||||
92 11.5 -14.759918 2 1.5 MEG 092
|
||||
93 11.5 -13.097164 2 1.5 MEG 093
|
||||
94 11.5 -11.597439 2 1.5 MEG 094
|
||||
95 13.692497 -10.644013 2 1.5 MEG 095
|
||||
96 13.692497 -9.143762 2 1.5 MEG 096
|
||||
97 13.339016 -7.199067 2 1.5 MEG 097
|
||||
98 13.339016 -5.699067 2 1.5 MEG 098
|
||||
99 13.192464 -3.822648 2 1.5 MEG 099
|
||||
100 13.192464 -2.322552 2 1.5 MEG 100
|
||||
101 16.897501 -15.409053 2 1.5 MEG 101
|
||||
102 16.897501 -13.908834 2 1.5 MEG 102
|
||||
103 16.085766 -12.406122 2 1.5 MEG 103
|
||||
104 16.085766 -10.906034 2 1.5 MEG 104
|
||||
105 21.903262 -10.894836 2 1.5 MEG 105
|
||||
106 21.903262 -9.394836 2 1.5 MEG 106
|
||||
107 19.597726 -9.346367 2 1.5 MEG 107
|
||||
108 19.597726 -7.846579 2 1.5 MEG 108
|
||||
109 16.817868 -8.131419 2 1.5 MEG 109
|
||||
110 16.817868 -6.631304 2 1.5 MEG 110
|
||||
111 24.590015 -6.177621 2 1.5 MEG 111
|
||||
112 24.590015 -4.677286 2 1.5 MEG 112
|
||||
113 22.106147 -5.313065 2 1.5 MEG 113
|
||||
114 22.106147 -3.813065 2 1.5 MEG 114
|
||||
115 19.211802 -4.494588 2 1.5 MEG 115
|
||||
116 19.211802 -2.994811 2 1.5 MEG 116
|
||||
117 16.250462 -3.95458 2 1.5 MEG 117
|
||||
118 16.250462 -2.454261 2 1.5 MEG 118
|
||||
119 17.104607 -0.521429 2 1.5 MEG 119
|
||||
120 17.104607 0.978571 2 1.5 MEG 120
|
||||
121 14.303336 -0.481488 2 1.5 MEG 121
|
||||
122 14.303336 1.018792 2 1.5 MEG 122
|
||||
307
mne/channels/data/layouts/Vectorview-all.lout
Normal file
@@ -0,0 +1,307 @@
|
||||
-85.000000 90.000000 -83.000000 75.000000
|
||||
113 -73.416206 33.416687 6.000000 5.000000 MEG 0113
|
||||
112 -73.416206 38.416687 6.000000 5.000000 MEG 0112
|
||||
111 -67.416206 35.916687 6.000000 5.000000 MEG 0111
|
||||
122 -59.602242 38.489067 6.000000 5.000000 MEG 0122
|
||||
123 -59.602242 43.489067 6.000000 5.000000 MEG 0123
|
||||
121 -53.602242 40.989067 6.000000 5.000000 MEG 0121
|
||||
132 -68.018288 18.676970 6.000000 5.000000 MEG 0132
|
||||
133 -68.018288 23.676970 6.000000 5.000000 MEG 0133
|
||||
131 -62.018288 21.176970 6.000000 5.000000 MEG 0131
|
||||
143 -80.582848 8.095787 6.000000 5.000000 MEG 0143
|
||||
142 -80.582848 13.095787 6.000000 5.000000 MEG 0142
|
||||
141 -74.582848 10.595787 6.000000 5.000000 MEG 0141
|
||||
213 -56.595154 17.019251 6.000000 5.000000 MEG 0213
|
||||
212 -56.595154 22.019251 6.000000 5.000000 MEG 0212
|
||||
211 -50.595154 19.519251 6.000000 5.000000 MEG 0211
|
||||
222 -44.599728 17.543873 6.000000 5.000000 MEG 0222
|
||||
223 -44.599728 22.543873 6.000000 5.000000 MEG 0223
|
||||
221 -38.599728 20.043873 6.000000 5.000000 MEG 0221
|
||||
232 -47.416420 -0.216784 6.000000 5.000000 MEG 0232
|
||||
233 -47.416420 4.783216 6.000000 5.000000 MEG 0233
|
||||
231 -41.416420 2.283216 6.000000 5.000000 MEG 0231
|
||||
243 -59.280643 -2.761772 6.000000 5.000000 MEG 0243
|
||||
242 -59.280643 2.238228 6.000000 5.000000 MEG 0242
|
||||
241 -53.280643 -0.261772 6.000000 5.000000 MEG 0241
|
||||
313 -39.790501 47.430138 6.000000 5.000000 MEG 0313
|
||||
312 -39.790501 52.430138 6.000000 5.000000 MEG 0312
|
||||
311 -33.790501 49.930138 6.000000 5.000000 MEG 0311
|
||||
322 -38.014336 32.768585 6.000000 5.000000 MEG 0322
|
||||
323 -38.014336 37.768585 6.000000 5.000000 MEG 0323
|
||||
321 -32.014336 35.268585 6.000000 5.000000 MEG 0321
|
||||
333 -27.679966 28.868065 6.000000 5.000000 MEG 0333
|
||||
332 -27.679966 33.868065 6.000000 5.000000 MEG 0332
|
||||
331 -21.679966 31.368065 6.000000 5.000000 MEG 0331
|
||||
343 -49.684467 34.078434 6.000000 5.000000 MEG 0343
|
||||
342 -49.684467 39.078434 6.000000 5.000000 MEG 0342
|
||||
341 -43.684467 36.578434 6.000000 5.000000 MEG 0341
|
||||
413 -32.997990 15.607347 6.000000 5.000000 MEG 0413
|
||||
412 -32.997990 20.607347 6.000000 5.000000 MEG 0412
|
||||
411 -26.997990 18.107347 6.000000 5.000000 MEG 0411
|
||||
422 -21.084751 13.953575 6.000000 5.000000 MEG 0422
|
||||
423 -21.084751 18.953575 6.000000 5.000000 MEG 0423
|
||||
421 -15.084751 16.453575 6.000000 5.000000 MEG 0421
|
||||
432 -21.930935 -0.085500 6.000000 5.000000 MEG 0432
|
||||
433 -21.930935 4.914500 6.000000 5.000000 MEG 0433
|
||||
431 -15.930935 2.414500 6.000000 5.000000 MEG 0431
|
||||
443 -34.824663 0.362587 6.000000 5.000000 MEG 0443
|
||||
442 -34.824663 5.362587 6.000000 5.000000 MEG 0442
|
||||
441 -28.824663 2.862587 6.000000 5.000000 MEG 0441
|
||||
513 -27.861498 55.439636 6.000000 5.000000 MEG 0513
|
||||
512 -27.861498 60.439636 6.000000 5.000000 MEG 0512
|
||||
511 -21.861498 57.939636 6.000000 5.000000 MEG 0511
|
||||
523 -15.506709 59.619865 6.000000 5.000000 MEG 0523
|
||||
522 -15.506709 64.619865 6.000000 5.000000 MEG 0522
|
||||
521 -9.506709 62.119865 6.000000 5.000000 MEG 0521
|
||||
532 -14.616095 49.308380 6.000000 5.000000 MEG 0532
|
||||
533 -14.616095 54.308380 6.000000 5.000000 MEG 0533
|
||||
531 -8.616095 51.808380 6.000000 5.000000 MEG 0531
|
||||
542 -27.240477 43.863430 6.000000 5.000000 MEG 0542
|
||||
543 -27.240477 48.863430 6.000000 5.000000 MEG 0543
|
||||
541 -21.240477 46.363430 6.000000 5.000000 MEG 0541
|
||||
613 -14.782405 38.147827 6.000000 5.000000 MEG 0613
|
||||
612 -14.782405 43.147827 6.000000 5.000000 MEG 0612
|
||||
611 -8.782405 40.647827 6.000000 5.000000 MEG 0611
|
||||
622 -2.967276 27.260933 6.000000 5.000000 MEG 0622
|
||||
623 -2.967276 32.260933 6.000000 5.000000 MEG 0623
|
||||
621 3.032724 29.760933 6.000000 5.000000 MEG 0621
|
||||
633 -9.094766 14.700909 6.000000 5.000000 MEG 0633
|
||||
632 -9.094766 19.700909 6.000000 5.000000 MEG 0632
|
||||
631 -3.094766 17.200909 6.000000 5.000000 MEG 0631
|
||||
642 -15.199021 26.631405 6.000000 5.000000 MEG 0642
|
||||
643 -15.199021 31.631405 6.000000 5.000000 MEG 0643
|
||||
641 -9.199021 29.131405 6.000000 5.000000 MEG 0641
|
||||
713 -9.246834 1.693846 6.000000 5.000000 MEG 0713
|
||||
712 -9.246834 6.693846 6.000000 5.000000 MEG 0712
|
||||
711 -3.246834 4.193846 6.000000 5.000000 MEG 0711
|
||||
723 3.314525 1.573887 6.000000 5.000000 MEG 0723
|
||||
722 3.314525 6.573887 6.000000 5.000000 MEG 0722
|
||||
721 9.314525 4.073887 6.000000 5.000000 MEG 0721
|
||||
733 3.387173 -10.588106 6.000000 5.000000 MEG 0733
|
||||
732 3.387173 -5.588106 6.000000 5.000000 MEG 0732
|
||||
731 9.387173 -8.088106 6.000000 5.000000 MEG 0731
|
||||
743 -9.422897 -10.519942 6.000000 5.000000 MEG 0743
|
||||
742 -9.422897 -5.519942 6.000000 5.000000 MEG 0742
|
||||
741 -3.422897 -8.019942 6.000000 5.000000 MEG 0741
|
||||
813 -2.962408 61.007698 6.000000 5.000000 MEG 0813
|
||||
812 -2.962408 66.007698 6.000000 5.000000 MEG 0812
|
||||
811 3.037592 63.507698 6.000000 5.000000 MEG 0811
|
||||
822 -2.965545 50.641838 6.000000 5.000000 MEG 0822
|
||||
823 -2.965545 55.641838 6.000000 5.000000 MEG 0823
|
||||
821 3.034455 53.141838 6.000000 5.000000 MEG 0821
|
||||
913 9.504830 59.655254 6.000000 5.000000 MEG 0913
|
||||
912 9.504830 64.655254 6.000000 5.000000 MEG 0912
|
||||
911 15.504830 62.155254 6.000000 5.000000 MEG 0911
|
||||
923 21.967310 55.408710 6.000000 5.000000 MEG 0923
|
||||
922 21.967310 60.408710 6.000000 5.000000 MEG 0922
|
||||
921 27.967310 57.908710 6.000000 5.000000 MEG 0921
|
||||
932 21.254196 43.889683 6.000000 5.000000 MEG 0932
|
||||
933 21.254196 48.889683 6.000000 5.000000 MEG 0933
|
||||
931 27.254196 46.389683 6.000000 5.000000 MEG 0931
|
||||
942 8.661931 49.358044 6.000000 5.000000 MEG 0942
|
||||
943 8.661931 54.358044 6.000000 5.000000 MEG 0943
|
||||
941 14.661931 51.858044 6.000000 5.000000 MEG 0941
|
||||
1013 -2.967087 39.669956 6.000000 5.000000 MEG 1013
|
||||
1012 -2.967087 44.669956 6.000000 5.000000 MEG 1012
|
||||
1011 3.032913 42.169956 6.000000 5.000000 MEG 1011
|
||||
1023 8.751018 38.154079 6.000000 5.000000 MEG 1023
|
||||
1022 8.751018 43.154079 6.000000 5.000000 MEG 1022
|
||||
1021 14.751018 40.654079 6.000000 5.000000 MEG 1021
|
||||
1032 9.123913 26.648697 6.000000 5.000000 MEG 1032
|
||||
1033 9.123913 31.648697 6.000000 5.000000 MEG 1033
|
||||
1031 15.123913 29.148697 6.000000 5.000000 MEG 1031
|
||||
1043 3.200539 14.795620 6.000000 5.000000 MEG 1043
|
||||
1042 3.200539 19.795620 6.000000 5.000000 MEG 1042
|
||||
1041 9.200539 17.295620 6.000000 5.000000 MEG 1041
|
||||
1112 15.014965 13.912239 6.000000 5.000000 MEG 1112
|
||||
1113 15.014965 18.912239 6.000000 5.000000 MEG 1113
|
||||
1111 21.014965 16.412239 6.000000 5.000000 MEG 1111
|
||||
1123 26.958527 15.562130 6.000000 5.000000 MEG 1123
|
||||
1122 26.958527 20.562130 6.000000 5.000000 MEG 1122
|
||||
1121 32.958527 18.062130 6.000000 5.000000 MEG 1121
|
||||
1133 28.757563 0.227141 6.000000 5.000000 MEG 1133
|
||||
1132 28.757563 5.227141 6.000000 5.000000 MEG 1132
|
||||
1131 34.757563 2.727141 6.000000 5.000000 MEG 1131
|
||||
1142 15.882982 0.037700 6.000000 5.000000 MEG 1142
|
||||
1143 15.882982 5.037700 6.000000 5.000000 MEG 1143
|
||||
1141 21.882982 2.537700 6.000000 5.000000 MEG 1141
|
||||
1213 33.958897 47.388790 6.000000 5.000000 MEG 1213
|
||||
1212 33.958897 52.388790 6.000000 5.000000 MEG 1212
|
||||
1211 39.958897 49.888790 6.000000 5.000000 MEG 1211
|
||||
1223 43.923473 33.914738 6.000000 5.000000 MEG 1223
|
||||
1222 43.923473 38.914738 6.000000 5.000000 MEG 1222
|
||||
1221 49.923473 36.414738 6.000000 5.000000 MEG 1221
|
||||
1232 32.014336 32.768585 6.000000 5.000000 MEG 1232
|
||||
1233 32.014336 37.768585 6.000000 5.000000 MEG 1233
|
||||
1231 38.014336 35.268585 6.000000 5.000000 MEG 1231
|
||||
1243 21.600079 28.898149 6.000000 5.000000 MEG 1243
|
||||
1242 21.600079 33.898149 6.000000 5.000000 MEG 1242
|
||||
1241 27.600079 31.398149 6.000000 5.000000 MEG 1241
|
||||
1312 38.599728 17.543867 6.000000 5.000000 MEG 1312
|
||||
1313 38.599728 22.543867 6.000000 5.000000 MEG 1313
|
||||
1311 44.599728 20.043867 6.000000 5.000000 MEG 1311
|
||||
1323 50.558392 16.887651 6.000000 5.000000 MEG 1323
|
||||
1322 50.558392 21.887651 6.000000 5.000000 MEG 1322
|
||||
1321 56.558392 19.387651 6.000000 5.000000 MEG 1321
|
||||
1333 53.420483 -2.919475 6.000000 5.000000 MEG 1333
|
||||
1332 53.420483 2.080525 6.000000 5.000000 MEG 1332
|
||||
1331 59.420483 -0.419475 6.000000 5.000000 MEG 1331
|
||||
1342 41.371586 -0.216817 6.000000 5.000000 MEG 1342
|
||||
1343 41.371586 4.783183 6.000000 5.000000 MEG 1343
|
||||
1341 47.371586 2.283183 6.000000 5.000000 MEG 1341
|
||||
1412 53.704369 38.563030 6.000000 5.000000 MEG 1412
|
||||
1413 53.704369 43.563030 6.000000 5.000000 MEG 1413
|
||||
1411 59.704369 41.063030 6.000000 5.000000 MEG 1411
|
||||
1423 67.119286 33.843739 6.000000 5.000000 MEG 1423
|
||||
1422 67.119286 38.843739 6.000000 5.000000 MEG 1422
|
||||
1421 73.119286 36.343739 6.000000 5.000000 MEG 1421
|
||||
1433 74.438919 8.335863 6.000000 5.000000 MEG 1433
|
||||
1432 74.438919 13.335863 6.000000 5.000000 MEG 1432
|
||||
1431 80.438919 10.835863 6.000000 5.000000 MEG 1431
|
||||
1442 61.883209 18.562304 6.000000 5.000000 MEG 1442
|
||||
1443 61.883209 23.562304 6.000000 5.000000 MEG 1443
|
||||
1441 67.883209 21.062304 6.000000 5.000000 MEG 1441
|
||||
1512 -71.298943 -4.707253 6.000000 5.000000 MEG 1512
|
||||
1513 -71.298943 0.292747 6.000000 5.000000 MEG 1513
|
||||
1511 -65.298943 -2.207253 6.000000 5.000000 MEG 1511
|
||||
1522 -67.281609 -25.407852 6.000000 5.000000 MEG 1522
|
||||
1523 -67.281609 -20.407852 6.000000 5.000000 MEG 1523
|
||||
1521 -61.281609 -22.907852 6.000000 5.000000 MEG 1521
|
||||
1533 -71.702820 -40.152336 6.000000 5.000000 MEG 1533
|
||||
1532 -71.702820 -35.152336 6.000000 5.000000 MEG 1532
|
||||
1531 -65.702820 -37.652336 6.000000 5.000000 MEG 1531
|
||||
1543 -79.907913 -17.418098 6.000000 5.000000 MEG 1543
|
||||
1542 -79.907913 -12.418098 6.000000 5.000000 MEG 1542
|
||||
1541 -73.907913 -14.918098 6.000000 5.000000 MEG 1541
|
||||
1613 -56.916454 -20.312164 6.000000 5.000000 MEG 1613
|
||||
1612 -56.916454 -15.312164 6.000000 5.000000 MEG 1612
|
||||
1611 -50.916454 -17.812164 6.000000 5.000000 MEG 1611
|
||||
1622 -45.631779 -16.320436 6.000000 5.000000 MEG 1622
|
||||
1623 -45.631779 -11.320436 6.000000 5.000000 MEG 1623
|
||||
1621 -39.631779 -13.820436 6.000000 5.000000 MEG 1621
|
||||
1632 -37.896103 -30.578358 6.000000 5.000000 MEG 1632
|
||||
1633 -37.896103 -25.578358 6.000000 5.000000 MEG 1633
|
||||
1631 -31.896103 -28.078358 6.000000 5.000000 MEG 1631
|
||||
1643 -48.859089 -36.176094 6.000000 5.000000 MEG 1643
|
||||
1642 -48.859089 -31.176094 6.000000 5.000000 MEG 1642
|
||||
1641 -42.859089 -33.676094 6.000000 5.000000 MEG 1641
|
||||
1713 -56.796040 -59.082275 6.000000 5.000000 MEG 1713
|
||||
1712 -56.796040 -54.082275 6.000000 5.000000 MEG 1712
|
||||
1711 -50.796040 -56.582275 6.000000 5.000000 MEG 1711
|
||||
1722 -57.188797 -44.057373 6.000000 5.000000 MEG 1722
|
||||
1723 -57.188797 -39.057373 6.000000 5.000000 MEG 1723
|
||||
1721 -51.188797 -41.557373 6.000000 5.000000 MEG 1721
|
||||
1732 -41.902962 -58.279526 6.000000 5.000000 MEG 1732
|
||||
1733 -41.902962 -53.279526 6.000000 5.000000 MEG 1733
|
||||
1731 -35.902962 -55.779526 6.000000 5.000000 MEG 1731
|
||||
1743 -37.408134 -72.449036 6.000000 5.000000 MEG 1743
|
||||
1742 -37.408134 -67.449036 6.000000 5.000000 MEG 1742
|
||||
1741 -31.408134 -69.949036 6.000000 5.000000 MEG 1741
|
||||
1813 -33.801163 -13.768716 6.000000 5.000000 MEG 1813
|
||||
1812 -33.801163 -8.768716 6.000000 5.000000 MEG 1812
|
||||
1811 -27.801163 -11.268716 6.000000 5.000000 MEG 1811
|
||||
1822 -21.685101 -12.619589 6.000000 5.000000 MEG 1822
|
||||
1823 -21.685101 -7.619589 6.000000 5.000000 MEG 1823
|
||||
1821 -15.685101 -10.119589 6.000000 5.000000 MEG 1821
|
||||
1832 -9.600111 -22.190945 6.000000 5.000000 MEG 1832
|
||||
1833 -9.600111 -17.190945 6.000000 5.000000 MEG 1833
|
||||
1831 -3.600111 -19.690945 6.000000 5.000000 MEG 1831
|
||||
1843 -24.483526 -26.850609 6.000000 5.000000 MEG 1843
|
||||
1842 -24.483526 -21.850609 6.000000 5.000000 MEG 1842
|
||||
1841 -18.483526 -24.350609 6.000000 5.000000 MEG 1841
|
||||
1912 -25.866816 -40.850040 6.000000 5.000000 MEG 1912
|
||||
1913 -25.866816 -35.850040 6.000000 5.000000 MEG 1913
|
||||
1911 -19.866816 -38.350040 6.000000 5.000000 MEG 1911
|
||||
1923 -20.513481 -56.355225 6.000000 5.000000 MEG 1923
|
||||
1922 -20.513481 -51.355225 6.000000 5.000000 MEG 1922
|
||||
1921 -14.513481 -53.855225 6.000000 5.000000 MEG 1921
|
||||
1932 -23.428471 -67.375893 6.000000 5.000000 MEG 1932
|
||||
1933 -23.428471 -62.375893 6.000000 5.000000 MEG 1933
|
||||
1931 -17.428471 -64.875893 6.000000 5.000000 MEG 1931
|
||||
1943 -36.237587 -48.444530 6.000000 5.000000 MEG 1943
|
||||
1942 -36.237587 -43.444530 6.000000 5.000000 MEG 1942
|
||||
1941 -30.237587 -45.944530 6.000000 5.000000 MEG 1941
|
||||
2013 -10.441930 -34.308243 6.000000 5.000000 MEG 2013
|
||||
2012 -10.441930 -29.308243 6.000000 5.000000 MEG 2012
|
||||
2011 -4.441930 -31.808243 6.000000 5.000000 MEG 2011
|
||||
2023 4.357624 -34.289736 6.000000 5.000000 MEG 2023
|
||||
2022 4.357624 -29.289736 6.000000 5.000000 MEG 2022
|
||||
2021 10.357624 -31.789736 6.000000 5.000000 MEG 2021
|
||||
2032 4.645295 -46.290749 6.000000 5.000000 MEG 2032
|
||||
2033 4.645295 -41.290749 6.000000 5.000000 MEG 2033
|
||||
2031 10.645295 -43.790749 6.000000 5.000000 MEG 2031
|
||||
2042 -10.645079 -46.244335 6.000000 5.000000 MEG 2042
|
||||
2043 -10.645079 -41.244335 6.000000 5.000000 MEG 2043
|
||||
2041 -4.645079 -43.744335 6.000000 5.000000 MEG 2041
|
||||
2113 -3.052351 -58.889515 6.000000 5.000000 MEG 2113
|
||||
2112 -3.052351 -53.889515 6.000000 5.000000 MEG 2112
|
||||
2111 2.947649 -56.389515 6.000000 5.000000 MEG 2111
|
||||
2122 -2.999999 -70.362061 6.000000 5.000000 MEG 2122
|
||||
2123 -2.999999 -65.362061 6.000000 5.000000 MEG 2123
|
||||
2121 3.000001 -67.862061 6.000000 5.000000 MEG 2121
|
||||
2133 8.918572 -79.441826 6.000000 5.000000 MEG 2133
|
||||
2132 8.918572 -74.441826 6.000000 5.000000 MEG 2132
|
||||
2131 14.918572 -76.941826 6.000000 5.000000 MEG 2131
|
||||
2143 -14.987089 -79.428932 6.000000 5.000000 MEG 2143
|
||||
2142 -14.987089 -74.428932 6.000000 5.000000 MEG 2142
|
||||
2141 -8.987089 -76.928932 6.000000 5.000000 MEG 2141
|
||||
2212 15.641460 -12.579389 6.000000 5.000000 MEG 2212
|
||||
2213 15.641460 -7.579389 6.000000 5.000000 MEG 2213
|
||||
2211 21.641460 -10.079389 6.000000 5.000000 MEG 2211
|
||||
2223 27.786499 -13.669980 6.000000 5.000000 MEG 2223
|
||||
2222 27.786499 -8.669980 6.000000 5.000000 MEG 2222
|
||||
2221 33.786499 -11.169980 6.000000 5.000000 MEG 2221
|
||||
2233 18.501518 -26.949615 6.000000 5.000000 MEG 2233
|
||||
2232 18.501518 -21.949615 6.000000 5.000000 MEG 2232
|
||||
2231 24.501518 -24.449615 6.000000 5.000000 MEG 2231
|
||||
2242 3.641699 -22.206125 6.000000 5.000000 MEG 2242
|
||||
2243 3.641699 -17.206125 6.000000 5.000000 MEG 2243
|
||||
2241 9.641699 -19.706125 6.000000 5.000000 MEG 2241
|
||||
2312 19.852789 -40.871220 6.000000 5.000000 MEG 2312
|
||||
2313 19.852789 -35.871220 6.000000 5.000000 MEG 2313
|
||||
2311 25.852789 -38.371220 6.000000 5.000000 MEG 2311
|
||||
2323 30.078903 -48.474960 6.000000 5.000000 MEG 2323
|
||||
2322 30.078903 -43.474960 6.000000 5.000000 MEG 2322
|
||||
2321 36.078903 -45.974960 6.000000 5.000000 MEG 2321
|
||||
2332 17.363274 -67.365387 6.000000 5.000000 MEG 2332
|
||||
2333 17.363274 -62.365387 6.000000 5.000000 MEG 2333
|
||||
2331 23.363274 -64.865387 6.000000 5.000000 MEG 2331
|
||||
2343 14.329920 -56.380260 6.000000 5.000000 MEG 2343
|
||||
2342 14.329920 -51.380260 6.000000 5.000000 MEG 2342
|
||||
2341 20.329920 -53.880260 6.000000 5.000000 MEG 2341
|
||||
2412 39.644810 -16.175139 6.000000 5.000000 MEG 2412
|
||||
2413 39.644810 -11.175139 6.000000 5.000000 MEG 2413
|
||||
2411 45.644810 -13.675139 6.000000 5.000000 MEG 2411
|
||||
2423 50.812263 -20.401899 6.000000 5.000000 MEG 2423
|
||||
2422 50.812263 -15.401899 6.000000 5.000000 MEG 2422
|
||||
2421 56.812263 -17.901899 6.000000 5.000000 MEG 2421
|
||||
2433 42.694180 -36.278580 6.000000 5.000000 MEG 2433
|
||||
2432 42.694180 -31.278580 6.000000 5.000000 MEG 2432
|
||||
2431 48.694180 -33.778580 6.000000 5.000000 MEG 2431
|
||||
2442 31.896111 -30.578348 6.000000 5.000000 MEG 2442
|
||||
2443 31.896111 -25.578348 6.000000 5.000000 MEG 2443
|
||||
2441 37.896111 -28.078348 6.000000 5.000000 MEG 2441
|
||||
2512 35.812634 -58.300888 6.000000 5.000000 MEG 2512
|
||||
2513 35.812634 -53.300888 6.000000 5.000000 MEG 2513
|
||||
2511 41.812634 -55.800888 6.000000 5.000000 MEG 2511
|
||||
2522 51.171906 -43.981274 6.000000 5.000000 MEG 2522
|
||||
2523 51.171906 -38.981274 6.000000 5.000000 MEG 2523
|
||||
2521 57.171906 -41.481274 6.000000 5.000000 MEG 2521
|
||||
2533 50.704624 -59.132656 6.000000 5.000000 MEG 2533
|
||||
2532 50.704624 -54.132656 6.000000 5.000000 MEG 2532
|
||||
2531 56.704624 -56.632656 6.000000 5.000000 MEG 2531
|
||||
2543 31.320171 -72.484848 6.000000 5.000000 MEG 2543
|
||||
2542 31.320171 -67.484848 6.000000 5.000000 MEG 2542
|
||||
2541 37.320171 -69.984848 6.000000 5.000000 MEG 2541
|
||||
2612 65.137360 -4.702045 6.000000 5.000000 MEG 2612
|
||||
2613 65.137360 0.297955 6.000000 5.000000 MEG 2613
|
||||
2611 71.137360 -2.202045 6.000000 5.000000 MEG 2611
|
||||
2623 73.822243 -17.329140 6.000000 5.000000 MEG 2623
|
||||
2622 73.822243 -12.329140 6.000000 5.000000 MEG 2622
|
||||
2621 79.822243 -14.829140 6.000000 5.000000 MEG 2621
|
||||
2633 65.490112 -40.332645 6.000000 5.000000 MEG 2633
|
||||
2632 65.490112 -35.332645 6.000000 5.000000 MEG 2632
|
||||
2631 71.490112 -37.832645 6.000000 5.000000 MEG 2631
|
||||
2642 61.220192 -25.385981 6.000000 5.000000 MEG 2642
|
||||
2643 61.220192 -20.385981 6.000000 5.000000 MEG 2643
|
||||
2641 67.220192 -22.885981 6.000000 5.000000 MEG 2641
|
||||
205
mne/channels/data/layouts/Vectorview-grad.lout
Normal file
@@ -0,0 +1,205 @@
|
||||
-55.000000 55.000000 -65.000000 60.000000
|
||||
113 -48.186871 26.886379 6.000000 5.000000 MEG 0113
|
||||
112 -48.186871 31.886379 6.000000 5.000000 MEG 0112
|
||||
122 -39.322296 31.036510 6.000000 5.000000 MEG 0122
|
||||
123 -39.322296 36.036510 6.000000 5.000000 MEG 0123
|
||||
132 -44.722965 14.826612 6.000000 5.000000 MEG 0132
|
||||
133 -44.722965 19.826612 6.000000 5.000000 MEG 0133
|
||||
143 -52.785782 6.169280 6.000000 5.000000 MEG 0143
|
||||
142 -52.785782 11.169280 6.000000 5.000000 MEG 0142
|
||||
213 -37.392612 13.470296 6.000000 5.000000 MEG 0213
|
||||
212 -37.392612 18.470296 6.000000 5.000000 MEG 0212
|
||||
222 -29.695013 13.899532 6.000000 5.000000 MEG 0222
|
||||
223 -29.695013 18.899532 6.000000 5.000000 MEG 0223
|
||||
232 -31.502516 -0.631914 6.000000 5.000000 MEG 0232
|
||||
233 -31.502516 4.368086 6.000000 5.000000 MEG 0233
|
||||
243 -39.115921 -2.709978 6.000000 5.000000 MEG 0243
|
||||
242 -39.115921 2.290022 6.000000 5.000000 MEG 0242
|
||||
313 -26.608879 38.351933 6.000000 5.000000 MEG 0313
|
||||
312 -26.608879 43.351933 6.000000 5.000000 MEG 0312
|
||||
322 -25.469093 26.356115 6.000000 5.000000 MEG 0322
|
||||
323 -25.469093 31.356115 6.000000 5.000000 MEG 0323
|
||||
333 -18.837411 23.164780 6.000000 5.000000 MEG 0333
|
||||
332 -18.837411 28.164780 6.000000 5.000000 MEG 0332
|
||||
343 -32.957949 27.427811 6.000000 5.000000 MEG 0343
|
||||
342 -32.957949 32.427811 6.000000 5.000000 MEG 0342
|
||||
413 -22.250046 12.315103 6.000000 5.000000 MEG 0413
|
||||
412 -22.250046 17.315103 6.000000 5.000000 MEG 0412
|
||||
422 -14.605187 10.962016 6.000000 5.000000 MEG 0422
|
||||
423 -14.605187 15.962016 6.000000 5.000000 MEG 0423
|
||||
432 -15.148193 -0.524500 6.000000 5.000000 MEG 0432
|
||||
433 -15.148193 4.475500 6.000000 5.000000 MEG 0433
|
||||
443 -23.422245 -0.157884 6.000000 5.000000 MEG 0443
|
||||
442 -23.422245 4.842116 6.000000 5.000000 MEG 0442
|
||||
513 -18.953902 44.905155 6.000000 5.000000 MEG 0513
|
||||
512 -18.953902 49.905155 6.000000 5.000000 MEG 0512
|
||||
523 -11.025696 48.325344 6.000000 5.000000 MEG 0523
|
||||
522 -11.025696 53.325344 6.000000 5.000000 MEG 0522
|
||||
532 -10.454178 39.888676 6.000000 5.000000 MEG 0532
|
||||
533 -10.454178 44.888676 6.000000 5.000000 MEG 0533
|
||||
542 -18.555386 35.433716 6.000000 5.000000 MEG 0542
|
||||
543 -18.555386 40.433716 6.000000 5.000000 MEG 0543
|
||||
613 -10.560901 30.757313 6.000000 5.000000 MEG 0613
|
||||
612 -10.560901 35.757313 6.000000 5.000000 MEG 0612
|
||||
622 -2.979000 21.849854 6.000000 5.000000 MEG 0622
|
||||
623 -2.979000 26.849854 6.000000 5.000000 MEG 0623
|
||||
633 -6.911079 11.573471 6.000000 5.000000 MEG 0633
|
||||
632 -6.911079 16.573471 6.000000 5.000000 MEG 0632
|
||||
642 -10.828249 21.334785 6.000000 5.000000 MEG 0642
|
||||
643 -10.828249 26.334785 6.000000 5.000000 MEG 0643
|
||||
713 -7.008664 0.931329 6.000000 5.000000 MEG 0713
|
||||
712 -7.008664 5.931329 6.000000 5.000000 MEG 0712
|
||||
723 1.052102 0.833180 6.000000 5.000000 MEG 0723
|
||||
722 1.052102 5.833180 6.000000 5.000000 MEG 0722
|
||||
733 1.098721 -8.987786 6.000000 5.000000 MEG 0733
|
||||
732 1.098721 -3.987786 6.000000 5.000000 MEG 0732
|
||||
743 -7.121645 -8.933109 6.000000 5.000000 MEG 0743
|
||||
742 -7.121645 -3.933109 6.000000 5.000000 MEG 0742
|
||||
813 -2.975877 49.460842 6.000000 5.000000 MEG 0813
|
||||
812 -2.975877 54.460842 6.000000 5.000000 MEG 0812
|
||||
822 -2.977890 40.979687 6.000000 5.000000 MEG 0822
|
||||
823 -2.977890 45.979687 6.000000 5.000000 MEG 0823
|
||||
913 5.024490 48.354298 6.000000 5.000000 MEG 0913
|
||||
912 5.024490 53.354298 6.000000 5.000000 MEG 0912
|
||||
923 13.021803 44.879852 6.000000 5.000000 MEG 0923
|
||||
922 13.021803 49.879852 6.000000 5.000000 MEG 0922
|
||||
932 12.564190 35.455193 6.000000 5.000000 MEG 0932
|
||||
933 12.564190 40.455193 6.000000 5.000000 MEG 0933
|
||||
942 4.483593 39.929310 6.000000 5.000000 MEG 0942
|
||||
943 4.483593 44.929310 6.000000 5.000000 MEG 0943
|
||||
1013 -2.978879 32.002693 6.000000 5.000000 MEG 1013
|
||||
1012 -2.978879 37.002693 6.000000 5.000000 MEG 1012
|
||||
1023 4.540760 30.762428 6.000000 5.000000 MEG 1023
|
||||
1022 4.540760 35.762428 6.000000 5.000000 MEG 1022
|
||||
1032 4.780051 21.348934 6.000000 5.000000 MEG 1032
|
||||
1033 4.780051 26.348934 6.000000 5.000000 MEG 1033
|
||||
1043 0.978956 11.650963 6.000000 5.000000 MEG 1043
|
||||
1042 0.978956 16.650963 6.000000 5.000000 MEG 1042
|
||||
1112 8.560405 10.928195 6.000000 5.000000 MEG 1112
|
||||
1113 8.560405 15.928195 6.000000 5.000000 MEG 1113
|
||||
1123 16.224724 12.278107 6.000000 5.000000 MEG 1123
|
||||
1122 16.224724 17.278107 6.000000 5.000000 MEG 1122
|
||||
1133 17.379185 -0.268703 6.000000 5.000000 MEG 1133
|
||||
1132 17.379185 4.731297 6.000000 5.000000 MEG 1132
|
||||
1142 9.117422 -0.423700 6.000000 5.000000 MEG 1142
|
||||
1143 9.117422 4.576300 6.000000 5.000000 MEG 1143
|
||||
1213 20.716938 38.318100 6.000000 5.000000 MEG 1213
|
||||
1212 20.716938 43.318100 6.000000 5.000000 MEG 1212
|
||||
1223 27.111319 27.293877 6.000000 5.000000 MEG 1223
|
||||
1222 27.111319 32.293877 6.000000 5.000000 MEG 1222
|
||||
1232 19.469093 26.356115 6.000000 5.000000 MEG 1232
|
||||
1233 19.469093 31.356115 6.000000 5.000000 MEG 1233
|
||||
1243 12.786146 23.189396 6.000000 5.000000 MEG 1243
|
||||
1242 12.786146 28.189396 6.000000 5.000000 MEG 1242
|
||||
1312 23.695013 13.899529 6.000000 5.000000 MEG 1312
|
||||
1313 23.695013 18.899529 6.000000 5.000000 MEG 1313
|
||||
1323 31.369019 13.362624 6.000000 5.000000 MEG 1323
|
||||
1322 31.369019 18.362624 6.000000 5.000000 MEG 1322
|
||||
1333 33.205658 -2.836478 6.000000 5.000000 MEG 1333
|
||||
1332 33.205658 2.163522 6.000000 5.000000 MEG 1332
|
||||
1342 25.473745 -0.631941 6.000000 5.000000 MEG 1342
|
||||
1343 25.473745 4.368059 6.000000 5.000000 MEG 1343
|
||||
1412 33.387833 31.097027 6.000000 5.000000 MEG 1412
|
||||
1413 33.387833 36.097027 6.000000 5.000000 MEG 1413
|
||||
1423 41.996334 27.235786 6.000000 5.000000 MEG 1423
|
||||
1422 41.996334 32.235786 6.000000 5.000000 MEG 1422
|
||||
1433 46.693424 6.365705 6.000000 5.000000 MEG 1433
|
||||
1432 46.693424 11.365705 6.000000 5.000000 MEG 1432
|
||||
1442 38.636284 14.732794 6.000000 5.000000 MEG 1442
|
||||
1443 38.636284 19.732794 6.000000 5.000000 MEG 1443
|
||||
1512 -46.828197 -4.270524 6.000000 5.000000 MEG 1512
|
||||
1513 -46.828197 0.729476 6.000000 5.000000 MEG 1513
|
||||
1522 -44.250233 -20.875282 6.000000 5.000000 MEG 1522
|
||||
1523 -44.250233 -15.875282 6.000000 5.000000 MEG 1523
|
||||
1533 -47.087372 -32.702410 6.000000 5.000000 MEG 1533
|
||||
1532 -47.087372 -27.702410 6.000000 5.000000 MEG 1532
|
||||
1543 -52.352669 -14.466389 6.000000 5.000000 MEG 1543
|
||||
1542 -52.352669 -9.466389 6.000000 5.000000 MEG 1542
|
||||
1613 -37.598797 -16.787832 6.000000 5.000000 MEG 1613
|
||||
1612 -37.598797 -11.787832 6.000000 5.000000 MEG 1612
|
||||
1622 -30.357292 -13.585911 6.000000 5.000000 MEG 1622
|
||||
1623 -30.357292 -8.585911 6.000000 5.000000 MEG 1623
|
||||
1632 -25.393221 -25.022747 6.000000 5.000000 MEG 1632
|
||||
1633 -25.393221 -20.022747 6.000000 5.000000 MEG 1633
|
||||
1643 -32.428291 -29.512911 6.000000 5.000000 MEG 1643
|
||||
1642 -32.428291 -24.512911 6.000000 5.000000 MEG 1642
|
||||
1713 -37.521523 -47.886852 6.000000 5.000000 MEG 1713
|
||||
1712 -37.521523 -42.886852 6.000000 5.000000 MEG 1712
|
||||
1722 -37.773560 -35.834789 6.000000 5.000000 MEG 1722
|
||||
1723 -37.773560 -30.834789 6.000000 5.000000 MEG 1723
|
||||
1732 -27.964468 -47.242935 6.000000 5.000000 MEG 1732
|
||||
1733 -27.964468 -42.242935 6.000000 5.000000 MEG 1733
|
||||
1743 -25.080088 -58.608849 6.000000 5.000000 MEG 1743
|
||||
1742 -25.080088 -53.608849 6.000000 5.000000 MEG 1742
|
||||
1813 -22.765453 -11.539077 6.000000 5.000000 MEG 1813
|
||||
1812 -22.765453 -6.539077 6.000000 5.000000 MEG 1812
|
||||
1822 -14.990439 -10.617317 6.000000 5.000000 MEG 1822
|
||||
1823 -14.990439 -5.617317 6.000000 5.000000 MEG 1823
|
||||
1832 -7.235366 -18.294876 6.000000 5.000000 MEG 1832
|
||||
1833 -7.235366 -13.294876 6.000000 5.000000 MEG 1833
|
||||
1843 -16.786220 -22.032574 6.000000 5.000000 MEG 1843
|
||||
1842 -16.786220 -17.032574 6.000000 5.000000 MEG 1842
|
||||
1912 -17.673892 -33.262066 6.000000 5.000000 MEG 1912
|
||||
1913 -17.673892 -28.262066 6.000000 5.000000 MEG 1913
|
||||
1923 -14.238597 -45.699379 6.000000 5.000000 MEG 1923
|
||||
1922 -14.238597 -40.699379 6.000000 5.000000 MEG 1922
|
||||
1932 -16.109179 -54.539486 6.000000 5.000000 MEG 1932
|
||||
1933 -16.109179 -49.539486 6.000000 5.000000 MEG 1933
|
||||
1943 -24.328934 -39.353901 6.000000 5.000000 MEG 1943
|
||||
1942 -24.328934 -34.353901 6.000000 5.000000 MEG 1942
|
||||
2013 -7.775570 -28.014633 6.000000 5.000000 MEG 2013
|
||||
2012 -7.775570 -23.014633 6.000000 5.000000 MEG 2012
|
||||
2023 1.721470 -27.999788 6.000000 5.000000 MEG 2023
|
||||
2022 1.721470 -22.999788 6.000000 5.000000 MEG 2022
|
||||
2032 1.906072 -37.626270 6.000000 5.000000 MEG 2032
|
||||
2033 1.906072 -32.626270 6.000000 5.000000 MEG 2033
|
||||
2042 -7.905933 -37.589039 6.000000 5.000000 MEG 2042
|
||||
2043 -7.905933 -32.589039 6.000000 5.000000 MEG 2043
|
||||
2113 -3.033595 -47.732231 6.000000 5.000000 MEG 2113
|
||||
2112 -3.033595 -42.732231 6.000000 5.000000 MEG 2112
|
||||
2122 -2.999999 -56.934807 6.000000 5.000000 MEG 2122
|
||||
2123 -2.999999 -51.934807 6.000000 5.000000 MEG 2123
|
||||
2133 4.648282 -64.218044 6.000000 5.000000 MEG 2133
|
||||
2132 4.648282 -59.218044 6.000000 5.000000 MEG 2132
|
||||
2143 -10.692250 -64.207703 6.000000 5.000000 MEG 2143
|
||||
2142 -10.692250 -59.207703 6.000000 5.000000 MEG 2142
|
||||
2212 8.962435 -10.585071 6.000000 5.000000 MEG 2212
|
||||
2213 8.962435 -5.585071 6.000000 5.000000 MEG 2213
|
||||
2223 16.756042 -11.459877 6.000000 5.000000 MEG 2223
|
||||
2222 16.756042 -6.459877 6.000000 5.000000 MEG 2222
|
||||
2233 10.797766 -22.111992 6.000000 5.000000 MEG 2233
|
||||
2232 10.797766 -17.111992 6.000000 5.000000 MEG 2232
|
||||
2242 1.262053 -18.307052 6.000000 5.000000 MEG 2242
|
||||
2243 1.262053 -13.307052 6.000000 5.000000 MEG 2243
|
||||
2312 11.664891 -33.279053 6.000000 5.000000 MEG 2312
|
||||
2313 11.664891 -28.279053 6.000000 5.000000 MEG 2313
|
||||
2323 18.227104 -39.378311 6.000000 5.000000 MEG 2323
|
||||
2322 18.227104 -34.378311 6.000000 5.000000 MEG 2322
|
||||
2332 10.067341 -54.531059 6.000000 5.000000 MEG 2332
|
||||
2333 10.067341 -49.531059 6.000000 5.000000 MEG 2333
|
||||
2343 8.120804 -45.719460 6.000000 5.000000 MEG 2343
|
||||
2342 8.120804 -40.719460 6.000000 5.000000 MEG 2342
|
||||
2412 24.365654 -13.469363 6.000000 5.000000 MEG 2412
|
||||
2413 24.365654 -8.469363 6.000000 5.000000 MEG 2413
|
||||
2423 31.531933 -16.859812 6.000000 5.000000 MEG 2423
|
||||
2422 31.531933 -11.859812 6.000000 5.000000 MEG 2422
|
||||
2433 26.322470 -29.595119 6.000000 5.000000 MEG 2433
|
||||
2432 26.322470 -24.595119 6.000000 5.000000 MEG 2432
|
||||
2442 19.393225 -25.022739 6.000000 5.000000 MEG 2442
|
||||
2443 19.393225 -20.022739 6.000000 5.000000 MEG 2443
|
||||
2512 21.906504 -47.260071 6.000000 5.000000 MEG 2512
|
||||
2513 21.906504 -42.260071 6.000000 5.000000 MEG 2513
|
||||
2522 31.762718 -35.773750 6.000000 5.000000 MEG 2522
|
||||
2523 31.762718 -30.773750 6.000000 5.000000 MEG 2523
|
||||
2533 31.462860 -47.927265 6.000000 5.000000 MEG 2533
|
||||
2532 31.462860 -42.927265 6.000000 5.000000 MEG 2532
|
||||
2543 19.023640 -58.637577 6.000000 5.000000 MEG 2543
|
||||
2542 19.023640 -53.637577 6.000000 5.000000 MEG 2542
|
||||
2612 40.724506 -4.266347 6.000000 5.000000 MEG 2612
|
||||
2613 40.724506 0.733653 6.000000 5.000000 MEG 2613
|
||||
2623 46.297695 -14.395032 6.000000 5.000000 MEG 2623
|
||||
2622 46.297695 -9.395032 6.000000 5.000000 MEG 2622
|
||||
2633 40.950874 -32.847042 6.000000 5.000000 MEG 2633
|
||||
2632 40.950874 -27.847042 6.000000 5.000000 MEG 2632
|
||||
2642 38.210819 -20.857738 6.000000 5.000000 MEG 2642
|
||||
2643 38.210819 -15.857738 6.000000 5.000000 MEG 2643
|
||||
103
mne/channels/data/layouts/Vectorview-grad_norm.lout
Normal file
@@ -0,0 +1,103 @@
|
||||
-50.000000 50.000000 -50.000000 38.000000
|
||||
11 -41.408840 17.090919 6.000000 5.000000 MEG 011X
|
||||
12 -33.873951 19.857674 6.000000 5.000000 MEG 012X
|
||||
13 -38.464523 9.051075 6.000000 5.000000 MEG 013X
|
||||
14 -45.317917 3.279520 6.000000 5.000000 MEG 014X
|
||||
21 -32.233719 8.146864 6.000000 5.000000 MEG 021X
|
||||
22 -25.690760 8.433022 6.000000 5.000000 MEG 022X
|
||||
23 -27.227139 -1.254610 6.000000 5.000000 MEG 023X
|
||||
24 -33.698534 -2.642785 6.000000 5.000000 MEG 024X
|
||||
31 -23.067547 24.734621 6.000000 5.000000 MEG 031X
|
||||
32 -22.098728 16.737410 6.000000 5.000000 MEG 032X
|
||||
33 -16.461800 14.609854 6.000000 5.000000 MEG 033X
|
||||
34 -28.464256 17.451874 6.000000 5.000000 MEG 034X
|
||||
41 -19.362539 7.376735 6.000000 5.000000 MEG 041X
|
||||
42 -12.864409 6.474677 6.000000 5.000000 MEG 042X
|
||||
43 -13.325964 -1.183000 6.000000 5.000000 MEG 043X
|
||||
44 -20.358908 -0.938589 6.000000 5.000000 MEG 044X
|
||||
51 -16.560817 29.103437 6.000000 5.000000 MEG 051X
|
||||
52 -9.821842 31.383564 6.000000 5.000000 MEG 052X
|
||||
53 -9.336051 25.759117 6.000000 5.000000 MEG 053X
|
||||
54 -16.222077 22.789145 6.000000 5.000000 MEG 054X
|
||||
61 -9.426766 19.671541 6.000000 5.000000 MEG 061X
|
||||
62 -2.982150 13.733236 6.000000 5.000000 MEG 062X
|
||||
63 -6.324418 6.882314 6.000000 5.000000 MEG 063X
|
||||
64 -9.654012 13.389857 6.000000 5.000000 MEG 064X
|
||||
71 -6.407364 -0.212448 6.000000 5.000000 MEG 071X
|
||||
72 0.444286 -0.277880 6.000000 5.000000 MEG 072X
|
||||
73 0.483912 -6.911695 6.000000 5.000000 MEG 073X
|
||||
74 -6.503398 -6.874514 6.000000 5.000000 MEG 074X
|
||||
81 -2.979496 32.140564 6.000000 5.000000 MEG 081X
|
||||
82 -2.981206 26.486458 6.000000 5.000000 MEG 082X
|
||||
91 3.820817 31.402866 6.000000 5.000000 MEG 091X
|
||||
92 10.618533 29.086569 6.000000 5.000000 MEG 092X
|
||||
93 10.229562 22.803463 6.000000 5.000000 MEG 093X
|
||||
94 3.361053 25.786205 6.000000 5.000000 MEG 094X
|
||||
101 -2.982047 20.501795 6.000000 5.000000 MEG 101X
|
||||
102 3.409646 19.674952 6.000000 5.000000 MEG 102X
|
||||
103 3.613043 13.399289 6.000000 5.000000 MEG 103X
|
||||
104 0.382112 6.933975 6.000000 5.000000 MEG 104X
|
||||
111 6.826344 6.452130 6.000000 5.000000 MEG 111X
|
||||
112 13.341015 7.352071 6.000000 5.000000 MEG 112X
|
||||
113 14.322306 -1.012468 6.000000 5.000000 MEG 113X
|
||||
114 7.299809 -1.115800 6.000000 5.000000 MEG 114X
|
||||
121 17.159397 24.712067 6.000000 5.000000 MEG 121X
|
||||
122 22.594622 17.362583 6.000000 5.000000 MEG 122X
|
||||
123 16.098728 16.737411 6.000000 5.000000 MEG 123X
|
||||
124 10.418224 14.626265 6.000000 5.000000 MEG 124X
|
||||
131 19.690762 8.433019 6.000000 5.000000 MEG 131X
|
||||
132 26.213667 8.075083 6.000000 5.000000 MEG 132X
|
||||
133 27.774809 -2.728805 6.000000 5.000000 MEG 133X
|
||||
134 21.202684 -1.254627 6.000000 5.000000 MEG 134X
|
||||
141 27.929657 19.898018 6.000000 5.000000 MEG 141X
|
||||
142 35.246883 17.323858 6.000000 5.000000 MEG 142X
|
||||
143 39.239410 3.410470 6.000000 5.000000 MEG 143X
|
||||
144 32.390839 8.988529 6.000000 5.000000 MEG 144X
|
||||
151 -40.253967 -3.703956 6.000000 5.000000 MEG 151X
|
||||
152 -38.062698 -14.995193 6.000000 5.000000 MEG 152X
|
||||
153 -40.474266 -23.037640 6.000000 5.000000 MEG 153X
|
||||
154 -44.949768 -10.637144 6.000000 5.000000 MEG 154X
|
||||
161 -32.408976 -12.215726 6.000000 5.000000 MEG 161X
|
||||
162 -26.253698 -10.038419 6.000000 5.000000 MEG 162X
|
||||
163 -22.034237 -17.815468 6.000000 5.000000 MEG 163X
|
||||
164 -28.014048 -20.868780 6.000000 5.000000 MEG 164X
|
||||
171 -32.343294 -33.363060 6.000000 5.000000 MEG 171X
|
||||
172 -32.557526 -25.167658 6.000000 5.000000 MEG 172X
|
||||
173 -24.219797 -32.925196 6.000000 5.000000 MEG 173X
|
||||
174 -21.768074 -40.654018 6.000000 5.000000 MEG 174X
|
||||
181 -19.800634 -8.646573 6.000000 5.000000 MEG 181X
|
||||
182 -13.191874 -8.019776 6.000000 5.000000 MEG 182X
|
||||
183 -6.600061 -13.240516 6.000000 5.000000 MEG 183X
|
||||
184 -14.718287 -15.782150 6.000000 5.000000 MEG 184X
|
||||
191 -15.472808 -23.418205 6.000000 5.000000 MEG 191X
|
||||
192 -12.552808 -31.875578 6.000000 5.000000 MEG 192X
|
||||
193 -14.142802 -37.886852 6.000000 5.000000 MEG 193X
|
||||
194 -21.129593 -27.560652 6.000000 5.000000 MEG 194X
|
||||
201 -7.059234 -19.849951 6.000000 5.000000 MEG 201X
|
||||
202 1.013249 -19.839857 6.000000 5.000000 MEG 202X
|
||||
203 1.170161 -26.385864 6.000000 5.000000 MEG 203X
|
||||
204 -7.170043 -26.360546 6.000000 5.000000 MEG 204X
|
||||
211 -3.028555 -33.257917 6.000000 5.000000 MEG 211X
|
||||
212 -3.000000 -39.515667 6.000000 5.000000 MEG 212X
|
||||
213 3.501040 -44.468269 6.000000 5.000000 MEG 213X
|
||||
214 -9.538412 -44.461239 6.000000 5.000000 MEG 214X
|
||||
221 7.168070 -7.997848 6.000000 5.000000 MEG 221X
|
||||
222 13.792637 -8.592716 6.000000 5.000000 MEG 222X
|
||||
223 8.728101 -15.836154 6.000000 5.000000 MEG 223X
|
||||
224 0.622745 -13.248796 6.000000 5.000000 MEG 224X
|
||||
231 9.465158 -23.429756 6.000000 5.000000 MEG 231X
|
||||
232 15.043037 -27.577251 6.000000 5.000000 MEG 232X
|
||||
233 8.107240 -37.881119 6.000000 5.000000 MEG 233X
|
||||
234 6.452683 -31.889233 6.000000 5.000000 MEG 234X
|
||||
241 20.260805 -9.959167 6.000000 5.000000 MEG 241X
|
||||
242 26.352144 -12.264672 6.000000 5.000000 MEG 242X
|
||||
243 21.924099 -20.924681 6.000000 5.000000 MEG 243X
|
||||
244 16.034241 -17.815463 6.000000 5.000000 MEG 244X
|
||||
251 18.170528 -32.936850 6.000000 5.000000 MEG 251X
|
||||
252 26.548311 -25.126150 6.000000 5.000000 MEG 252X
|
||||
253 26.293430 -33.390539 6.000000 5.000000 MEG 253X
|
||||
254 15.720093 -40.673553 6.000000 5.000000 MEG 254X
|
||||
261 34.165833 -3.701116 6.000000 5.000000 MEG 261X
|
||||
262 38.903042 -10.588621 6.000000 5.000000 MEG 262X
|
||||
263 34.358242 -23.135988 6.000000 5.000000 MEG 263X
|
||||
264 32.029198 -14.983262 6.000000 5.000000 MEG 264X
|
||||
103
mne/channels/data/layouts/Vectorview-mag.lout
Normal file
@@ -0,0 +1,103 @@
|
||||
-50.000000 50.000000 -50.000000 38.000000
|
||||
111 -41.408840 17.090919 6.000000 5.000000 MEG 0111
|
||||
121 -33.873951 19.857674 6.000000 5.000000 MEG 0121
|
||||
131 -38.464523 9.051075 6.000000 5.000000 MEG 0131
|
||||
141 -45.317917 3.279520 6.000000 5.000000 MEG 0141
|
||||
211 -32.233719 8.146864 6.000000 5.000000 MEG 0211
|
||||
221 -25.690760 8.433022 6.000000 5.000000 MEG 0221
|
||||
231 -27.227139 -1.254610 6.000000 5.000000 MEG 0231
|
||||
241 -33.698534 -2.642785 6.000000 5.000000 MEG 0241
|
||||
311 -23.067547 24.734621 6.000000 5.000000 MEG 0311
|
||||
321 -22.098728 16.737410 6.000000 5.000000 MEG 0321
|
||||
331 -16.461800 14.609854 6.000000 5.000000 MEG 0331
|
||||
341 -28.464256 17.451874 6.000000 5.000000 MEG 0341
|
||||
411 -19.362539 7.376735 6.000000 5.000000 MEG 0411
|
||||
421 -12.864409 6.474677 6.000000 5.000000 MEG 0421
|
||||
431 -13.325964 -1.183000 6.000000 5.000000 MEG 0431
|
||||
441 -20.358908 -0.938589 6.000000 5.000000 MEG 0441
|
||||
511 -16.560817 29.103437 6.000000 5.000000 MEG 0511
|
||||
521 -9.821842 31.383564 6.000000 5.000000 MEG 0521
|
||||
531 -9.336051 25.759117 6.000000 5.000000 MEG 0531
|
||||
541 -16.222077 22.789145 6.000000 5.000000 MEG 0541
|
||||
611 -9.426766 19.671541 6.000000 5.000000 MEG 0611
|
||||
621 -2.982150 13.733236 6.000000 5.000000 MEG 0621
|
||||
631 -6.324418 6.882314 6.000000 5.000000 MEG 0631
|
||||
641 -9.654012 13.389857 6.000000 5.000000 MEG 0641
|
||||
711 -6.407364 -0.212448 6.000000 5.000000 MEG 0711
|
||||
721 0.444286 -0.277880 6.000000 5.000000 MEG 0721
|
||||
731 0.483912 -6.911695 6.000000 5.000000 MEG 0731
|
||||
741 -6.503398 -6.874514 6.000000 5.000000 MEG 0741
|
||||
811 -2.979496 32.140564 6.000000 5.000000 MEG 0811
|
||||
821 -2.981206 26.486458 6.000000 5.000000 MEG 0821
|
||||
911 3.820817 31.402866 6.000000 5.000000 MEG 0911
|
||||
921 10.618533 29.086569 6.000000 5.000000 MEG 0921
|
||||
931 10.229562 22.803463 6.000000 5.000000 MEG 0931
|
||||
941 3.361053 25.786205 6.000000 5.000000 MEG 0941
|
||||
1011 -2.982047 20.501795 6.000000 5.000000 MEG 1011
|
||||
1021 3.409646 19.674952 6.000000 5.000000 MEG 1021
|
||||
1031 3.613043 13.399289 6.000000 5.000000 MEG 1031
|
||||
1041 0.382112 6.933975 6.000000 5.000000 MEG 1041
|
||||
1111 6.826344 6.452130 6.000000 5.000000 MEG 1111
|
||||
1121 13.341015 7.352071 6.000000 5.000000 MEG 1121
|
||||
1131 14.322306 -1.012468 6.000000 5.000000 MEG 1131
|
||||
1141 7.299809 -1.115800 6.000000 5.000000 MEG 1141
|
||||
1211 17.159397 24.712067 6.000000 5.000000 MEG 1211
|
||||
1221 22.594622 17.362583 6.000000 5.000000 MEG 1221
|
||||
1231 16.098728 16.737411 6.000000 5.000000 MEG 1231
|
||||
1241 10.418224 14.626265 6.000000 5.000000 MEG 1241
|
||||
1311 19.690762 8.433019 6.000000 5.000000 MEG 1311
|
||||
1321 26.213667 8.075083 6.000000 5.000000 MEG 1321
|
||||
1331 27.774809 -2.728805 6.000000 5.000000 MEG 1331
|
||||
1341 21.202684 -1.254627 6.000000 5.000000 MEG 1341
|
||||
1411 27.929657 19.898018 6.000000 5.000000 MEG 1411
|
||||
1421 35.246883 17.323858 6.000000 5.000000 MEG 1421
|
||||
1431 39.239410 3.410470 6.000000 5.000000 MEG 1431
|
||||
1441 32.390839 8.988529 6.000000 5.000000 MEG 1441
|
||||
1511 -40.253967 -3.703956 6.000000 5.000000 MEG 1511
|
||||
1521 -38.062698 -14.995193 6.000000 5.000000 MEG 1521
|
||||
1531 -40.474266 -23.037640 6.000000 5.000000 MEG 1531
|
||||
1541 -44.949768 -10.637144 6.000000 5.000000 MEG 1541
|
||||
1611 -32.408976 -12.215726 6.000000 5.000000 MEG 1611
|
||||
1621 -26.253698 -10.038419 6.000000 5.000000 MEG 1621
|
||||
1631 -22.034237 -17.815468 6.000000 5.000000 MEG 1631
|
||||
1641 -28.014048 -20.868780 6.000000 5.000000 MEG 1641
|
||||
1711 -32.343294 -33.363060 6.000000 5.000000 MEG 1711
|
||||
1721 -32.557526 -25.167658 6.000000 5.000000 MEG 1721
|
||||
1731 -24.219797 -32.925196 6.000000 5.000000 MEG 1731
|
||||
1741 -21.768074 -40.654018 6.000000 5.000000 MEG 1741
|
||||
1811 -19.800634 -8.646573 6.000000 5.000000 MEG 1811
|
||||
1821 -13.191874 -8.019776 6.000000 5.000000 MEG 1821
|
||||
1831 -6.600061 -13.240516 6.000000 5.000000 MEG 1831
|
||||
1841 -14.718287 -15.782150 6.000000 5.000000 MEG 1841
|
||||
1911 -15.472808 -23.418205 6.000000 5.000000 MEG 1911
|
||||
1921 -12.552808 -31.875578 6.000000 5.000000 MEG 1921
|
||||
1931 -14.142802 -37.886852 6.000000 5.000000 MEG 1931
|
||||
1941 -21.129593 -27.560652 6.000000 5.000000 MEG 1941
|
||||
2011 -7.059234 -19.849951 6.000000 5.000000 MEG 2011
|
||||
2021 1.013249 -19.839857 6.000000 5.000000 MEG 2021
|
||||
2031 1.170161 -26.385864 6.000000 5.000000 MEG 2031
|
||||
2041 -7.170043 -26.360546 6.000000 5.000000 MEG 2041
|
||||
2111 -3.028555 -33.257917 6.000000 5.000000 MEG 2111
|
||||
2121 -3.000000 -39.515667 6.000000 5.000000 MEG 2121
|
||||
2131 3.501040 -44.468269 6.000000 5.000000 MEG 2131
|
||||
2141 -9.538412 -44.461239 6.000000 5.000000 MEG 2141
|
||||
2211 7.168070 -7.997848 6.000000 5.000000 MEG 2211
|
||||
2221 13.792637 -8.592716 6.000000 5.000000 MEG 2221
|
||||
2231 8.728101 -15.836154 6.000000 5.000000 MEG 2231
|
||||
2241 0.622745 -13.248796 6.000000 5.000000 MEG 2241
|
||||
2311 9.465158 -23.429756 6.000000 5.000000 MEG 2311
|
||||
2321 15.043037 -27.577251 6.000000 5.000000 MEG 2321
|
||||
2331 8.107240 -37.881119 6.000000 5.000000 MEG 2331
|
||||
2341 6.452683 -31.889233 6.000000 5.000000 MEG 2341
|
||||
2411 20.260805 -9.959167 6.000000 5.000000 MEG 2411
|
||||
2421 26.352144 -12.264672 6.000000 5.000000 MEG 2421
|
||||
2431 21.924099 -20.924681 6.000000 5.000000 MEG 2431
|
||||
2441 16.034241 -17.815463 6.000000 5.000000 MEG 2441
|
||||
2511 18.170528 -32.936850 6.000000 5.000000 MEG 2511
|
||||
2521 26.548311 -25.126150 6.000000 5.000000 MEG 2521
|
||||
2531 26.293430 -33.390539 6.000000 5.000000 MEG 2531
|
||||
2541 15.720093 -40.673553 6.000000 5.000000 MEG 2541
|
||||
2611 34.165833 -3.701116 6.000000 5.000000 MEG 2611
|
||||
2621 38.903042 -10.588621 6.000000 5.000000 MEG 2621
|
||||
2631 34.358242 -23.135988 6.000000 5.000000 MEG 2631
|
||||
2641 32.029198 -14.983262 6.000000 5.000000 MEG 2641
|
||||
64
mne/channels/data/layouts/biosemi.lay
Normal file
@@ -0,0 +1,64 @@
|
||||
1 -0.496189 1.527114 0.290000 0.230000 Fp1
|
||||
2 -0.943808 1.299041 0.290000 0.230000 AF7
|
||||
3 -0.545830 1.170536 0.290000 0.230000 AF3
|
||||
4 -0.326906 0.809121 0.290000 0.230000 F1
|
||||
5 -0.659023 0.813825 0.290000 0.230000 F3
|
||||
6 -0.987913 0.858779 0.290000 0.230000 F5
|
||||
7 -1.299041 0.943808 0.290000 0.230000 F7
|
||||
8 -1.527114 0.496189 0.290000 0.230000 FT7
|
||||
9 -1.173172 0.450338 0.290000 0.230000 FC5
|
||||
10 -0.770517 0.409691 0.290000 0.230000 FC3
|
||||
11 -0.394923 0.394923 0.290000 0.230000 FC1
|
||||
12 -0.401426 -0.000000 0.290000 0.230000 C1
|
||||
13 -0.802851 -0.000000 0.290000 0.230000 C3
|
||||
14 -1.204277 -0.000000 0.290000 0.230000 C5
|
||||
15 -1.605703 -0.000000 0.290000 0.230000 T7
|
||||
16 -1.527114 -0.496189 0.290000 0.230000 TP7
|
||||
17 -1.173172 -0.450338 0.290000 0.230000 CP5
|
||||
18 -0.770517 -0.409691 0.290000 0.230000 CP3
|
||||
19 -0.394923 -0.394923 0.290000 0.230000 CP1
|
||||
20 -0.326906 -0.809121 0.290000 0.230000 P1
|
||||
21 -0.659023 -0.813825 0.290000 0.230000 P3
|
||||
22 -0.987913 -0.858779 0.290000 0.230000 P5
|
||||
23 -1.299041 -0.943808 0.290000 0.230000 P7
|
||||
24 -1.537550 -1.290157 0.290000 0.230000 P9
|
||||
25 -0.943808 -1.299041 0.290000 0.230000 PO7
|
||||
26 -0.545830 -1.170536 0.290000 0.230000 PO3
|
||||
27 -0.496189 -1.527114 0.290000 0.230000 O1
|
||||
28 0.000000 -2.007129 0.290000 0.230000 Iz
|
||||
29 0.000000 -1.605703 0.290000 0.230000 Oz
|
||||
30 0.000000 -1.204277 0.290000 0.230000 POz
|
||||
31 0.000000 -0.802851 0.290000 0.230000 Pz
|
||||
32 0.000000 -0.401426 0.290000 0.230000 CPz
|
||||
33 0.000000 1.605703 0.290000 0.230000 Fpz
|
||||
34 0.496189 1.527114 0.290000 0.230000 Fp2
|
||||
35 0.943808 1.299041 0.290000 0.230000 AF8
|
||||
36 0.545830 1.170536 0.290000 0.230000 AF4
|
||||
37 0.000000 1.204277 0.290000 0.230000 AFz
|
||||
38 0.000000 0.802851 0.290000 0.230000 Fz
|
||||
39 0.326906 0.809121 0.290000 0.230000 F2
|
||||
40 0.659023 0.813825 0.290000 0.230000 F4
|
||||
41 0.987913 0.858779 0.290000 0.230000 F6
|
||||
42 1.299041 0.943808 0.290000 0.230000 F8
|
||||
43 1.527114 0.496189 0.290000 0.230000 FT8
|
||||
44 1.173172 0.450338 0.290000 0.230000 FC6
|
||||
45 0.770517 0.409691 0.290000 0.230000 FC4
|
||||
46 0.394923 0.394923 0.290000 0.230000 FC2
|
||||
47 0.000000 0.401426 0.290000 0.230000 FCz
|
||||
48 0.000000 0.000000 0.290000 0.230000 Cz
|
||||
49 0.401426 0.000000 0.290000 0.230000 C2
|
||||
50 0.802851 0.000000 0.290000 0.230000 C4
|
||||
51 1.204277 0.000000 0.290000 0.230000 C6
|
||||
52 1.605703 0.000000 0.290000 0.230000 T8
|
||||
53 1.527114 -0.496189 0.290000 0.230000 TP8
|
||||
54 1.173172 -0.450338 0.290000 0.230000 CP6
|
||||
55 0.770517 -0.409691 0.290000 0.230000 CP4
|
||||
56 0.394923 -0.394923 0.290000 0.230000 CP2
|
||||
57 0.326906 -0.809121 0.290000 0.230000 P2
|
||||
58 0.659023 -0.813825 0.290000 0.230000 P4
|
||||
59 0.987913 -0.858779 0.290000 0.230000 P6
|
||||
60 1.299041 -0.943808 0.290000 0.230000 P8
|
||||
61 1.537550 -1.290157 0.290000 0.230000 P10
|
||||
62 0.943808 -1.299041 0.290000 0.230000 PO8
|
||||
63 0.545830 -1.170536 0.290000 0.230000 PO4
|
||||
64 0.496189 -1.527114 0.290000 0.230000 O2
|
||||
249
mne/channels/data/layouts/magnesWH3600.lout
Normal file
@@ -0,0 +1,249 @@
|
||||
-42.19 43.52 -41.70 28.71
|
||||
001 -1.28 -5.13 4.00 3.00 MEG 001
|
||||
002 -1.22 -1.43 4.00 3.00 MEG 002
|
||||
003 -1.37 2.53 4.00 3.00 MEG 003
|
||||
004 -1.36 5.90 4.00 3.00 MEG 004
|
||||
005 -1.45 9.27 4.00 3.00 MEG 005
|
||||
006 -4.89 9.36 4.00 3.00 MEG 006
|
||||
007 -5.20 5.86 4.00 3.00 MEG 007
|
||||
008 -5.26 2.40 4.00 3.00 MEG 008
|
||||
009 -5.34 -1.29 4.00 3.00 MEG 009
|
||||
010 -5.12 -5.08 4.00 3.00 MEG 010
|
||||
011 -4.73 -8.47 4.00 3.00 MEG 011
|
||||
012 -1.31 -8.81 4.00 3.00 MEG 012
|
||||
013 2.04 -8.49 4.00 3.00 MEG 013
|
||||
014 2.54 -5.16 4.00 3.00 MEG 014
|
||||
015 2.69 -1.43 4.00 3.00 MEG 015
|
||||
016 2.62 2.56 4.00 3.00 MEG 016
|
||||
017 2.50 5.89 4.00 3.00 MEG 017
|
||||
018 2.10 9.34 4.00 3.00 MEG 018
|
||||
019 -1.45 12.55 4.00 3.00 MEG 019
|
||||
020 -5.76 12.42 4.00 3.00 MEG 020
|
||||
021 -8.30 9.98 4.00 3.00 MEG 021
|
||||
022 -9.16 5.97 4.00 3.00 MEG 022
|
||||
023 -9.32 2.49 4.00 3.00 MEG 023
|
||||
024 -9.42 -1.32 4.00 3.00 MEG 024
|
||||
025 -9.13 -5.11 4.00 3.00 MEG 025
|
||||
026 -8.43 -9.18 4.00 3.00 MEG 026
|
||||
027 -5.45 -12.10 4.00 3.00 MEG 027
|
||||
028 -1.40 -12.51 4.00 3.00 MEG 028
|
||||
029 2.64 -12.08 4.00 3.00 MEG 029
|
||||
030 5.77 -9.29 4.00 3.00 MEG 030
|
||||
031 6.50 -5.19 4.00 3.00 MEG 031
|
||||
032 6.85 -1.37 4.00 3.00 MEG 032
|
||||
033 6.70 2.65 4.00 3.00 MEG 033
|
||||
034 6.46 6.18 4.00 3.00 MEG 034
|
||||
035 5.61 10.08 4.00 3.00 MEG 035
|
||||
036 2.95 12.49 4.00 3.00 MEG 036
|
||||
037 -1.47 15.77 4.00 3.00 MEG 037
|
||||
038 -5.48 15.52 4.00 3.00 MEG 038
|
||||
039 -8.97 13.31 4.00 3.00 MEG 039
|
||||
040 -11.91 10.42 4.00 3.00 MEG 040
|
||||
041 -12.96 6.84 4.00 3.00 MEG 041
|
||||
042 -13.39 3.21 4.00 3.00 MEG 042
|
||||
043 -13.58 -0.70 4.00 3.00 MEG 043
|
||||
044 -13.08 -4.42 4.00 3.00 MEG 044
|
||||
045 -12.52 -8.05 4.00 3.00 MEG 045
|
||||
046 -11.13 -11.34 4.00 3.00 MEG 046
|
||||
047 -8.45 -14.21 4.00 3.00 MEG 047
|
||||
048 -5.08 -15.56 4.00 3.00 MEG 048
|
||||
049 -1.60 -16.17 4.00 3.00 MEG 049
|
||||
050 2.22 -15.61 4.00 3.00 MEG 050
|
||||
051 5.63 -14.28 4.00 3.00 MEG 051
|
||||
052 8.38 -11.70 4.00 3.00 MEG 052
|
||||
053 9.89 -8.24 4.00 3.00 MEG 053
|
||||
054 10.43 -4.42 4.00 3.00 MEG 054
|
||||
055 10.94 -0.62 4.00 3.00 MEG 055
|
||||
056 10.72 3.35 4.00 3.00 MEG 056
|
||||
057 10.22 7.01 4.00 3.00 MEG 057
|
||||
058 9.04 10.61 4.00 3.00 MEG 058
|
||||
059 6.20 13.42 4.00 3.00 MEG 059
|
||||
060 2.52 15.65 4.00 3.00 MEG 060
|
||||
061 -1.53 18.91 4.00 3.00 MEG 061
|
||||
062 -5.68 18.61 4.00 3.00 MEG 062
|
||||
063 -9.46 16.89 4.00 3.00 MEG 063
|
||||
064 -12.95 14.48 4.00 3.00 MEG 064
|
||||
065 -15.67 11.24 4.00 3.00 MEG 065
|
||||
066 -17.06 7.05 4.00 3.00 MEG 066
|
||||
067 -17.65 3.16 4.00 3.00 MEG 067
|
||||
068 -17.98 -1.20 4.00 3.00 MEG 068
|
||||
069 -17.13 -5.53 4.00 3.00 MEG 069
|
||||
070 -16.60 -9.33 4.00 3.00 MEG 070
|
||||
071 -14.32 -12.91 4.00 3.00 MEG 071
|
||||
072 -11.85 -15.75 4.00 3.00 MEG 072
|
||||
073 -8.78 -17.93 4.00 3.00 MEG 073
|
||||
074 -5.30 -19.40 4.00 3.00 MEG 074
|
||||
075 -1.58 -19.85 4.00 3.00 MEG 075
|
||||
076 2.41 -19.42 4.00 3.00 MEG 076
|
||||
077 5.94 -18.13 4.00 3.00 MEG 077
|
||||
078 9.16 -15.98 4.00 3.00 MEG 078
|
||||
079 11.79 -13.08 4.00 3.00 MEG 079
|
||||
080 13.62 -9.59 4.00 3.00 MEG 080
|
||||
081 14.57 -5.64 4.00 3.00 MEG 081
|
||||
082 15.42 -1.35 4.00 3.00 MEG 082
|
||||
083 15.05 3.30 4.00 3.00 MEG 083
|
||||
084 14.29 7.20 4.00 3.00 MEG 084
|
||||
085 12.81 11.43 4.00 3.00 MEG 085
|
||||
086 9.96 14.67 4.00 3.00 MEG 086
|
||||
087 6.46 17.06 4.00 3.00 MEG 087
|
||||
088 2.60 18.73 4.00 3.00 MEG 088
|
||||
089 -1.60 22.21 4.00 3.00 MEG 089
|
||||
090 -5.83 21.82 4.00 3.00 MEG 090
|
||||
091 -9.75 20.43 4.00 3.00 MEG 091
|
||||
092 -13.45 18.45 4.00 3.00 MEG 092
|
||||
093 -16.67 15.62 4.00 3.00 MEG 093
|
||||
094 -19.33 12.13 4.00 3.00 MEG 094
|
||||
095 -20.94 7.82 4.00 3.00 MEG 095
|
||||
096 -21.81 3.65 4.00 3.00 MEG 096
|
||||
097 -22.23 -1.27 4.00 3.00 MEG 097
|
||||
098 -21.14 -5.87 4.00 3.00 MEG 098
|
||||
099 -20.30 -9.97 4.00 3.00 MEG 099
|
||||
100 -18.46 -13.84 4.00 3.00 MEG 100
|
||||
101 -16.07 -17.08 4.00 3.00 MEG 101
|
||||
102 -12.88 -19.71 4.00 3.00 MEG 102
|
||||
103 -9.34 -21.89 4.00 3.00 MEG 103
|
||||
104 -5.64 -23.02 4.00 3.00 MEG 104
|
||||
105 -1.72 -23.54 4.00 3.00 MEG 105
|
||||
106 2.48 -23.24 4.00 3.00 MEG 106
|
||||
107 6.42 -22.00 4.00 3.00 MEG 107
|
||||
108 9.86 -20.19 4.00 3.00 MEG 108
|
||||
109 13.22 -17.32 4.00 3.00 MEG 109
|
||||
110 15.75 -14.15 4.00 3.00 MEG 110
|
||||
111 17.67 -10.19 4.00 3.00 MEG 111
|
||||
112 18.65 -6.08 4.00 3.00 MEG 112
|
||||
113 19.69 -1.27 4.00 3.00 MEG 113
|
||||
114 19.27 3.70 4.00 3.00 MEG 114
|
||||
115 18.30 8.05 4.00 3.00 MEG 115
|
||||
116 16.46 12.48 4.00 3.00 MEG 116
|
||||
117 13.74 15.93 4.00 3.00 MEG 117
|
||||
118 10.41 18.72 4.00 3.00 MEG 118
|
||||
119 6.64 20.69 4.00 3.00 MEG 119
|
||||
120 2.67 22.02 4.00 3.00 MEG 120
|
||||
121 -1.74 25.41 4.00 3.00 MEG 121
|
||||
122 -6.59 24.84 4.00 3.00 MEG 122
|
||||
123 -11.16 23.37 4.00 3.00 MEG 123
|
||||
124 -15.46 21.07 4.00 3.00 MEG 124
|
||||
125 -19.25 17.84 4.00 3.00 MEG 125
|
||||
126 -22.45 13.89 4.00 3.00 MEG 126
|
||||
127 -24.89 8.96 4.00 3.00 MEG 127
|
||||
128 -26.13 4.36 4.00 3.00 MEG 128
|
||||
129 -26.65 -1.22 4.00 3.00 MEG 129
|
||||
130 -25.30 -6.36 4.00 3.00 MEG 130
|
||||
131 -24.16 -11.45 4.00 3.00 MEG 131
|
||||
132 -21.98 -15.88 4.00 3.00 MEG 132
|
||||
133 -18.81 -19.82 4.00 3.00 MEG 133
|
||||
134 -15.20 -22.99 4.00 3.00 MEG 134
|
||||
135 -11.11 -25.29 4.00 3.00 MEG 135
|
||||
136 -6.51 -26.74 4.00 3.00 MEG 136
|
||||
137 -1.86 -27.28 4.00 3.00 MEG 137
|
||||
138 3.17 -26.90 4.00 3.00 MEG 138
|
||||
139 7.79 -25.55 4.00 3.00 MEG 139
|
||||
140 12.07 -23.15 4.00 3.00 MEG 140
|
||||
141 15.93 -20.09 4.00 3.00 MEG 141
|
||||
142 19.04 -16.25 4.00 3.00 MEG 142
|
||||
143 21.39 -11.67 4.00 3.00 MEG 143
|
||||
144 22.75 -6.58 4.00 3.00 MEG 144
|
||||
145 23.99 -1.23 4.00 3.00 MEG 145
|
||||
146 23.36 4.49 4.00 3.00 MEG 146
|
||||
147 22.02 9.37 4.00 3.00 MEG 147
|
||||
148 19.51 14.31 4.00 3.00 MEG 148
|
||||
149 16.20 18.23 4.00 3.00 MEG 149
|
||||
150 12.16 21.54 4.00 3.00 MEG 150
|
||||
151 7.85 23.69 4.00 3.00 MEG 151
|
||||
152 3.16 25.01 4.00 3.00 MEG 152
|
||||
153 -23.01 18.82 4.00 3.00 MEG 153
|
||||
154 -26.06 15.31 4.00 3.00 MEG 154
|
||||
155 -28.76 10.18 4.00 3.00 MEG 155
|
||||
156 -31.71 3.39 4.00 3.00 MEG 156
|
||||
157 -32.05 -2.89 4.00 3.00 MEG 157
|
||||
158 -31.42 -8.67 4.00 3.00 MEG 158
|
||||
159 -26.22 -15.24 4.00 3.00 MEG 159
|
||||
160 -23.31 -19.72 4.00 3.00 MEG 160
|
||||
161 -19.33 -23.66 4.00 3.00 MEG 161
|
||||
162 -14.75 -26.73 4.00 3.00 MEG 162
|
||||
163 -9.92 -28.91 4.00 3.00 MEG 163
|
||||
164 -4.52 -30.10 4.00 3.00 MEG 164
|
||||
165 1.25 -30.15 4.00 3.00 MEG 165
|
||||
166 6.17 -29.40 4.00 3.00 MEG 166
|
||||
167 11.43 -27.39 4.00 3.00 MEG 167
|
||||
168 16.20 -24.37 4.00 3.00 MEG 168
|
||||
169 20.37 -20.27 4.00 3.00 MEG 169
|
||||
170 23.54 -15.56 4.00 3.00 MEG 170
|
||||
171 28.66 -8.94 4.00 3.00 MEG 171
|
||||
172 29.46 -3.00 4.00 3.00 MEG 172
|
||||
173 29.04 3.51 4.00 3.00 MEG 173
|
||||
174 25.94 10.77 4.00 3.00 MEG 174
|
||||
175 23.08 15.80 4.00 3.00 MEG 175
|
||||
176 19.78 19.54 4.00 3.00 MEG 176
|
||||
177 -26.70 20.52 4.00 3.00 MEG 177
|
||||
178 -29.66 16.81 4.00 3.00 MEG 178
|
||||
179 -32.55 11.68 4.00 3.00 MEG 179
|
||||
180 -32.47 -13.23 4.00 3.00 MEG 180
|
||||
181 -27.63 -19.12 4.00 3.00 MEG 181
|
||||
182 -23.75 -23.89 4.00 3.00 MEG 182
|
||||
183 -18.94 -27.77 4.00 3.00 MEG 183
|
||||
184 -13.64 -30.59 4.00 3.00 MEG 184
|
||||
185 -7.93 -32.70 4.00 3.00 MEG 185
|
||||
186 -2.12 -33.31 4.00 3.00 MEG 186
|
||||
187 4.06 -32.74 4.00 3.00 MEG 187
|
||||
188 10.04 -31.14 4.00 3.00 MEG 188
|
||||
189 15.57 -28.41 4.00 3.00 MEG 189
|
||||
190 20.44 -24.69 4.00 3.00 MEG 190
|
||||
191 24.62 -19.81 4.00 3.00 MEG 191
|
||||
192 29.49 -13.87 4.00 3.00 MEG 192
|
||||
193 29.48 12.54 4.00 3.00 MEG 193
|
||||
194 26.49 17.54 4.00 3.00 MEG 194
|
||||
195 23.28 21.40 4.00 3.00 MEG 195
|
||||
196 -36.84 4.15 4.00 3.00 MEG 196
|
||||
197 -37.22 -3.16 4.00 3.00 MEG 197
|
||||
198 -36.14 -9.68 4.00 3.00 MEG 198
|
||||
199 -28.42 -23.63 4.00 3.00 MEG 199
|
||||
200 -23.68 -28.05 4.00 3.00 MEG 200
|
||||
201 -18.03 -31.89 4.00 3.00 MEG 201
|
||||
202 -11.97 -34.42 4.00 3.00 MEG 202
|
||||
203 -5.32 -35.88 4.00 3.00 MEG 203
|
||||
204 1.03 -36.08 4.00 3.00 MEG 204
|
||||
205 7.92 -35.00 4.00 3.00 MEG 205
|
||||
206 13.99 -32.64 4.00 3.00 MEG 206
|
||||
207 19.78 -29.06 4.00 3.00 MEG 207
|
||||
208 24.79 -24.52 4.00 3.00 MEG 208
|
||||
209 33.39 -10.13 4.00 3.00 MEG 209
|
||||
210 34.62 -3.11 4.00 3.00 MEG 210
|
||||
211 34.23 4.57 4.00 3.00 MEG 211
|
||||
212 -32.38 19.14 4.00 3.00 MEG 212
|
||||
213 -35.90 13.21 4.00 3.00 MEG 213
|
||||
214 -36.70 -14.70 4.00 3.00 MEG 214
|
||||
215 -32.93 -22.44 4.00 3.00 MEG 215
|
||||
216 -28.17 -28.07 4.00 3.00 MEG 216
|
||||
217 -22.65 -32.41 4.00 3.00 MEG 217
|
||||
218 -16.53 -35.71 4.00 3.00 MEG 218
|
||||
219 -9.52 -37.92 4.00 3.00 MEG 219
|
||||
220 -2.58 -38.82 4.00 3.00 MEG 220
|
||||
221 4.65 -38.54 4.00 3.00 MEG 221
|
||||
222 11.78 -36.65 4.00 3.00 MEG 222
|
||||
223 18.43 -33.60 4.00 3.00 MEG 223
|
||||
224 24.26 -29.21 4.00 3.00 MEG 224
|
||||
225 29.52 -23.44 4.00 3.00 MEG 225
|
||||
226 33.73 -15.36 4.00 3.00 MEG 226
|
||||
227 33.02 14.20 4.00 3.00 MEG 227
|
||||
228 29.24 19.93 4.00 3.00 MEG 228
|
||||
229 -36.80 18.24 4.00 3.00 MEG 229
|
||||
230 -40.03 12.76 4.00 3.00 MEG 230
|
||||
231 -41.35 5.03 4.00 3.00 MEG 231
|
||||
232 -41.79 -3.17 4.00 3.00 MEG 232
|
||||
233 -40.48 -10.59 4.00 3.00 MEG 233
|
||||
234 -32.92 -26.79 4.00 3.00 MEG 234
|
||||
235 -27.40 -32.12 4.00 3.00 MEG 235
|
||||
236 -20.92 -36.72 4.00 3.00 MEG 236
|
||||
237 -14.11 -39.49 4.00 3.00 MEG 237
|
||||
238 -6.76 -41.18 4.00 3.00 MEG 238
|
||||
239 1.45 -41.40 4.00 3.00 MEG 239
|
||||
240 8.96 -40.25 4.00 3.00 MEG 240
|
||||
241 16.27 -37.84 4.00 3.00 MEG 241
|
||||
242 22.75 -33.68 4.00 3.00 MEG 242
|
||||
243 29.08 -28.20 4.00 3.00 MEG 243
|
||||
244 37.59 -11.05 4.00 3.00 MEG 244
|
||||
245 39.12 -3.16 4.00 3.00 MEG 245
|
||||
246 38.59 5.47 4.00 3.00 MEG 246
|
||||
247 37.16 13.60 4.00 3.00 MEG 247
|
||||
248 33.62 18.93 4.00 3.00 MEG 248
|
||||
258
mne/channels/data/montages/EGI_256.csd
Normal file
@@ -0,0 +1,258 @@
|
||||
// MatLab Sphere coordinates [degrees] Cartesian coordinates
|
||||
// Label Theta Phi Radius X Y Z off sphere surface
|
||||
E1 37.700 -14.000 1.000 0.7677 0.5934 -0.2419 -0.00000000000000011
|
||||
E2 44.600 -0.880 1.000 0.7119 0.7021 -0.0154 0.00000000000000000
|
||||
E3 51.700 11.000 1.000 0.6084 0.7704 0.1908 0.00000000000000000
|
||||
E4 58.200 21.800 1.000 0.4893 0.7891 0.3714 -0.00000000000000011
|
||||
E5 64.200 33.600 1.000 0.3625 0.7499 0.5534 0.00000000000000000
|
||||
E6 70.800 45.500 1.000 0.2305 0.6619 0.7133 -0.00000000000000022
|
||||
E7 77.200 56.700 1.000 0.1216 0.5354 0.8358 0.00000000000000000
|
||||
E8 90.000 67.700 1.000 0.0000 0.3795 0.9252 0.00000000000000000
|
||||
E9 127.300 78.300 1.000 -0.1229 0.1613 0.9792 0.00000000000000000
|
||||
E10 51.200 -9.080 1.000 0.6188 0.7696 -0.1578 0.00000000000000000
|
||||
E11 58.800 2.370 1.000 0.5176 0.8546 0.0414 0.00000000000000000
|
||||
E12 66.800 14.300 1.000 0.3817 0.8907 0.2470 -0.00000000000000011
|
||||
E13 73.800 25.200 1.000 0.2524 0.8689 0.4258 0.00000000000000022
|
||||
E14 81.360 36.400 1.000 0.1209 0.7958 0.5934 0.00000000000000022
|
||||
E15 90.000 46.900 1.000 0.0000 0.6833 0.7302 0.00000000000000000
|
||||
E16 102.800 56.700 1.000 -0.1216 0.5354 0.8358 0.00000000000000000
|
||||
E17 128.200 66.600 1.000 -0.2456 0.3121 0.9178 -0.00000000000000011
|
||||
E18 66.600 -4.970 1.000 0.3957 0.9143 -0.0866 -0.00000000000000011
|
||||
E19 74.000 4.680 1.000 0.2747 0.9581 0.0816 -0.00000000000000011
|
||||
E20 81.960 15.700 1.000 0.1346 0.9532 0.2706 0.00000000000000022
|
||||
E21 90.000 26.400 1.000 0.0000 0.8957 0.4446 0.00000000000000000
|
||||
E22 98.640 36.400 1.000 -0.1209 0.7958 0.5934 0.00000000000000022
|
||||
E23 109.200 45.500 1.000 -0.2305 0.6619 0.7133 0.00000000000000000
|
||||
E24 127.200 54.200 1.000 -0.3537 0.4659 0.8111 0.00000000000000000
|
||||
E25 82.540 -3.260 1.000 0.1296 0.9899 -0.0569 0.00000000000000000
|
||||
E26 90.000 5.370 1.000 0.0000 0.9956 0.0936 0.00000000000000000
|
||||
E27 98.040 15.700 1.000 -0.1346 0.9532 0.2706 0.00000000000000022
|
||||
E28 106.200 25.200 1.000 -0.2524 0.8689 0.4258 0.00000000000000022
|
||||
E29 115.800 33.600 1.000 -0.3625 0.7499 0.5534 0.00000000000000000
|
||||
E30 128.800 41.200 1.000 -0.4715 0.5864 0.6587 0.00000000000000000
|
||||
E31 90.000 -11.000 1.000 0.0000 0.9816 -0.1908 0.00000000000000000
|
||||
E32 97.460 -3.260 1.000 -0.1296 0.9899 -0.0569 0.00000000000000000
|
||||
E33 106.000 4.680 1.000 -0.2747 0.9581 0.0816 -0.00000000000000011
|
||||
E34 113.200 14.300 1.000 -0.3817 0.8907 0.2470 -0.00000000000000022
|
||||
E35 121.800 21.800 1.000 -0.4893 0.7891 0.3714 -0.00000000000000011
|
||||
E36 128.500 30.200 1.000 -0.5380 0.6764 0.5030 0.00000000000000022
|
||||
E37 113.400 -4.970 1.000 -0.3957 0.9143 -0.0866 0.00000000000000000
|
||||
E38 121.200 2.370 1.000 -0.5176 0.8546 0.0414 0.00000000000000000
|
||||
E39 128.300 11.000 1.000 -0.6084 0.7704 0.1908 0.00000000000000000
|
||||
E40 135.300 20.800 1.000 -0.6645 0.6576 0.3551 0.00000000000000000
|
||||
E41 140.600 32.000 1.000 -0.6553 0.5383 0.5299 0.00000000000000000
|
||||
E42 144.500 44.000 1.000 -0.5856 0.4177 0.6947 0.00000000000000000
|
||||
E43 151.000 54.800 1.000 -0.5042 0.2795 0.8171 0.00000000000000000
|
||||
E44 163.200 66.400 1.000 -0.3833 0.1157 0.9164 0.00000000000000000
|
||||
E45 197.000 77.300 1.000 -0.2102 -0.0643 0.9755 0.00000000000000000
|
||||
E46 128.800 -9.080 1.000 -0.6188 0.7696 -0.1578 0.00000000000000000
|
||||
E47 135.400 -0.880 1.000 -0.7119 0.7021 -0.0154 -0.00000000000000011
|
||||
E48 142.500 8.460 1.000 -0.7847 0.6021 0.1471 0.00000000000000000
|
||||
E49 149.200 19.400 1.000 -0.8102 0.4830 0.3322 0.00000000000000000
|
||||
E50 155.300 32.200 1.000 -0.7688 0.3536 0.5329 0.00000000000000000
|
||||
E51 162.400 44.200 1.000 -0.6834 0.2168 0.6972 0.00000000000000000
|
||||
E52 173.500 54.500 1.000 -0.5770 0.0657 0.8141 0.00000000000000000
|
||||
E53 197.000 65.600 1.000 -0.3951 -0.1208 0.9107 0.00000000000000000
|
||||
E54 142.300 -14.000 1.000 -0.7677 0.5934 -0.2419 0.00000000000000000
|
||||
E55 149.100 -4.100 1.000 -0.8559 0.5122 -0.0715 0.00000000000000000
|
||||
E56 156.700 7.130 1.000 -0.9113 0.3925 0.1241 0.00000000000000022
|
||||
E57 163.200 19.500 1.000 -0.9024 0.2725 0.3338 0.00000000000000000
|
||||
E58 169.700 31.600 1.000 -0.8380 0.1523 0.5240 0.00000000000000000
|
||||
E59 179.500 43.000 1.000 -0.7313 0.0064 0.6820 0.00000000000000000
|
||||
E60 197.000 53.000 1.000 -0.5755 -0.1760 0.7986 0.00000000000000000
|
||||
E61 158.000 -17.200 1.000 -0.8857 0.3579 -0.2957 -0.00000000000000022
|
||||
E62 165.100 -5.730 1.000 -0.9615 0.2558 -0.0998 0.00000000000000022
|
||||
E63 171.400 6.890 1.000 -0.9816 0.1485 0.1200 0.00000000000000022
|
||||
E64 177.200 19.000 1.000 -0.9444 0.0462 0.3256 0.00000000000000000
|
||||
E65 184.300 31.100 1.000 -0.8539 -0.0642 0.5165 0.00000000000000000
|
||||
E66 196.000 39.900 1.000 -0.7374 -0.2115 0.6414 0.00000000000000000
|
||||
E67 167.300 -27.900 1.000 -0.8621 0.1943 -0.4679 0.00000000000000000
|
||||
E68 172.300 -17.500 1.000 -0.9451 0.1278 -0.3007 0.00000000000000000
|
||||
E69 179.500 -6.970 1.000 -0.9926 0.0087 -0.1213 0.00000000000000000
|
||||
E70 185.400 5.990 1.000 -0.9901 -0.0936 0.1044 0.00000000000000022
|
||||
E71 191.000 18.700 1.000 -0.9298 -0.1807 0.3206 0.00000000000000000
|
||||
E72 197.000 28.500 1.000 -0.8404 -0.2569 0.4772 0.00000000000000000
|
||||
E73 174.500 -38.200 1.000 -0.7822 0.0753 -0.6184 0.00000000000000022
|
||||
E74 193.000 -6.630 1.000 -0.9679 -0.2234 -0.1155 0.00000000000000000
|
||||
E75 199.000 7.590 1.000 -0.9372 -0.3227 0.1321 0.00000000000000000
|
||||
E76 205.000 19.800 1.000 -0.8527 -0.3976 0.3387 -0.00000000000000011
|
||||
E77 209.000 31.900 1.000 -0.7425 -0.4116 0.5284 0.00000000000000000
|
||||
E78 214.000 43.600 1.000 -0.6004 -0.4050 0.6896 0.00000000000000000
|
||||
E79 221.000 55.600 1.000 -0.4264 -0.3707 0.8251 -0.00000000000000011
|
||||
E80 233.000 67.400 1.000 -0.2313 -0.3069 0.9232 0.00000000000000000
|
||||
E81 -90.000 78.400 1.000 0.0000 -0.2011 0.9796 -0.00000000000000011
|
||||
E82 183.900 -45.800 1.000 -0.6956 -0.0474 -0.7169 0.00000000000000000
|
||||
E83 205.000 -15.000 1.000 -0.8754 -0.4082 -0.2588 0.00000000000000000
|
||||
E84 206.000 -3.510 1.000 -0.8971 -0.4375 -0.0612 -0.00000000000000022
|
||||
E85 213.000 10.000 1.000 -0.8259 -0.5364 0.1736 -0.00000000000000011
|
||||
E86 218.000 22.700 1.000 -0.7270 -0.5680 0.3859 0.00000000000000000
|
||||
E87 225.000 35.300 1.000 -0.5771 -0.5771 0.5779 0.00000000000000000
|
||||
E88 232.000 46.800 1.000 -0.4214 -0.5394 0.7290 -0.00000000000000011
|
||||
E89 245.000 56.900 1.000 -0.2308 -0.4949 0.8377 -0.00000000000000011
|
||||
E90 -90.000 67.500 1.000 0.0000 -0.3827 0.9239 0.00000000000000000
|
||||
E91 195.000 -50.900 1.000 -0.6092 -0.1632 -0.7760 0.00000000000000000
|
||||
E92 203.000 -42.700 1.000 -0.6765 -0.2872 -0.6782 -0.00000000000000022
|
||||
E93 211.000 -32.500 1.000 -0.7229 -0.4344 -0.5373 0.00000000000000000
|
||||
E94 212.000 -23.100 1.000 -0.7801 -0.4874 -0.3923 0.00000000000000000
|
||||
E95 216.000 -12.400 1.000 -0.7901 -0.5741 -0.2147 0.00000000000000000
|
||||
E96 221.000 0.666 1.000 -0.7547 -0.6560 0.0116 0.00000000000000000
|
||||
E97 228.000 12.900 1.000 -0.6522 -0.7244 0.2233 0.00000000000000022
|
||||
E98 233.000 24.900 1.000 -0.5459 -0.7244 0.4210 0.00000000000000000
|
||||
E99 241.000 36.400 1.000 -0.3902 -0.7040 0.5934 0.00000000000000000
|
||||
E100 251.000 46.900 1.000 -0.2225 -0.6460 0.7302 0.00000000000000000
|
||||
E101 -90.000 44.200 1.000 0.0000 -0.7169 0.6972 0.00000000000000000
|
||||
E102 211.000 -47.800 1.000 -0.5758 -0.3460 -0.7408 0.00000000000000000
|
||||
E103 217.000 -39.900 1.000 -0.6127 -0.4617 -0.6414 0.00000000000000000
|
||||
E104 223.000 -29.500 1.000 -0.6365 -0.5936 -0.4924 0.00000000000000000
|
||||
E105 224.000 -20.500 1.000 -0.6738 -0.6507 -0.3502 0.00000000000000000
|
||||
E106 228.000 -8.840 1.000 -0.6612 -0.7343 -0.1537 0.00000000000000022
|
||||
E107 235.000 2.900 1.000 -0.5728 -0.8181 0.0506 0.00000000000000000
|
||||
E108 242.000 14.600 1.000 -0.4543 -0.8544 0.2521 0.00000000000000000
|
||||
E109 248.000 25.700 1.000 -0.3375 -0.8355 0.4337 -0.00000000000000011
|
||||
E110 257.000 36.000 1.000 -0.1820 -0.7883 0.5878 0.00000000000000000
|
||||
E111 226.000 -43.800 1.000 -0.5014 -0.5192 -0.6921 0.00000000000000000
|
||||
E112 230.000 -36.300 1.000 -0.5180 -0.6174 -0.5920 0.00000000000000000
|
||||
E113 235.000 -25.900 1.000 -0.5160 -0.7369 -0.4368 -0.00000000000000022
|
||||
E114 235.000 -17.500 1.000 -0.5470 -0.7812 -0.3007 0.00000000000000000
|
||||
E115 244.000 -6.240 1.000 -0.4358 -0.8935 -0.1087 0.00000000000000000
|
||||
E116 251.000 4.850 1.000 -0.3244 -0.9421 0.0845 0.00000000000000000
|
||||
E117 258.000 15.500 1.000 -0.2004 -0.9426 0.2672 0.00000000000000000
|
||||
E118 263.000 25.200 1.000 -0.1103 -0.8981 0.4258 0.00000000000000000
|
||||
E119 -90.000 33.400 1.000 0.0000 -0.8348 0.5505 -0.00000000000000011
|
||||
E120 237.000 -41.100 1.000 -0.4104 -0.6320 -0.6574 0.00000000000000022
|
||||
E121 242.000 -33.400 1.000 -0.3919 -0.7371 -0.5505 -0.00000000000000022
|
||||
E122 247.000 -23.400 1.000 -0.3586 -0.8448 -0.3971 0.00000000000000000
|
||||
E123 252.000 -11.200 1.000 -0.3031 -0.9329 -0.1942 0.00000000000000000
|
||||
E124 257.000 -3.660 1.000 -0.2245 -0.9724 -0.0638 0.00000000000000022
|
||||
E125 264.000 5.580 1.000 -0.1040 -0.9898 0.0972 0.00000000000000000
|
||||
E126 -90.000 15.400 1.000 0.0000 -0.9641 0.2656 0.00000000000000000
|
||||
E127 -83.000 25.200 1.000 0.1103 -0.8981 0.4258 0.00000000000000000
|
||||
E128 -77.000 36.000 1.000 0.1820 -0.7883 0.5878 0.00000000000000000
|
||||
E129 -71.000 46.900 1.000 0.2225 -0.6460 0.7302 0.00000000000000000
|
||||
E130 -65.000 56.900 1.000 0.2308 -0.4949 0.8377 -0.00000000000000011
|
||||
E131 -53.000 67.400 1.000 0.2313 -0.3069 0.9232 0.00000000000000000
|
||||
E132 -17.000 77.300 1.000 0.2102 -0.0643 0.9755 0.00000000000000000
|
||||
E133 248.000 -36.400 1.000 -0.3015 -0.7463 -0.5934 0.00000000000000022
|
||||
E134 253.000 -30.700 1.000 -0.2514 -0.8223 -0.5105 -0.00000000000000011
|
||||
E135 258.000 -19.400 1.000 -0.1961 -0.9226 -0.3322 -0.00000000000000011
|
||||
E136 265.000 -12.900 1.000 -0.0850 -0.9711 -0.2233 0.00000000000000000
|
||||
E137 -90.000 -5.280 1.000 0.0000 -0.9958 -0.0920 0.00000000000000000
|
||||
E138 -84.000 5.580 1.000 0.1040 -0.9898 0.0972 -0.00000000000000022
|
||||
E139 -78.000 15.500 1.000 0.2004 -0.9426 0.2672 -0.00000000000000011
|
||||
E140 -68.000 25.700 1.000 0.3375 -0.8355 0.4337 -0.00000000000000011
|
||||
E141 -61.000 36.400 1.000 0.3902 -0.7040 0.5934 0.00000000000000000
|
||||
E142 -52.000 46.800 1.000 0.4214 -0.5394 0.7290 0.00000000000000000
|
||||
E143 -41.000 55.600 1.000 0.4264 -0.3707 0.8251 0.00000000000000000
|
||||
E144 -17.000 65.600 1.000 0.3951 -0.1208 0.9107 0.00000000000000000
|
||||
E145 258.000 -35.800 1.000 -0.1686 -0.7933 -0.5850 0.00000000000000000
|
||||
E146 264.000 -29.600 1.000 -0.0909 -0.8647 -0.4939 0.00000000000000000
|
||||
E147 -90.000 -22.100 1.000 0.0000 -0.9265 -0.3762 0.00000000000000000
|
||||
E148 -85.000 -12.900 1.000 0.0850 -0.9711 -0.2233 0.00000000000000000
|
||||
E149 -77.000 -3.660 1.000 0.2245 -0.9724 -0.0638 0.00000000000000022
|
||||
E150 -71.000 4.850 1.000 0.3244 -0.9421 0.0845 -0.00000000000000022
|
||||
E151 -62.000 14.600 1.000 0.4543 -0.8544 0.2521 0.00000000000000000
|
||||
E152 -53.000 24.900 1.000 0.5459 -0.7244 0.4210 0.00000000000000000
|
||||
E153 -45.000 35.300 1.000 0.5771 -0.5771 0.5779 0.00000000000000000
|
||||
E154 -34.000 43.600 1.000 0.6004 -0.4050 0.6896 0.00000000000000000
|
||||
E155 -17.000 53.000 1.000 0.5755 -0.1760 0.7986 0.00000000000000000
|
||||
E156 -84.000 -29.600 1.000 0.0909 -0.8647 -0.4939 -0.00000000000000011
|
||||
E157 -78.000 -19.400 1.000 0.1961 -0.9226 -0.3322 -0.00000000000000022
|
||||
E158 -72.000 -11.200 1.000 0.3031 -0.9329 -0.1942 0.00000000000000000
|
||||
E159 -64.000 -6.240 1.000 0.4358 -0.8935 -0.1087 0.00000000000000022
|
||||
E160 -55.000 2.900 1.000 0.5728 -0.8181 0.0506 0.00000000000000022
|
||||
E161 -48.000 12.900 1.000 0.6522 -0.7244 0.2233 0.00000000000000000
|
||||
E162 -38.000 22.700 1.000 0.7270 -0.5680 0.3859 0.00000000000000000
|
||||
E163 -29.000 31.900 1.000 0.7425 -0.4116 0.5284 0.00000000000000000
|
||||
E164 -16.000 39.900 1.000 0.7374 -0.2115 0.6414 0.00000000000000000
|
||||
E165 -78.000 -35.800 1.000 0.1686 -0.7933 -0.5850 0.00000000000000000
|
||||
E166 -73.000 -30.700 1.000 0.2514 -0.8223 -0.5105 0.00000000000000000
|
||||
E167 -67.000 -23.400 1.000 0.3586 -0.8448 -0.3971 0.00000000000000000
|
||||
E168 -55.000 -17.500 1.000 0.5470 -0.7812 -0.3007 0.00000000000000000
|
||||
E169 -48.000 -8.840 1.000 0.6612 -0.7343 -0.1537 0.00000000000000022
|
||||
E170 -41.000 0.666 1.000 0.7547 -0.6560 0.0116 0.00000000000000000
|
||||
E171 -33.000 10.000 1.000 0.8259 -0.5364 0.1736 -0.00000000000000011
|
||||
E172 -25.000 19.800 1.000 0.8527 -0.3976 0.3387 -0.00000000000000022
|
||||
E173 -17.000 28.500 1.000 0.8404 -0.2569 0.4772 0.00000000000000000
|
||||
E174 -68.000 -36.400 1.000 0.3015 -0.7463 -0.5934 0.00000000000000000
|
||||
E175 -62.000 -33.400 1.000 0.3919 -0.7371 -0.5505 -0.00000000000000011
|
||||
E176 -55.000 -25.900 1.000 0.5160 -0.7369 -0.4368 -0.00000000000000022
|
||||
E177 -44.000 -20.500 1.000 0.6738 -0.6507 -0.3502 0.00000000000000000
|
||||
E178 -36.000 -12.400 1.000 0.7901 -0.5741 -0.2147 0.00000000000000000
|
||||
E179 -26.000 -3.510 1.000 0.8971 -0.4375 -0.0612 -0.00000000000000011
|
||||
E180 -19.000 7.590 1.000 0.9372 -0.3227 0.1321 0.00000000000000022
|
||||
E181 -11.000 18.700 1.000 0.9298 -0.1807 0.3206 0.00000000000000022
|
||||
E182 -4.300 31.100 1.000 0.8539 -0.0642 0.5165 0.00000000000000000
|
||||
E183 0.500 43.000 1.000 0.7313 0.0064 0.6820 0.00000000000000000
|
||||
E184 6.500 54.500 1.000 0.5770 0.0657 0.8141 0.00000000000000000
|
||||
E185 16.800 66.400 1.000 0.3833 0.1157 0.9164 0.00000000000000000
|
||||
E186 52.700 78.300 1.000 0.1229 0.1613 0.9792 0.00000000000000000
|
||||
E187 -57.000 -41.100 1.000 0.4104 -0.6320 -0.6574 0.00000000000000022
|
||||
E188 -50.000 -36.300 1.000 0.5180 -0.6174 -0.5920 -0.00000000000000022
|
||||
E189 -43.000 -29.500 1.000 0.6365 -0.5936 -0.4924 0.00000000000000000
|
||||
E190 -32.000 -23.100 1.000 0.7801 -0.4874 -0.3923 0.00000000000000000
|
||||
E191 -25.000 -15.000 1.000 0.8754 -0.4082 -0.2588 0.00000000000000000
|
||||
E192 -13.000 -6.630 1.000 0.9679 -0.2234 -0.1155 0.00000000000000000
|
||||
E193 -5.400 5.990 1.000 0.9901 -0.0936 0.1044 0.00000000000000022
|
||||
E194 2.800 19.000 1.000 0.9444 0.0462 0.3256 0.00000000000000022
|
||||
E195 10.300 31.600 1.000 0.8380 0.1523 0.5240 0.00000000000000000
|
||||
E196 17.600 44.200 1.000 0.6834 0.2168 0.6972 0.00000000000000000
|
||||
E197 29.000 54.800 1.000 0.5042 0.2795 0.8171 0.00000000000000000
|
||||
E198 51.800 66.600 1.000 0.2456 0.3121 0.9178 0.00000000000000000
|
||||
E199 -46.000 -43.800 1.000 0.5014 -0.5192 -0.6921 0.00000000000000000
|
||||
E200 -37.000 -39.900 1.000 0.6127 -0.4617 -0.6414 0.00000000000000000
|
||||
E201 -31.000 -32.500 1.000 0.7229 -0.4344 -0.5373 0.00000000000000000
|
||||
E202 0.500 -6.970 1.000 0.9926 0.0087 -0.1213 0.00000000000000000
|
||||
E203 8.600 6.890 1.000 0.9816 0.1485 0.1200 0.00000000000000044
|
||||
E204 16.800 19.500 1.000 0.9024 0.2725 0.3338 0.00000000000000000
|
||||
E205 24.700 32.200 1.000 0.7688 0.3536 0.5329 0.00000000000000000
|
||||
E206 35.500 44.000 1.000 0.5856 0.4177 0.6947 0.00000000000000000
|
||||
E207 52.800 54.200 1.000 0.3537 0.4659 0.8111 0.00000000000000000
|
||||
E208 -31.000 -47.800 1.000 0.5758 -0.3460 -0.7408 0.00000000000000000
|
||||
E209 -23.000 -42.700 1.000 0.6765 -0.2872 -0.6782 0.00000000000000000
|
||||
E210 7.700 -17.500 1.000 0.9451 0.1278 -0.3007 0.00000000000000000
|
||||
E211 14.900 -5.730 1.000 0.9615 0.2558 -0.0998 -0.00000000000000011
|
||||
E212 23.300 7.130 1.000 0.9113 0.3925 0.1241 0.00000000000000022
|
||||
E213 30.800 19.400 1.000 0.8102 0.4830 0.3322 0.00000000000000000
|
||||
E214 39.400 32.000 1.000 0.6553 0.5383 0.5299 0.00000000000000000
|
||||
E215 51.200 41.200 1.000 0.4715 0.5864 0.6587 0.00000000000000000
|
||||
E216 -15.000 -50.900 1.000 0.6092 -0.1632 -0.7760 0.00000000000000000
|
||||
E217 -3.900 -45.800 1.000 0.6956 -0.0474 -0.7169 0.00000000000000000
|
||||
E218 5.500 -38.200 1.000 0.7822 0.0753 -0.6184 0.00000000000000022
|
||||
E219 12.700 -27.900 1.000 0.8621 0.1943 -0.4679 0.00000000000000000
|
||||
E220 22.000 -17.200 1.000 0.8857 0.3579 -0.2957 -0.00000000000000022
|
||||
E221 30.900 -4.100 1.000 0.8559 0.5122 -0.0715 0.00000000000000000
|
||||
E222 37.500 8.460 1.000 0.7847 0.6021 0.1471 0.00000000000000000
|
||||
E223 44.700 20.800 1.000 0.6645 0.6576 0.3551 0.00000000000000000
|
||||
E224 51.500 30.200 1.000 0.5380 0.6764 0.5030 0.00000000000000000
|
||||
E225 23.100 -28.000 1.000 0.8122 0.3464 -0.4695 0.00000000000000000
|
||||
E226 33.500 -28.800 1.000 0.7307 0.4837 -0.4818 0.00000000000000000
|
||||
E227 18.500 -38.200 1.000 0.7452 0.2494 -0.6184 0.00000000000000000
|
||||
E228 10.400 -46.300 1.000 0.6795 0.1247 -0.7230 0.00000000000000000
|
||||
E229 -1.200 -53.100 1.000 0.6003 -0.0126 -0.7997 0.00000000000000000
|
||||
E230 41.600 -32.900 1.000 0.6279 0.5574 -0.5432 0.00000000000000000
|
||||
E231 29.900 -39.600 1.000 0.6680 0.3841 -0.6374 0.00000000000000000
|
||||
E232 23.600 -46.600 1.000 0.6296 0.2751 -0.7266 0.00000000000000000
|
||||
E233 13.200 -53.300 1.000 0.5818 0.1365 -0.8018 0.00000000000000022
|
||||
E234 50.800 -35.100 1.000 0.5171 0.6340 -0.5750 -0.00000000000000011
|
||||
E235 40.300 -41.300 1.000 0.5730 0.4859 -0.6600 0.00000000000000022
|
||||
E236 34.400 -47.800 1.000 0.5542 0.3795 -0.7408 0.00000000000000000
|
||||
E237 26.900 -54.600 1.000 0.5166 0.2621 -0.8151 0.00000000000000000
|
||||
E238 60.300 -35.600 1.000 0.4029 0.7063 -0.5821 0.00000000000000022
|
||||
E239 47.800 -45.000 1.000 0.4750 0.5238 -0.7071 -0.00000000000000011
|
||||
E240 41.600 -50.500 1.000 0.4757 0.4223 -0.7716 0.00000000000000000
|
||||
E241 119.700 -35.600 1.000 -0.4029 0.7063 -0.5821 0.00000000000000000
|
||||
E242 132.200 -45.000 1.000 -0.4750 0.5238 -0.7071 -0.00000000000000011
|
||||
E243 138.400 -50.500 1.000 -0.4757 0.4223 -0.7716 0.00000000000000000
|
||||
E244 129.200 -35.100 1.000 -0.5171 0.6340 -0.5750 -0.00000000000000011
|
||||
E245 139.700 -41.300 1.000 -0.5730 0.4859 -0.6600 0.00000000000000000
|
||||
E246 145.600 -47.800 1.000 -0.5542 0.3795 -0.7408 -0.00000000000000011
|
||||
E247 153.100 -54.600 1.000 -0.5166 0.2621 -0.8151 0.00000000000000000
|
||||
E248 138.400 -32.900 1.000 -0.6279 0.5574 -0.5432 -0.00000000000000022
|
||||
E249 150.100 -39.600 1.000 -0.6680 0.3841 -0.6374 0.00000000000000000
|
||||
E250 156.400 -46.600 1.000 -0.6296 0.2751 -0.7266 -0.00000000000000011
|
||||
E251 166.800 -53.300 1.000 -0.5818 0.1365 -0.8018 0.00000000000000022
|
||||
E252 146.500 -28.800 1.000 -0.7307 0.4837 -0.4818 0.00000000000000000
|
||||
E253 156.900 -28.000 1.000 -0.8122 0.3464 -0.4695 0.00000000000000000
|
||||
E254 161.500 -38.200 1.000 -0.7452 0.2494 -0.6184 0.00000000000000000
|
||||
E255 169.600 -46.300 1.000 -0.6795 0.1247 -0.7230 0.00000000000000000
|
||||
E256 181.200 -53.100 1.000 -0.6003 -0.0126 -0.7997 0.00000000000000000
|
||||
131
mne/channels/data/montages/GSN-HydroCel-128.sfp
Normal file
@@ -0,0 +1,131 @@
|
||||
FidNz 0 9.071585155 -2.359754454
|
||||
FidT9 -6.711765 0.040402876 -3.251600355
|
||||
FidT10 6.711765 0.040402876 -3.251600355
|
||||
E1 5.787677636 5.520863216 -2.577468644
|
||||
E2 5.291804727 6.709097557 0.307434896
|
||||
E3 3.864122447 7.63424051 3.067770143
|
||||
E4 2.868837559 7.145708546 4.989564557
|
||||
E5 1.479340453 5.68662139 6.812878187
|
||||
E6 0 3.806770224 7.891304964
|
||||
E7 -1.223800252 1.558864431 8.44043914
|
||||
E8 4.221901505 7.998817387 -1.354789681
|
||||
E9 2.695405558 8.884820317 1.088308144
|
||||
E10 1.830882336 8.708839134 3.18709115
|
||||
E11 0 7.96264703 5.044718001
|
||||
E12 -1.479340453 5.68662139 6.812878187
|
||||
E13 -2.435870762 3.254307219 7.608766206
|
||||
E14 1.270447661 9.479016328 -0.947183306
|
||||
E15 0 9.087440894 1.333345013
|
||||
E16 0 9.076490798 3.105438474
|
||||
E17 0 9.271139705 -2.211516434
|
||||
E18 -1.830882336 8.708839134 3.18709115
|
||||
E19 -2.868837559 7.145708546 4.989564557
|
||||
E20 -3.825797111 5.121648995 5.942844877
|
||||
E21 -1.270447661 9.479016328 -0.947183306
|
||||
E22 -2.695405558 8.884820317 1.088308144
|
||||
E23 -3.864122447 7.63424051 3.067770143
|
||||
E24 -4.459387187 6.021159964 4.365321482
|
||||
E25 -4.221901505 7.998817387 -1.354789681
|
||||
E26 -5.291804727 6.709097557 0.307434896
|
||||
E27 -5.682547954 5.453384344 2.836565436
|
||||
E28 -5.546670402 4.157847823 4.627615703
|
||||
E29 -4.762196763 2.697832099 6.297663028
|
||||
E30 -3.695490968 0.960411022 7.627828134
|
||||
E31 -1.955187826 -0.684381878 8.564858511
|
||||
E32 -5.787677636 5.520863216 -2.577468644
|
||||
E33 -6.399087198 4.127248875 -0.356852241
|
||||
E34 -6.823959684 2.968422112 2.430080351
|
||||
E35 -6.414469893 1.490027747 4.741794544
|
||||
E36 -5.47913021 0.284948655 6.38332782
|
||||
E37 -3.909902609 -1.519049882 7.764134929
|
||||
E38 -6.550732888 3.611543152 -3.353155926
|
||||
E39 -7.191620108 0.850096251 -0.882936903
|
||||
E40 -7.391919265 0.032151584 2.143634599
|
||||
E41 -6.905051715 -0.800953972 4.600056501
|
||||
E42 -5.956055073 -2.338984312 6.00361353
|
||||
E43 -6.518995129 2.417299399 -5.253637073
|
||||
E44 -6.840717711 1.278489412 -3.5553823
|
||||
E45 -7.304625099 -1.866238006 -0.629182006
|
||||
E46 -7.312517928 -2.298574078 2.385298838
|
||||
E47 -6.737313764 -3.011819533 4.178390203
|
||||
E48 -5.934584124 2.22697797 -7.934360742
|
||||
E49 -6.298127313 0.41663451 -6.069156425
|
||||
E50 -6.78248072 -4.023512045 -0.232191092
|
||||
E51 -6.558030032 -4.667036048 2.749989597
|
||||
E52 -5.831241498 -4.494821698 4.955347697
|
||||
E53 -4.193518856 -4.037020083 6.982920038
|
||||
E54 -2.270752074 -3.414835627 8.204556551
|
||||
E55 0 -2.138343513 8.791875902
|
||||
E56 -6.174969392 -2.458138877 -5.637380998
|
||||
E57 -6.580438308 -3.739554155 -2.991084431
|
||||
E58 -6.034746843 -5.755782196 0.051843011
|
||||
E59 -5.204501802 -6.437833018 2.984444293
|
||||
E60 -4.116929504 -6.061561438 5.365757296
|
||||
E61 -2.344914884 -5.481057427 7.057748614
|
||||
E62 0 -6.676694032 6.465208258
|
||||
E63 -5.333266171 -4.302240169 -5.613509789
|
||||
E64 -5.404091392 -5.870302681 -2.891640039
|
||||
E65 -4.645302298 -7.280552408 0.130139701
|
||||
E66 -3.608293164 -7.665487704 3.129931648
|
||||
E67 -1.844644417 -7.354417376 5.224001733
|
||||
E68 -3.784983913 -6.401014415 -5.260040689
|
||||
E69 -3.528848027 -7.603010836 -2.818037873
|
||||
E70 -2.738838019 -8.607966849 0.239368223
|
||||
E71 -1.404967401 -8.437486994 3.277284901
|
||||
E72 0 -7.829896826 4.687622229
|
||||
E73 -1.929652202 -7.497197868 -5.136777648
|
||||
E74 -1.125731192 -8.455208629 -2.632832329
|
||||
E75 0 -8.996686498 0.487952047
|
||||
E76 1.404967401 -8.437486994 3.277284901
|
||||
E77 1.844644417 -7.354417376 5.224001733
|
||||
E78 2.344914884 -5.481057427 7.057748614
|
||||
E79 2.270752074 -3.414835627 8.204556551
|
||||
E80 1.955187826 -0.684381878 8.564858511
|
||||
E81 0 -7.85891896 -4.945387489
|
||||
E82 1.125731192 -8.455208629 -2.632832329
|
||||
E83 2.738838019 -8.607966849 0.239368223
|
||||
E84 3.608293164 -7.665487704 3.129931648
|
||||
E85 4.116929504 -6.061561438 5.365757296
|
||||
E86 4.193518856 -4.037020083 6.982920038
|
||||
E87 3.909902609 -1.519049882 7.764134929
|
||||
E88 1.929652202 -7.497197868 -5.136777648
|
||||
E89 3.528848027 -7.603010836 -2.818037873
|
||||
E90 4.645302298 -7.280552408 0.130139701
|
||||
E91 5.204501802 -6.437833018 2.984444293
|
||||
E92 5.831241498 -4.494821698 4.955347697
|
||||
E93 5.956055073 -2.338984312 6.00361353
|
||||
E94 3.784983913 -6.401014415 -5.260040689
|
||||
E95 5.404091392 -5.870302681 -2.891640039
|
||||
E96 6.034746843 -5.755782196 0.051843011
|
||||
E97 6.558030032 -4.667036048 2.749989597
|
||||
E98 6.737313764 -3.011819533 4.178390203
|
||||
E99 5.333266171 -4.302240169 -5.613509789
|
||||
E100 6.580438308 -3.739554155 -2.991084431
|
||||
E101 6.78248072 -4.023512045 -0.232191092
|
||||
E102 7.312517928 -2.298574078 2.385298838
|
||||
E103 6.905051715 -0.800953972 4.600056501
|
||||
E104 5.47913021 0.284948655 6.38332782
|
||||
E105 3.695490968 0.960411022 7.627828134
|
||||
E106 1.223800252 1.558864431 8.44043914
|
||||
E107 6.174969392 -2.458138877 -5.637380998
|
||||
E108 7.304625099 -1.866238006 -0.629182006
|
||||
E109 7.391919265 0.032151584 2.143634599
|
||||
E110 6.414469893 1.490027747 4.741794544
|
||||
E111 4.762196763 2.697832099 6.297663028
|
||||
E112 2.435870762 3.254307219 7.608766206
|
||||
E113 6.298127313 0.41663451 -6.069156425
|
||||
E114 6.840717711 1.278489412 -3.5553823
|
||||
E115 7.191620108 0.850096251 -0.882936903
|
||||
E116 6.823959684 2.968422112 2.430080351
|
||||
E117 5.546670402 4.157847823 4.627615703
|
||||
E118 3.825797111 5.121648995 5.942844877
|
||||
E119 5.934584124 2.22697797 -7.934360742
|
||||
E120 6.518995129 2.417299399 -5.253637073
|
||||
E121 6.550732888 3.611543152 -3.353155926
|
||||
E122 6.399087198 4.127248875 -0.356852241
|
||||
E123 5.682547954 5.453384344 2.836565436
|
||||
E124 4.459387187 6.021159964 4.365321482
|
||||
E125 6.118458137 4.523870113 -4.409174427
|
||||
E126 3.743504949 6.649204911 -6.530243068
|
||||
E127 -3.743504949 6.649204911 -6.530243068
|
||||
E128 -6.118458137 4.523870113 -4.409174427
|
||||
132
mne/channels/data/montages/GSN-HydroCel-129.sfp
Normal file
@@ -0,0 +1,132 @@
|
||||
FidNz 0 9.071585155 -2.359754454
|
||||
FidT9 -6.711765 0.040402876 -3.251600355
|
||||
FidT10 6.711765 0.040402876 -3.251600355
|
||||
E1 5.787677636 5.520863216 -2.577468644
|
||||
E2 5.291804727 6.709097557 0.307434896
|
||||
E3 3.864122447 7.63424051 3.067770143
|
||||
E4 2.868837559 7.145708546 4.989564557
|
||||
E5 1.479340453 5.68662139 6.812878187
|
||||
E6 0 3.806770224 7.891304964
|
||||
E7 -1.223800252 1.558864431 8.44043914
|
||||
E8 4.221901505 7.998817387 -1.354789681
|
||||
E9 2.695405558 8.884820317 1.088308144
|
||||
E10 1.830882336 8.708839134 3.18709115
|
||||
E11 0 7.96264703 5.044718001
|
||||
E12 -1.479340453 5.68662139 6.812878187
|
||||
E13 -2.435870762 3.254307219 7.608766206
|
||||
E14 1.270447661 9.479016328 -0.947183306
|
||||
E15 0 9.087440894 1.333345013
|
||||
E16 0 9.076490798 3.105438474
|
||||
E17 0 9.271139705 -2.211516434
|
||||
E18 -1.830882336 8.708839134 3.18709115
|
||||
E19 -2.868837559 7.145708546 4.989564557
|
||||
E20 -3.825797111 5.121648995 5.942844877
|
||||
E21 -1.270447661 9.479016328 -0.947183306
|
||||
E22 -2.695405558 8.884820317 1.088308144
|
||||
E23 -3.864122447 7.63424051 3.067770143
|
||||
E24 -4.459387187 6.021159964 4.365321482
|
||||
E25 -4.221901505 7.998817387 -1.354789681
|
||||
E26 -5.291804727 6.709097557 0.307434896
|
||||
E27 -5.682547954 5.453384344 2.836565436
|
||||
E28 -5.546670402 4.157847823 4.627615703
|
||||
E29 -4.762196763 2.697832099 6.297663028
|
||||
E30 -3.695490968 0.960411022 7.627828134
|
||||
E31 -1.955187826 -0.684381878 8.564858511
|
||||
E32 -5.787677636 5.520863216 -2.577468644
|
||||
E33 -6.399087198 4.127248875 -0.356852241
|
||||
E34 -6.823959684 2.968422112 2.430080351
|
||||
E35 -6.414469893 1.490027747 4.741794544
|
||||
E36 -5.47913021 0.284948655 6.38332782
|
||||
E37 -3.909902609 -1.519049882 7.764134929
|
||||
E38 -6.550732888 3.611543152 -3.353155926
|
||||
E39 -7.191620108 0.850096251 -0.882936903
|
||||
E40 -7.391919265 0.032151584 2.143634599
|
||||
E41 -6.905051715 -0.800953972 4.600056501
|
||||
E42 -5.956055073 -2.338984312 6.00361353
|
||||
E43 -6.518995129 2.417299399 -5.253637073
|
||||
E44 -6.840717711 1.278489412 -3.5553823
|
||||
E45 -7.304625099 -1.866238006 -0.629182006
|
||||
E46 -7.312517928 -2.298574078 2.385298838
|
||||
E47 -6.737313764 -3.011819533 4.178390203
|
||||
E48 -5.934584124 2.22697797 -7.934360742
|
||||
E49 -6.298127313 0.41663451 -6.069156425
|
||||
E50 -6.78248072 -4.023512045 -0.232191092
|
||||
E51 -6.558030032 -4.667036048 2.749989597
|
||||
E52 -5.831241498 -4.494821698 4.955347697
|
||||
E53 -4.193518856 -4.037020083 6.982920038
|
||||
E54 -2.270752074 -3.414835627 8.204556551
|
||||
E55 0 -2.138343513 8.791875902
|
||||
E56 -6.174969392 -2.458138877 -5.637380998
|
||||
E57 -6.580438308 -3.739554155 -2.991084431
|
||||
E58 -6.034746843 -5.755782196 0.051843011
|
||||
E59 -5.204501802 -6.437833018 2.984444293
|
||||
E60 -4.116929504 -6.061561438 5.365757296
|
||||
E61 -2.344914884 -5.481057427 7.057748614
|
||||
E62 0 -6.676694032 6.465208258
|
||||
E63 -5.333266171 -4.302240169 -5.613509789
|
||||
E64 -5.404091392 -5.870302681 -2.891640039
|
||||
E65 -4.645302298 -7.280552408 0.130139701
|
||||
E66 -3.608293164 -7.665487704 3.129931648
|
||||
E67 -1.844644417 -7.354417376 5.224001733
|
||||
E68 -3.784983913 -6.401014415 -5.260040689
|
||||
E69 -3.528848027 -7.603010836 -2.818037873
|
||||
E70 -2.738838019 -8.607966849 0.239368223
|
||||
E71 -1.404967401 -8.437486994 3.277284901
|
||||
E72 0 -7.829896826 4.687622229
|
||||
E73 -1.929652202 -7.497197868 -5.136777648
|
||||
E74 -1.125731192 -8.455208629 -2.632832329
|
||||
E75 0 -8.996686498 0.487952047
|
||||
E76 1.404967401 -8.437486994 3.277284901
|
||||
E77 1.844644417 -7.354417376 5.224001733
|
||||
E78 2.344914884 -5.481057427 7.057748614
|
||||
E79 2.270752074 -3.414835627 8.204556551
|
||||
E80 1.955187826 -0.684381878 8.564858511
|
||||
E81 0 -7.85891896 -4.945387489
|
||||
E82 1.125731192 -8.455208629 -2.632832329
|
||||
E83 2.738838019 -8.607966849 0.239368223
|
||||
E84 3.608293164 -7.665487704 3.129931648
|
||||
E85 4.116929504 -6.061561438 5.365757296
|
||||
E86 4.193518856 -4.037020083 6.982920038
|
||||
E87 3.909902609 -1.519049882 7.764134929
|
||||
E88 1.929652202 -7.497197868 -5.136777648
|
||||
E89 3.528848027 -7.603010836 -2.818037873
|
||||
E90 4.645302298 -7.280552408 0.130139701
|
||||
E91 5.204501802 -6.437833018 2.984444293
|
||||
E92 5.831241498 -4.494821698 4.955347697
|
||||
E93 5.956055073 -2.338984312 6.00361353
|
||||
E94 3.784983913 -6.401014415 -5.260040689
|
||||
E95 5.404091392 -5.870302681 -2.891640039
|
||||
E96 6.034746843 -5.755782196 0.051843011
|
||||
E97 6.558030032 -4.667036048 2.749989597
|
||||
E98 6.737313764 -3.011819533 4.178390203
|
||||
E99 5.333266171 -4.302240169 -5.613509789
|
||||
E100 6.580438308 -3.739554155 -2.991084431
|
||||
E101 6.78248072 -4.023512045 -0.232191092
|
||||
E102 7.312517928 -2.298574078 2.385298838
|
||||
E103 6.905051715 -0.800953972 4.600056501
|
||||
E104 5.47913021 0.284948655 6.38332782
|
||||
E105 3.695490968 0.960411022 7.627828134
|
||||
E106 1.223800252 1.558864431 8.44043914
|
||||
E107 6.174969392 -2.458138877 -5.637380998
|
||||
E108 7.304625099 -1.866238006 -0.629182006
|
||||
E109 7.391919265 0.032151584 2.143634599
|
||||
E110 6.414469893 1.490027747 4.741794544
|
||||
E111 4.762196763 2.697832099 6.297663028
|
||||
E112 2.435870762 3.254307219 7.608766206
|
||||
E113 6.298127313 0.41663451 -6.069156425
|
||||
E114 6.840717711 1.278489412 -3.5553823
|
||||
E115 7.191620108 0.850096251 -0.882936903
|
||||
E116 6.823959684 2.968422112 2.430080351
|
||||
E117 5.546670402 4.157847823 4.627615703
|
||||
E118 3.825797111 5.121648995 5.942844877
|
||||
E119 5.934584124 2.22697797 -7.934360742
|
||||
E120 6.518995129 2.417299399 -5.253637073
|
||||
E121 6.550732888 3.611543152 -3.353155926
|
||||
E122 6.399087198 4.127248875 -0.356852241
|
||||
E123 5.682547954 5.453384344 2.836565436
|
||||
E124 4.459387187 6.021159964 4.365321482
|
||||
E125 6.118458137 4.523870113 -4.409174427
|
||||
E126 3.743504949 6.649204911 -6.530243068
|
||||
E127 -3.743504949 6.649204911 -6.530243068
|
||||
E128 -6.118458137 4.523870113 -4.409174427
|
||||
Cz 0 0 8.899186843
|
||||
259
mne/channels/data/montages/GSN-HydroCel-256.sfp
Normal file
@@ -0,0 +1,259 @@
|
||||
FidNz 0.00000 10.56381 -2.05108
|
||||
FidT9 -7.82694 0.45386 -3.76056
|
||||
FidT10 7.82694 0.45386 -3.76056
|
||||
E1 6.96223 5.38242 -2.19061
|
||||
E2 6.48414 6.40424 -0.14004
|
||||
E3 5.69945 7.20796 1.79088
|
||||
E4 4.81093 7.77321 3.65006
|
||||
E5 3.61962 7.47782 5.50947
|
||||
E6 2.25278 6.46157 6.96317
|
||||
E7 1.18879 5.21755 8.13378
|
||||
E8 0.00000 3.59608 8.75111
|
||||
E9 -1.15339 1.51369 9.19904
|
||||
E10 5.94022 7.38337 -1.51513
|
||||
E11 5.07624 8.37264 0.40595
|
||||
E12 3.87946 9.03611 2.51559
|
||||
E13 2.60756 8.97868 4.39107
|
||||
E14 1.23344 8.11574 6.06161
|
||||
E15 0.00000 6.81181 7.28186
|
||||
E16 -1.18879 5.21755 8.13378
|
||||
E17 -2.29559 2.91372 8.55810
|
||||
E18 4.06489 9.40559 -0.89098
|
||||
E19 2.86784 10.01456 0.85212
|
||||
E20 1.42153 10.06322 2.84803
|
||||
E21 0.00000 9.40339 4.65829
|
||||
E22 -1.23344 8.11574 6.06161
|
||||
E23 -2.25278 6.46157 6.96317
|
||||
E24 -3.34467 4.40891 7.67253
|
||||
E25 1.39547 10.65281 -0.61138
|
||||
E26 0.00000 10.68996 1.00542
|
||||
E27 -1.42153 10.06322 2.84803
|
||||
E28 -2.60756 8.97868 4.39107
|
||||
E29 -3.61962 7.47782 5.50947
|
||||
E30 -4.49828 5.59395 6.28801
|
||||
E31 0.00000 10.56381 -2.05108
|
||||
E32 -1.39547 10.65281 -0.61138
|
||||
E33 -2.86784 10.01456 0.85212
|
||||
E34 -3.87946 9.03611 2.51559
|
||||
E35 -4.81093 7.77321 3.65006
|
||||
E36 -5.10466 6.41586 4.77815
|
||||
E37 -4.06489 9.40559 -0.89098
|
||||
E38 -5.07624 8.37264 0.40595
|
||||
E39 -5.69945 7.20796 1.79088
|
||||
E40 -6.16984 6.11292 3.29612
|
||||
E41 -6.01447 4.93908 4.85771
|
||||
E42 -5.33943 3.80220 6.32664
|
||||
E43 -4.64127 2.57224 7.50868
|
||||
E44 -3.53746 1.07133 8.47419
|
||||
E45 -1.99458 -0.60998 9.28870
|
||||
E46 -5.94022 7.38337 -1.51513
|
||||
E47 -6.48414 6.40424 -0.14004
|
||||
E48 -6.97545 5.35131 1.30741
|
||||
E49 -7.10064 4.23342 2.91874
|
||||
E50 -6.86564 3.16240 4.76800
|
||||
E51 -6.11380 1.94213 6.23844
|
||||
E52 -5.31389 0.60081 7.48811
|
||||
E53 -3.72368 -1.14573 8.58697
|
||||
E54 -6.96223 5.38242 -2.19061
|
||||
E55 -7.31613 4.37155 -0.61128
|
||||
E56 -7.66385 3.29619 1.04415
|
||||
E57 -7.62423 2.30205 2.81799
|
||||
E58 -7.36570 1.34368 4.60382
|
||||
E59 -6.70292 0.06004 6.23992
|
||||
E60 -5.40372 -1.61247 7.47343
|
||||
E61 -7.54098 3.05323 -2.51935
|
||||
E62 -7.77059 2.06323 -0.80729
|
||||
E63 -7.96921 1.20744 0.97332
|
||||
E64 -8.06621 0.40109 2.78565
|
||||
E65 -7.60767 -0.56840 4.59939
|
||||
E66 -6.81554 -1.94522 5.93053
|
||||
E67 -7.69315 1.74041 -4.18153
|
||||
E68 -7.74468 1.05291 -2.47059
|
||||
E69 -7.93758 0.07220 -0.96992
|
||||
E70 -7.98893 -0.75212 0.84194
|
||||
E71 -8.05947 -1.50296 2.76753
|
||||
E72 -7.56445 -2.31141 4.30327
|
||||
E73 -7.52646 0.73096 -5.96025
|
||||
E74 -7.76752 -1.84131 -0.92719
|
||||
E75 -7.79279 -2.73175 1.10033
|
||||
E76 -7.46191 -3.49308 2.95937
|
||||
E77 -6.86934 -3.79448 4.89401
|
||||
E78 -5.65276 -3.84604 6.52108
|
||||
E79 -4.12465 -3.54800 7.95405
|
||||
E80 -2.23647 -2.95809 8.92461
|
||||
E81 0.00000 -1.93834 9.45867
|
||||
E82 -7.12806 -0.49186 -7.34929
|
||||
E83 -7.37920 -3.49709 -2.18347
|
||||
E84 -7.52183 -3.70044 -0.51432
|
||||
E85 -7.15214 -4.71132 1.51762
|
||||
E86 -6.48817 -5.15829 3.47294
|
||||
E87 -5.53051 -5.46184 5.50189
|
||||
E88 -4.03809 -5.23807 7.04455
|
||||
E89 -2.29514 -4.87829 8.27223
|
||||
E90 0.00000 -3.74195 9.02791
|
||||
E91 -6.82585 -1.86426 -8.69399
|
||||
E92 -6.74047 -2.84840 -6.74712
|
||||
E93 -6.78379 -4.01784 -5.01755
|
||||
E94 -7.03346 -4.45090 -3.54895
|
||||
E95 -6.99052 -5.01694 -1.88810
|
||||
E96 -6.67571 -5.73608 0.10234
|
||||
E97 -5.96851 -6.52864 2.03293
|
||||
E98 -5.10822 -6.74936 3.92134
|
||||
E99 -3.75216 -6.67734 5.63719
|
||||
E100 -2.14874 -6.29190 7.11453
|
||||
E101 0.00000 -7.15042 6.95434
|
||||
E102 -6.36989 -3.82470 -8.20622
|
||||
E103 -6.24349 -4.62250 -6.49623
|
||||
E104 -6.09726 -5.61090 -4.67894
|
||||
E105 -6.31441 -6.01299 -3.25921
|
||||
E106 -5.98418 -6.74733 -1.40314
|
||||
E107 -5.23709 -7.57398 0.46627
|
||||
E108 -4.29098 -8.11323 2.38442
|
||||
E109 -3.24277 -8.15293 4.22025
|
||||
E110 -1.73181 -7.63850 5.69360
|
||||
E111 -5.63580 -5.80367 -7.74857
|
||||
E112 -5.38718 -6.45180 -6.16689
|
||||
E113 -5.08285 -7.32643 -4.32109
|
||||
E114 -5.27282 -7.46584 -2.87485
|
||||
E115 -4.13620 -8.61230 -1.04503
|
||||
E116 -3.13323 -9.13629 0.81878
|
||||
E117 -1.94503 -9.23415 2.62135
|
||||
E118 -1.09312 -8.74110 4.13810
|
||||
E119 0.00000 -8.09146 5.34087
|
||||
E120 -4.70608 -7.21970 -7.52955
|
||||
E121 -4.20415 -7.81153 -5.84368
|
||||
E122 -3.62234 -8.59338 -4.04243
|
||||
E123 -3.02717 -9.45363 -1.95941
|
||||
E124 -2.20152 -9.70916 -0.63755
|
||||
E125 -1.01682 -9.71656 0.95467
|
||||
E126 0.00000 -9.23206 2.54671
|
||||
E127 1.09312 -8.74110 4.13810
|
||||
E128 1.73181 -7.63850 5.69360
|
||||
E129 2.14874 -6.29190 7.11453
|
||||
E130 2.29514 -4.87829 8.27223
|
||||
E131 2.23647 -2.95809 8.92461
|
||||
E132 1.99458 -0.60998 9.28870
|
||||
E133 -3.45625 -8.57317 -6.82654
|
||||
E134 -2.71528 -8.94646 -5.55376
|
||||
E135 -2.03205 -9.56166 -3.44989
|
||||
E136 -0.91885 -9.62744 -2.21054
|
||||
E137 0.00000 -9.58535 -0.88629
|
||||
E138 1.01682 -9.71656 0.95467
|
||||
E139 1.94503 -9.23415 2.62135
|
||||
E140 3.24277 -8.15293 4.22025
|
||||
E141 3.75216 -6.67734 5.63719
|
||||
E142 4.03809 -5.23807 7.04455
|
||||
E143 4.12465 -3.54800 7.95405
|
||||
E144 3.72368 -1.14573 8.58697
|
||||
E145 -1.88533 -9.22031 -6.79889
|
||||
E146 -1.06111 -9.53369 -5.45325
|
||||
E147 0.00000 -9.48329 -3.84204
|
||||
E148 0.91885 -9.62744 -2.21054
|
||||
E149 2.20152 -9.70916 -0.63755
|
||||
E150 3.13323 -9.13629 0.81878
|
||||
E151 4.29098 -8.11323 2.38442
|
||||
E152 5.10822 -6.74936 3.92134
|
||||
E153 5.53051 -5.46184 5.50189
|
||||
E154 5.65276 -3.84604 6.52108
|
||||
E155 5.40372 -1.61247 7.47343
|
||||
E156 1.06111 -9.53369 -5.45325
|
||||
E157 2.03205 -9.56166 -3.44989
|
||||
E158 3.02717 -9.45363 -1.95941
|
||||
E159 4.13620 -8.61230 -1.04503
|
||||
E160 5.23709 -7.57398 0.46627
|
||||
E161 5.96851 -6.52864 2.03293
|
||||
E162 6.48817 -5.15829 3.47294
|
||||
E163 6.86934 -3.79448 4.89401
|
||||
E164 6.81554 -1.94522 5.93053
|
||||
E165 1.88533 -9.22031 -6.79889
|
||||
E166 2.71528 -8.94646 -5.55376
|
||||
E167 3.62234 -8.59338 -4.04243
|
||||
E168 5.27282 -7.46584 -2.87485
|
||||
E169 5.98418 -6.74733 -1.40314
|
||||
E170 6.67571 -5.73608 0.10234
|
||||
E171 7.15214 -4.71132 1.51762
|
||||
E172 7.46191 -3.49308 2.95937
|
||||
E173 7.56445 -2.31141 4.30327
|
||||
E174 3.45625 -8.57317 -6.82654
|
||||
E175 4.20415 -7.81153 -5.84368
|
||||
E176 5.08285 -7.32643 -4.32109
|
||||
E177 6.31441 -6.01299 -3.25921
|
||||
E178 6.99052 -5.01694 -1.88810
|
||||
E179 7.52183 -3.70044 -0.51432
|
||||
E180 7.79279 -2.73175 1.10033
|
||||
E181 8.05947 -1.50296 2.76753
|
||||
E182 7.60767 -0.56840 4.59939
|
||||
E183 6.70292 0.06004 6.23992
|
||||
E184 5.31389 0.60081 7.48811
|
||||
E185 3.53746 1.07133 8.47419
|
||||
E186 1.15339 1.51369 9.19904
|
||||
E187 4.70608 -7.21970 -7.52955
|
||||
E188 5.38718 -6.45180 -6.16689
|
||||
E189 6.09726 -5.61090 -4.67894
|
||||
E190 7.03346 -4.45090 -3.54895
|
||||
E191 7.37920 -3.49709 -2.18347
|
||||
E192 7.76752 -1.84131 -0.92719
|
||||
E193 7.98893 -0.75212 0.84194
|
||||
E194 8.06621 0.40109 2.78565
|
||||
E195 7.36570 1.34368 4.60382
|
||||
E196 6.11380 1.94213 6.23844
|
||||
E197 4.64127 2.57224 7.50868
|
||||
E198 2.29559 2.91372 8.55810
|
||||
E199 5.63580 -5.80367 -7.74857
|
||||
E200 6.24349 -4.62250 -6.49623
|
||||
E201 6.78379 -4.01784 -5.01755
|
||||
E202 7.93758 0.07220 -0.96992
|
||||
E203 7.96921 1.20744 0.97332
|
||||
E204 7.62423 2.30205 2.81799
|
||||
E205 6.86564 3.16240 4.76800
|
||||
E206 5.33943 3.80220 6.32664
|
||||
E207 3.34467 4.40891 7.67253
|
||||
E208 6.36989 -3.82470 -8.20622
|
||||
E209 6.74047 -2.84840 -6.74712
|
||||
E210 7.74468 1.05291 -2.47059
|
||||
E211 7.77059 2.06323 -0.80729
|
||||
E212 7.66385 3.29619 1.04415
|
||||
E213 7.10064 4.23342 2.91874
|
||||
E214 6.01447 4.93908 4.85771
|
||||
E215 4.49828 5.59395 6.28801
|
||||
E216 6.82585 -1.86426 -8.69399
|
||||
E217 7.12806 -0.49186 -7.34929
|
||||
E218 7.52646 0.73096 -5.96025
|
||||
E219 7.69315 1.74041 -4.18153
|
||||
E220 7.54098 3.05323 -2.51935
|
||||
E221 7.31613 4.37155 -0.61128
|
||||
E222 6.97545 5.35131 1.30741
|
||||
E223 6.16984 6.11292 3.29612
|
||||
E224 5.10466 6.41586 4.77815
|
||||
E225 7.62652 3.24782 -4.40493
|
||||
E226 7.24346 4.80120 -4.77214
|
||||
E227 7.55603 2.52648 -6.26962
|
||||
E228 7.38028 1.35743 -7.84943
|
||||
E229 6.86103 -0.14155 -9.14913
|
||||
E230 6.74159 5.99080 -5.83258
|
||||
E231 7.22458 4.14855 -6.88918
|
||||
E232 7.31422 3.19647 -8.44268
|
||||
E233 7.09051 1.66694 -9.77213
|
||||
E234 5.88750 7.22674 -6.54736
|
||||
E235 6.65934 5.64059 -7.65729
|
||||
E236 6.75138 4.62427 -9.03070
|
||||
E237 6.58044 3.33743 -10.39707
|
||||
E238 4.69146 8.22723 -6.78260
|
||||
E239 5.81346 6.42065 -8.65026
|
||||
E240 6.04363 5.37051 -9.81363
|
||||
E241 -4.69146 8.22723 -6.78260
|
||||
E242 -5.81346 6.42065 -8.65026
|
||||
E243 -6.04363 5.37051 -9.81363
|
||||
E244 -5.88750 7.22674 -6.54736
|
||||
E245 -6.65934 5.64059 -7.65729
|
||||
E246 -6.75138 4.62427 -9.03070
|
||||
E247 -6.58044 3.33743 -10.39707
|
||||
E248 -6.74159 5.99080 -5.83258
|
||||
E249 -7.22458 4.14855 -6.88918
|
||||
E250 -7.31422 3.19647 -8.44268
|
||||
E251 -7.09051 1.66694 -9.77213
|
||||
E252 -7.24346 4.80120 -4.77214
|
||||
E253 -7.62652 3.24782 -4.40493
|
||||
E254 -7.55603 2.52648 -6.26962
|
||||
E255 -7.38028 1.35743 -7.84943
|
||||
E256 -6.86103 -0.14155 -9.14913
|
||||
260
mne/channels/data/montages/GSN-HydroCel-257.sfp
Normal file
@@ -0,0 +1,260 @@
|
||||
FidNz 0.00000 10.56381 -2.05108
|
||||
FidT9 -7.82694 0.45386 -3.76056
|
||||
FidT10 7.82694 0.45386 -3.76056
|
||||
E1 6.96223 5.38242 -2.19061
|
||||
E2 6.48414 6.40424 -0.14004
|
||||
E3 5.69945 7.20796 1.79088
|
||||
E4 4.81093 7.77321 3.65006
|
||||
E5 3.61962 7.47782 5.50947
|
||||
E6 2.25278 6.46157 6.96317
|
||||
E7 1.18879 5.21755 8.13378
|
||||
E8 0.00000 3.59608 8.75111
|
||||
E9 -1.15339 1.51369 9.19904
|
||||
E10 5.94022 7.38337 -1.51513
|
||||
E11 5.07624 8.37264 0.40595
|
||||
E12 3.87946 9.03611 2.51559
|
||||
E13 2.60756 8.97868 4.39107
|
||||
E14 1.23344 8.11574 6.06161
|
||||
E15 0.00000 6.81181 7.28186
|
||||
E16 -1.18879 5.21755 8.13378
|
||||
E17 -2.29559 2.91372 8.55810
|
||||
E18 4.06489 9.40559 -0.89098
|
||||
E19 2.86784 10.01456 0.85212
|
||||
E20 1.42153 10.06322 2.84803
|
||||
E21 0.00000 9.40339 4.65829
|
||||
E22 -1.23344 8.11574 6.06161
|
||||
E23 -2.25278 6.46157 6.96317
|
||||
E24 -3.34467 4.40891 7.67253
|
||||
E25 1.39547 10.65281 -0.61138
|
||||
E26 0.00000 10.68996 1.00542
|
||||
E27 -1.42153 10.06322 2.84803
|
||||
E28 -2.60756 8.97868 4.39107
|
||||
E29 -3.61962 7.47782 5.50947
|
||||
E30 -4.49828 5.59395 6.28801
|
||||
E31 0.00000 10.56381 -2.05108
|
||||
E32 -1.39547 10.65281 -0.61138
|
||||
E33 -2.86784 10.01456 0.85212
|
||||
E34 -3.87946 9.03611 2.51559
|
||||
E35 -4.81093 7.77321 3.65006
|
||||
E36 -5.10466 6.41586 4.77815
|
||||
E37 -4.06489 9.40559 -0.89098
|
||||
E38 -5.07624 8.37264 0.40595
|
||||
E39 -5.69945 7.20796 1.79088
|
||||
E40 -6.16984 6.11292 3.29612
|
||||
E41 -6.01447 4.93908 4.85771
|
||||
E42 -5.33943 3.80220 6.32664
|
||||
E43 -4.64127 2.57224 7.50868
|
||||
E44 -3.53746 1.07133 8.47419
|
||||
E45 -1.99458 -0.60998 9.28870
|
||||
E46 -5.94022 7.38337 -1.51513
|
||||
E47 -6.48414 6.40424 -0.14004
|
||||
E48 -6.97545 5.35131 1.30741
|
||||
E49 -7.10064 4.23342 2.91874
|
||||
E50 -6.86564 3.16240 4.76800
|
||||
E51 -6.11380 1.94213 6.23844
|
||||
E52 -5.31389 0.60081 7.48811
|
||||
E53 -3.72368 -1.14573 8.58697
|
||||
E54 -6.96223 5.38242 -2.19061
|
||||
E55 -7.31613 4.37155 -0.61128
|
||||
E56 -7.66385 3.29619 1.04415
|
||||
E57 -7.62423 2.30205 2.81799
|
||||
E58 -7.36570 1.34368 4.60382
|
||||
E59 -6.70292 0.06004 6.23992
|
||||
E60 -5.40372 -1.61247 7.47343
|
||||
E61 -7.54098 3.05323 -2.51935
|
||||
E62 -7.77059 2.06323 -0.80729
|
||||
E63 -7.96921 1.20744 0.97332
|
||||
E64 -8.06621 0.40109 2.78565
|
||||
E65 -7.60767 -0.56840 4.59939
|
||||
E66 -6.81554 -1.94522 5.93053
|
||||
E67 -7.69315 1.74041 -4.18153
|
||||
E68 -7.74468 1.05291 -2.47059
|
||||
E69 -7.93758 0.07220 -0.96992
|
||||
E70 -7.98893 -0.75212 0.84194
|
||||
E71 -8.05947 -1.50296 2.76753
|
||||
E72 -7.56445 -2.31141 4.30327
|
||||
E73 -7.52646 0.73096 -5.96025
|
||||
E74 -7.76752 -1.84131 -0.92719
|
||||
E75 -7.79279 -2.73175 1.10033
|
||||
E76 -7.46191 -3.49308 2.95937
|
||||
E77 -6.86934 -3.79448 4.89401
|
||||
E78 -5.65276 -3.84604 6.52108
|
||||
E79 -4.12465 -3.54800 7.95405
|
||||
E80 -2.23647 -2.95809 8.92461
|
||||
E81 0.00000 -1.93834 9.45867
|
||||
E82 -7.12806 -0.49186 -7.34929
|
||||
E83 -7.37920 -3.49709 -2.18347
|
||||
E84 -7.52183 -3.70044 -0.51432
|
||||
E85 -7.15214 -4.71132 1.51762
|
||||
E86 -6.48817 -5.15829 3.47294
|
||||
E87 -5.53051 -5.46184 5.50189
|
||||
E88 -4.03809 -5.23807 7.04455
|
||||
E89 -2.29514 -4.87829 8.27223
|
||||
E90 0.00000 -3.74195 9.02791
|
||||
E91 -6.82585 -1.86426 -8.69399
|
||||
E92 -6.74047 -2.84840 -6.74712
|
||||
E93 -6.78379 -4.01784 -5.01755
|
||||
E94 -7.03346 -4.45090 -3.54895
|
||||
E95 -6.99052 -5.01694 -1.88810
|
||||
E96 -6.67571 -5.73608 0.10234
|
||||
E97 -5.96851 -6.52864 2.03293
|
||||
E98 -5.10822 -6.74936 3.92134
|
||||
E99 -3.75216 -6.67734 5.63719
|
||||
E100 -2.14874 -6.29190 7.11453
|
||||
E101 0.00000 -7.15042 6.95434
|
||||
E102 -6.36989 -3.82470 -8.20622
|
||||
E103 -6.24349 -4.62250 -6.49623
|
||||
E104 -6.09726 -5.61090 -4.67894
|
||||
E105 -6.31441 -6.01299 -3.25921
|
||||
E106 -5.98418 -6.74733 -1.40314
|
||||
E107 -5.23709 -7.57398 0.46627
|
||||
E108 -4.29098 -8.11323 2.38442
|
||||
E109 -3.24277 -8.15293 4.22025
|
||||
E110 -1.73181 -7.63850 5.69360
|
||||
E111 -5.63580 -5.80367 -7.74857
|
||||
E112 -5.38718 -6.45180 -6.16689
|
||||
E113 -5.08285 -7.32643 -4.32109
|
||||
E114 -5.27282 -7.46584 -2.87485
|
||||
E115 -4.13620 -8.61230 -1.04503
|
||||
E116 -3.13323 -9.13629 0.81878
|
||||
E117 -1.94503 -9.23415 2.62135
|
||||
E118 -1.09312 -8.74110 4.13810
|
||||
E119 0.00000 -8.09146 5.34087
|
||||
E120 -4.70608 -7.21970 -7.52955
|
||||
E121 -4.20415 -7.81153 -5.84368
|
||||
E122 -3.62234 -8.59338 -4.04243
|
||||
E123 -3.02717 -9.45363 -1.95941
|
||||
E124 -2.20152 -9.70916 -0.63755
|
||||
E125 -1.01682 -9.71656 0.95467
|
||||
E126 0.00000 -9.23206 2.54671
|
||||
E127 1.09312 -8.74110 4.13810
|
||||
E128 1.73181 -7.63850 5.69360
|
||||
E129 2.14874 -6.29190 7.11453
|
||||
E130 2.29514 -4.87829 8.27223
|
||||
E131 2.23647 -2.95809 8.92461
|
||||
E132 1.99458 -0.60998 9.28870
|
||||
E133 -3.45625 -8.57317 -6.82654
|
||||
E134 -2.71528 -8.94646 -5.55376
|
||||
E135 -2.03205 -9.56166 -3.44989
|
||||
E136 -0.91885 -9.62744 -2.21054
|
||||
E137 0.00000 -9.58535 -0.88629
|
||||
E138 1.01682 -9.71656 0.95467
|
||||
E139 1.94503 -9.23415 2.62135
|
||||
E140 3.24277 -8.15293 4.22025
|
||||
E141 3.75216 -6.67734 5.63719
|
||||
E142 4.03809 -5.23807 7.04455
|
||||
E143 4.12465 -3.54800 7.95405
|
||||
E144 3.72368 -1.14573 8.58697
|
||||
E145 -1.88533 -9.22031 -6.79889
|
||||
E146 -1.06111 -9.53369 -5.45325
|
||||
E147 0.00000 -9.48329 -3.84204
|
||||
E148 0.91885 -9.62744 -2.21054
|
||||
E149 2.20152 -9.70916 -0.63755
|
||||
E150 3.13323 -9.13629 0.81878
|
||||
E151 4.29098 -8.11323 2.38442
|
||||
E152 5.10822 -6.74936 3.92134
|
||||
E153 5.53051 -5.46184 5.50189
|
||||
E154 5.65276 -3.84604 6.52108
|
||||
E155 5.40372 -1.61247 7.47343
|
||||
E156 1.06111 -9.53369 -5.45325
|
||||
E157 2.03205 -9.56166 -3.44989
|
||||
E158 3.02717 -9.45363 -1.95941
|
||||
E159 4.13620 -8.61230 -1.04503
|
||||
E160 5.23709 -7.57398 0.46627
|
||||
E161 5.96851 -6.52864 2.03293
|
||||
E162 6.48817 -5.15829 3.47294
|
||||
E163 6.86934 -3.79448 4.89401
|
||||
E164 6.81554 -1.94522 5.93053
|
||||
E165 1.88533 -9.22031 -6.79889
|
||||
E166 2.71528 -8.94646 -5.55376
|
||||
E167 3.62234 -8.59338 -4.04243
|
||||
E168 5.27282 -7.46584 -2.87485
|
||||
E169 5.98418 -6.74733 -1.40314
|
||||
E170 6.67571 -5.73608 0.10234
|
||||
E171 7.15214 -4.71132 1.51762
|
||||
E172 7.46191 -3.49308 2.95937
|
||||
E173 7.56445 -2.31141 4.30327
|
||||
E174 3.45625 -8.57317 -6.82654
|
||||
E175 4.20415 -7.81153 -5.84368
|
||||
E176 5.08285 -7.32643 -4.32109
|
||||
E177 6.31441 -6.01299 -3.25921
|
||||
E178 6.99052 -5.01694 -1.88810
|
||||
E179 7.52183 -3.70044 -0.51432
|
||||
E180 7.79279 -2.73175 1.10033
|
||||
E181 8.05947 -1.50296 2.76753
|
||||
E182 7.60767 -0.56840 4.59939
|
||||
E183 6.70292 0.06004 6.23992
|
||||
E184 5.31389 0.60081 7.48811
|
||||
E185 3.53746 1.07133 8.47419
|
||||
E186 1.15339 1.51369 9.19904
|
||||
E187 4.70608 -7.21970 -7.52955
|
||||
E188 5.38718 -6.45180 -6.16689
|
||||
E189 6.09726 -5.61090 -4.67894
|
||||
E190 7.03346 -4.45090 -3.54895
|
||||
E191 7.37920 -3.49709 -2.18347
|
||||
E192 7.76752 -1.84131 -0.92719
|
||||
E193 7.98893 -0.75212 0.84194
|
||||
E194 8.06621 0.40109 2.78565
|
||||
E195 7.36570 1.34368 4.60382
|
||||
E196 6.11380 1.94213 6.23844
|
||||
E197 4.64127 2.57224 7.50868
|
||||
E198 2.29559 2.91372 8.55810
|
||||
E199 5.63580 -5.80367 -7.74857
|
||||
E200 6.24349 -4.62250 -6.49623
|
||||
E201 6.78379 -4.01784 -5.01755
|
||||
E202 7.93758 0.07220 -0.96992
|
||||
E203 7.96921 1.20744 0.97332
|
||||
E204 7.62423 2.30205 2.81799
|
||||
E205 6.86564 3.16240 4.76800
|
||||
E206 5.33943 3.80220 6.32664
|
||||
E207 3.34467 4.40891 7.67253
|
||||
E208 6.36989 -3.82470 -8.20622
|
||||
E209 6.74047 -2.84840 -6.74712
|
||||
E210 7.74468 1.05291 -2.47059
|
||||
E211 7.77059 2.06323 -0.80729
|
||||
E212 7.66385 3.29619 1.04415
|
||||
E213 7.10064 4.23342 2.91874
|
||||
E214 6.01447 4.93908 4.85771
|
||||
E215 4.49828 5.59395 6.28801
|
||||
E216 6.82585 -1.86426 -8.69399
|
||||
E217 7.12806 -0.49186 -7.34929
|
||||
E218 7.52646 0.73096 -5.96025
|
||||
E219 7.69315 1.74041 -4.18153
|
||||
E220 7.54098 3.05323 -2.51935
|
||||
E221 7.31613 4.37155 -0.61128
|
||||
E222 6.97545 5.35131 1.30741
|
||||
E223 6.16984 6.11292 3.29612
|
||||
E224 5.10466 6.41586 4.77815
|
||||
E225 7.62652 3.24782 -4.40493
|
||||
E226 7.24346 4.80120 -4.77214
|
||||
E227 7.55603 2.52648 -6.26962
|
||||
E228 7.38028 1.35743 -7.84943
|
||||
E229 6.86103 -0.14155 -9.14913
|
||||
E230 6.74159 5.99080 -5.83258
|
||||
E231 7.22458 4.14855 -6.88918
|
||||
E232 7.31422 3.19647 -8.44268
|
||||
E233 7.09051 1.66694 -9.77213
|
||||
E234 5.88750 7.22674 -6.54736
|
||||
E235 6.65934 5.64059 -7.65729
|
||||
E236 6.75138 4.62427 -9.03070
|
||||
E237 6.58044 3.33743 -10.39707
|
||||
E238 4.69146 8.22723 -6.78260
|
||||
E239 5.81346 6.42065 -8.65026
|
||||
E240 6.04363 5.37051 -9.81363
|
||||
E241 -4.69146 8.22723 -6.78260
|
||||
E242 -5.81346 6.42065 -8.65026
|
||||
E243 -6.04363 5.37051 -9.81363
|
||||
E244 -5.88750 7.22674 -6.54736
|
||||
E245 -6.65934 5.64059 -7.65729
|
||||
E246 -6.75138 4.62427 -9.03070
|
||||
E247 -6.58044 3.33743 -10.39707
|
||||
E248 -6.74159 5.99080 -5.83258
|
||||
E249 -7.22458 4.14855 -6.88918
|
||||
E250 -7.31422 3.19647 -8.44268
|
||||
E251 -7.09051 1.66694 -9.77213
|
||||
E252 -7.24346 4.80120 -4.77214
|
||||
E253 -7.62652 3.24782 -4.40493
|
||||
E254 -7.55603 2.52648 -6.26962
|
||||
E255 -7.38028 1.35743 -7.84943
|
||||
E256 -6.86103 -0.14155 -9.14913
|
||||
Cz 0.00000 0.00000 9.68308
|
||||
36
mne/channels/data/montages/GSN-HydroCel-32.sfp
Normal file
@@ -0,0 +1,36 @@
|
||||
FidNz 0 9.071585155 -2.359754454
|
||||
FidT9 -6.711765 0.040402876 -3.251600355
|
||||
FidT10 6.711765 0.040402876 -3.251600355
|
||||
E1 -2.695405558 8.884820317 1.088308144
|
||||
E2 2.695405558 8.884820317 1.088308144
|
||||
E3 -4.459387187 6.021159964 4.365321482
|
||||
E4 4.459387187 6.021159964 4.365321482
|
||||
E5 -5.47913021 0.284948655 6.38332782
|
||||
E6 5.47913021 0.284948655 6.38332782
|
||||
E7 -5.831241498 -4.494821698 4.955347697
|
||||
E8 5.831241498 -4.494821698 4.955347697
|
||||
E9 -2.738838019 -8.607966849 0.239368223
|
||||
E10 2.738838019 -8.607966849 0.239368223
|
||||
E11 -6.399087198 4.127248875 -0.356852241
|
||||
E12 6.399087198 4.127248875 -0.356852241
|
||||
E13 -7.304625099 -1.866238006 -0.629182006
|
||||
E14 7.304625099 -1.866238006 -0.629182006
|
||||
E15 -6.034746843 -5.755782196 0.051843011
|
||||
E16 6.034746843 -5.755782196 0.051843011
|
||||
E17 0 7.96264703 5.044718001
|
||||
E18 0 9.271139705 -2.211516434
|
||||
E19 0 -6.676694032 6.465208258
|
||||
E20 0 -8.996686498 0.487952047
|
||||
E21 -6.518995129 2.417299399 -5.253637073
|
||||
E22 6.518995129 2.417299399 -5.253637073
|
||||
E23 -6.174969392 -2.458138877 -5.637380998
|
||||
E24 6.174969392 -2.458138877 -5.637380998
|
||||
E25 -3.784983913 -6.401014415 -5.260040689
|
||||
E26 3.784983913 -6.401014415 -5.260040689
|
||||
E27 0 9.087440894 1.333345013
|
||||
E28 0 3.806770224 7.891304964
|
||||
E29 -3.743504949 6.649204911 -6.530243068
|
||||
E30 3.743504949 6.649204911 -6.530243068
|
||||
E31 -6.118458137 4.523870113 -4.409174427
|
||||
E32 6.118458137 4.523870113 -4.409174427
|
||||
Cz 0 0 8.899186843
|
||||
67
mne/channels/data/montages/GSN-HydroCel-64_1.0.sfp
Normal file
@@ -0,0 +1,67 @@
|
||||
FidNz 0.00000 10.3556 -2.69376
|
||||
FidT9 -7.18083 0.0461216 -3.71184
|
||||
FidT10 6.24270 0.0461216 -3.71184
|
||||
E1 6.60688 6.30230 -2.94229
|
||||
E2 4.41106 8.71481 3.50199
|
||||
E3 3.27490 8.15713 5.69580
|
||||
E4 0.00000 4.34559 9.00826
|
||||
E5 3.07692 10.1424 1.24235
|
||||
E6 0.00000 9.08970 5.75876
|
||||
E7 -2.78065 3.71493 8.68573
|
||||
E8 0.00000 10.3612 3.54499
|
||||
E9 -3.2749 8.15713 5.6958
|
||||
E10 -3.07692 10.1424 1.24235
|
||||
E11 -4.41106 8.71481 3.50199
|
||||
E12 -5.09058 6.87341 4.98320
|
||||
E13 -6.48687 6.22527 3.23806
|
||||
E14 -6.33176 4.74636 5.28262
|
||||
E15 -5.43625 3.07969 7.18905
|
||||
E16 -4.21856 1.09635 8.70749
|
||||
E17 -6.60688 6.30230 -2.94229
|
||||
E18 -7.30483 4.71143 -0.407362
|
||||
E19 -7.78984 3.38858 2.77404
|
||||
E20 -6.25466 0.325281 7.28684
|
||||
E21 -4.46332 -1.73406 8.86309
|
||||
E22 -7.88241 -0.914323 5.25116
|
||||
E23 -7.80897 1.45945 -4.05862
|
||||
E24 -8.33854 -2.13039 -0.718238
|
||||
E25 -8.34755 -2.62392 2.72292
|
||||
E26 -7.69093 -3.43812 4.76981
|
||||
E27 -7.48627 -5.32762 3.13923
|
||||
E28 -6.65661 -5.13103 5.65674
|
||||
E29 -7.51185 -4.26886 -3.41445
|
||||
E30 -6.88892 -6.57047 0.0591810
|
||||
E31 -4.69965 -6.91953 6.12524
|
||||
E32 -6.16900 -6.70120 -3.30093
|
||||
E33 -2.10574 -8.39538 5.96342
|
||||
E34 0.00000 -4.98271 9.28085
|
||||
E35 -3.12650 -9.82636 0.273249
|
||||
E36 0.00000 -8.93816 5.35112
|
||||
E37 0.00000 -10.2701 0.557018
|
||||
E38 2.10574 -8.39538 5.96342
|
||||
E39 3.12650 -9.82636 0.273249
|
||||
E40 4.69965 -6.91953 6.12524
|
||||
E41 4.46332 -1.73406 8.86309
|
||||
E42 6.65661 -5.13103 5.65674
|
||||
E43 6.16900 -6.70120 -3.30093
|
||||
E44 6.88892 -6.57047 0.0591810
|
||||
E45 7.48627 -5.32762 3.13923
|
||||
E46 7.69093 -3.43812 4.76981
|
||||
E47 7.51185 -4.26886 -3.41445
|
||||
E48 8.34755 -2.62392 2.72292
|
||||
E49 7.88241 -0.914323 5.25116
|
||||
E50 6.25466 0.325281 7.28684
|
||||
E51 4.21856 1.09635 8.70749
|
||||
E52 8.33854 -2.13039 -0.718238
|
||||
E53 5.43625 3.07969 7.18905
|
||||
E54 2.78065 3.71493 8.68573
|
||||
E55 7.80897 1.45945 -4.05862
|
||||
E56 7.78984 3.38858 2.77404
|
||||
E57 6.33176 4.74636 5.28262
|
||||
E58 7.30483 4.71143 -0.407362
|
||||
E59 6.48687 6.22527 3.23806
|
||||
E60 5.09058 6.87341 4.98320
|
||||
E61 6.98448 5.16419 -5.03326
|
||||
E62 4.27337 7.59035 -7.45455
|
||||
E63 -4.27337 7.59035 -7.45455
|
||||
E64 -6.98448 5.16419 -5.03326
|
||||
68
mne/channels/data/montages/GSN-HydroCel-65_1.0.sfp
Normal file
@@ -0,0 +1,68 @@
|
||||
FidNz 0.00000 10.3556 -2.69376
|
||||
FidT9 -7.18083 0.0461216 -3.71184
|
||||
FidT10 6.24270 0.0461216 -3.71184
|
||||
E1 6.60688 6.30230 -2.94229
|
||||
E2 4.41106 8.71481 3.50199
|
||||
E3 3.27490 8.15713 5.69580
|
||||
E4 0.00000 4.34559 9.00826
|
||||
E5 3.07692 10.1424 1.24235
|
||||
E6 0.00000 9.08970 5.75876
|
||||
E7 -2.78065 3.71493 8.68573
|
||||
E8 0.00000 10.3612 3.54499
|
||||
E9 -3.2749 8.15713 5.6958
|
||||
E10 -3.07692 10.1424 1.24235
|
||||
E11 -4.41106 8.71481 3.50199
|
||||
E12 -5.09058 6.87341 4.98320
|
||||
E13 -6.48687 6.22527 3.23806
|
||||
E14 -6.33176 4.74636 5.28262
|
||||
E15 -5.43625 3.07969 7.18905
|
||||
E16 -4.21856 1.09635 8.70749
|
||||
E17 -6.60688 6.30230 -2.94229
|
||||
E18 -7.30483 4.71143 -0.407362
|
||||
E19 -7.78984 3.38858 2.77404
|
||||
E20 -6.25466 0.325281 7.28684
|
||||
E21 -4.46332 -1.73406 8.86309
|
||||
E22 -7.88241 -0.914323 5.25116
|
||||
E23 -7.80897 1.45945 -4.05862
|
||||
E24 -8.33854 -2.13039 -0.718238
|
||||
E25 -8.34755 -2.62392 2.72292
|
||||
E26 -7.69093 -3.43812 4.76981
|
||||
E27 -7.48627 -5.32762 3.13923
|
||||
E28 -6.65661 -5.13103 5.65674
|
||||
E29 -7.51185 -4.26886 -3.41445
|
||||
E30 -6.88892 -6.57047 0.0591810
|
||||
E31 -4.69965 -6.91953 6.12524
|
||||
E32 -6.16900 -6.70120 -3.30093
|
||||
E33 -2.10574 -8.39538 5.96342
|
||||
E34 0.00000 -4.98271 9.28085
|
||||
E35 -3.12650 -9.82636 0.273249
|
||||
E36 0.00000 -8.93816 5.35112
|
||||
E37 0.00000 -10.2701 0.557018
|
||||
E38 2.10574 -8.39538 5.96342
|
||||
E39 3.12650 -9.82636 0.273249
|
||||
E40 4.69965 -6.91953 6.12524
|
||||
E41 4.46332 -1.73406 8.86309
|
||||
E42 6.65661 -5.13103 5.65674
|
||||
E43 6.16900 -6.70120 -3.30093
|
||||
E44 6.88892 -6.57047 0.0591810
|
||||
E45 7.48627 -5.32762 3.13923
|
||||
E46 7.69093 -3.43812 4.76981
|
||||
E47 7.51185 -4.26886 -3.41445
|
||||
E48 8.34755 -2.62392 2.72292
|
||||
E49 7.88241 -0.914323 5.25116
|
||||
E50 6.25466 0.325281 7.28684
|
||||
E51 4.21856 1.09635 8.70749
|
||||
E52 8.33854 -2.13039 -0.718238
|
||||
E53 5.43625 3.07969 7.18905
|
||||
E54 2.78065 3.71493 8.68573
|
||||
E55 7.80897 1.45945 -4.05862
|
||||
E56 7.78984 3.38858 2.77404
|
||||
E57 6.33176 4.74636 5.28262
|
||||
E58 7.30483 4.71143 -0.407362
|
||||
E59 6.48687 6.22527 3.23806
|
||||
E60 5.09058 6.87341 4.98320
|
||||
E61 6.98448 5.16419 -5.03326
|
||||
E62 4.27337 7.59035 -7.45455
|
||||
E63 -4.27337 7.59035 -7.45455
|
||||
E64 -6.98448 5.16419 -5.03326
|
||||
Cz 0.00000 0.00000 10.1588
|
||||
48
mne/channels/data/montages/artinis-brite23.elc
Normal file
@@ -0,0 +1,48 @@
|
||||
# ASA optode file
|
||||
ReferenceLabel avg
|
||||
UnitPosition mm
|
||||
NumberPositions= 21
|
||||
Positions
|
||||
-4.62 82.33 -45.74
|
||||
79.66 -18.72 -45.89
|
||||
-81.41 -17.18 -45.56
|
||||
65.18 27.28 35.31
|
||||
48.62 59.71 22.68
|
||||
18.95 72.41 38.32
|
||||
-3.97 79.74 30.28
|
||||
-25.96 72.19 35.16
|
||||
-52.51 60.53 14.54
|
||||
-66.37 32.04 31.08
|
||||
76.10 -0.29 31.24
|
||||
65.61 -0.26 56.15
|
||||
64.93 42.43 8.29
|
||||
43.32 46.36 50.77
|
||||
21.58 82.45 1.06
|
||||
-2.91 59.57 61.59
|
||||
-29.62 79.35 2.38
|
||||
-48.13 44.76 49.15
|
||||
-67.68 43.26 -3.18
|
||||
-65.37 4.89 56.36
|
||||
-77.24 5.88 27.58
|
||||
Labels
|
||||
Nz
|
||||
RPA
|
||||
LPA
|
||||
D1
|
||||
D2
|
||||
D3
|
||||
D4
|
||||
D5
|
||||
D6
|
||||
D7
|
||||
S1
|
||||
S2
|
||||
S3
|
||||
S4
|
||||
S5
|
||||
S6
|
||||
S7
|
||||
S8
|
||||
S9
|
||||
S10
|
||||
S11
|
||||
32
mne/channels/data/montages/artinis-octamon.elc
Normal file
@@ -0,0 +1,32 @@
|
||||
# ASA optode file
|
||||
ReferenceLabel avg
|
||||
UnitPosition mm
|
||||
NumberPositions= 13
|
||||
Positions
|
||||
0.96 83.56 -48.63
|
||||
80.25 -19.67 -43.88
|
||||
-82.58 -20.09 -43.10
|
||||
47.77 65.28 7.28
|
||||
-46.45 67.76 8.81
|
||||
63.88 34.84 28.34
|
||||
64.96 45.02 -10.31
|
||||
22.07 74.86 31.03
|
||||
17.84 84.96 -10.84
|
||||
-10.81 77.96 32.10
|
||||
-15.96 85.24 -7.41
|
||||
-61.78 40.78 29.92
|
||||
-65.28 48.14 -10.73
|
||||
Labels
|
||||
Nz
|
||||
RPA
|
||||
LPA
|
||||
D1
|
||||
D2
|
||||
S1
|
||||
S2
|
||||
S3
|
||||
S4
|
||||
S5
|
||||
S6
|
||||
S7
|
||||
S8
|
||||
132
mne/channels/data/montages/biosemi128.txt
Normal file
@@ -0,0 +1,132 @@
|
||||
Site Theta Phi
|
||||
A1 0 0
|
||||
A2 11.5 -90
|
||||
A3 23 -90
|
||||
A4 34.5 -90
|
||||
A5 -46 67.5
|
||||
A6 -46 45
|
||||
A7 -57.5 45
|
||||
A8 -69 54
|
||||
A9 -80.5 54
|
||||
A10 -92 54
|
||||
A11 -103.5 54
|
||||
A12 -115 54
|
||||
A13 -115 72
|
||||
A14 -103.5 72
|
||||
A15 -92 72
|
||||
A16 -80.5 72
|
||||
A17 -69 72
|
||||
A18 -57.5 67.5
|
||||
A19 46 -90
|
||||
A20 57.5 -90
|
||||
A21 69 -90
|
||||
A22 80.5 -90
|
||||
A23 92 -90
|
||||
A24 103.5 -90
|
||||
A25 115 -90
|
||||
A26 115 -72
|
||||
A27 103.5 -72
|
||||
A28 92 -72
|
||||
A29 80.5 -72
|
||||
A30 69 -72
|
||||
A31 57.5 -67.5
|
||||
A32 46 -67.5
|
||||
B1 11.5 -18
|
||||
B2 23 -45
|
||||
B3 46 -45
|
||||
B4 57.5 -45
|
||||
B5 69 -54
|
||||
B6 80.5 -54
|
||||
B7 92 -54
|
||||
B8 103.5 -54
|
||||
B9 115 -54
|
||||
B10 103.5 -36
|
||||
B11 92 -36
|
||||
B12 80.5 -36
|
||||
B13 69 -36
|
||||
B14 92 -18
|
||||
B15 80.5 -18
|
||||
B16 69 -18
|
||||
B17 57.5 -22.5
|
||||
B18 46 -22.5
|
||||
B19 34.5 -30
|
||||
B20 23 0
|
||||
B21 34.5 0
|
||||
B22 46 0
|
||||
B23 57.5 0
|
||||
B24 69 0
|
||||
B25 80.5 0
|
||||
B26 92 0
|
||||
B27 92 18
|
||||
B28 80.5 18
|
||||
B29 69 18
|
||||
B30 57.5 22.5
|
||||
B31 46 22.5
|
||||
B32 34.5 30
|
||||
C1 11.5 54
|
||||
C2 23 45
|
||||
C3 46 45
|
||||
C4 57.5 45
|
||||
C5 69 36
|
||||
C6 80.5 36
|
||||
C7 92 36
|
||||
C8 92 54
|
||||
C9 80.5 54
|
||||
C10 69 54
|
||||
C11 34.5 60
|
||||
C12 46 67.5
|
||||
C13 57.5 67.5
|
||||
C14 69 72
|
||||
C15 80.5 72
|
||||
C16 92 72
|
||||
C17 92 90
|
||||
C18 80.5 90
|
||||
C19 69 90
|
||||
C20 57.5 90
|
||||
C21 46 90
|
||||
C22 34.5 90
|
||||
C23 23 90
|
||||
C24 -34.5 -60
|
||||
C25 -46 -67.5
|
||||
C26 -57.5 -67.5
|
||||
C27 -69 -72
|
||||
C28 -80.5 -72
|
||||
C29 -92 -72
|
||||
C30 -92 -54
|
||||
C31 -80.5 -54
|
||||
C32 -69 -54
|
||||
D1 -11.5 -54
|
||||
D2 -23 -45
|
||||
D3 -46 -45
|
||||
D4 -57.5 -45
|
||||
D5 -69 -36
|
||||
D6 -80.5 -36
|
||||
D7 -92 -36
|
||||
D8 -92 -18
|
||||
D9 -80.5 -18
|
||||
D10 -69 -18
|
||||
D11 -57.5 -22.5
|
||||
D12 -46 -22.5
|
||||
D13 -34.5 -30
|
||||
D14 -23 0
|
||||
D15 -11.5 18
|
||||
D16 -23 45
|
||||
D17 -34.5 30
|
||||
D18 -34.5 0
|
||||
D19 -46 0
|
||||
D20 -57.5 0
|
||||
D21 -69 0
|
||||
D22 -80.5 0
|
||||
D23 -92 0
|
||||
D24 -92 18
|
||||
D25 -80.5 18
|
||||
D26 -69 18
|
||||
D27 -57.5 22.5
|
||||
D28 -46 22.5
|
||||
D29 -69 36
|
||||
D30 -80.5 36
|
||||
D31 -92 36
|
||||
D32 -103.5 36
|
||||
Nz 115 90
|
||||
LPA -115 0
|
||||
RPA 115 0
|
||||
20
mne/channels/data/montages/biosemi16.txt
Normal file
@@ -0,0 +1,20 @@
|
||||
Site Theta Phi
|
||||
Fp1 -92 -72
|
||||
Fp2 92 72
|
||||
F4 60 51
|
||||
Fz 46 90
|
||||
F3 -60 -51
|
||||
T7 -92 0
|
||||
C3 -46 0
|
||||
Cz 0 0
|
||||
C4 46 0
|
||||
T8 92 0
|
||||
P4 60 -51
|
||||
Pz 46 -90
|
||||
P3 -60 51
|
||||
O1 -92 72
|
||||
Oz 92 -90
|
||||
O2 92 -72
|
||||
Nz 115 90
|
||||
LPA -115 0
|
||||
RPA 115 0
|
||||
164
mne/channels/data/montages/biosemi160.txt
Normal file
@@ -0,0 +1,164 @@
|
||||
Site Theta Phi
|
||||
A1 0 0
|
||||
A2 11.5 -90
|
||||
A3 23 -90
|
||||
A4 34.5 -90
|
||||
A5 -46 72
|
||||
A6 -46 54
|
||||
A7 -57.5 54
|
||||
A8 -69 60
|
||||
A9 -80.5 60
|
||||
A10 -92 60
|
||||
A11 -103.5 60
|
||||
A12 -115 60
|
||||
A13 -115 75
|
||||
A14 -103.5 75
|
||||
A15 -92 75
|
||||
A16 -80.5 75
|
||||
A17 -69 75
|
||||
A18 -57.5 72
|
||||
A19 46 -90
|
||||
A20 57.5 -90
|
||||
A21 69 -90
|
||||
A22 80.5 -90
|
||||
A23 92 -90
|
||||
A24 103.5 -90
|
||||
A25 115 -90
|
||||
A26 115 -75
|
||||
A27 103.5 -75
|
||||
A28 92 -75
|
||||
A29 80.5 -75
|
||||
A30 69 -75
|
||||
A31 57.5 -72
|
||||
A32 46 -72
|
||||
B1 11.5 -18
|
||||
B2 23 -60
|
||||
B3 46 -54
|
||||
B4 57.5 -54
|
||||
B5 69 -60
|
||||
B6 80.5 -60
|
||||
B7 92 -60
|
||||
B8 103.5 -60
|
||||
B9 115 -60
|
||||
B10 115 -45
|
||||
B11 103.5 -45
|
||||
B12 92 -45
|
||||
B13 80.5 -45
|
||||
B14 69 -45
|
||||
B15 69 -30
|
||||
B16 80.5 -30
|
||||
B17 92 -30
|
||||
B18 103.5 -30
|
||||
B19 92 -15
|
||||
B20 80.5 -15
|
||||
B21 69 -15
|
||||
B22 57.5 -36
|
||||
B23 46 -36
|
||||
B24 34.5 -45
|
||||
B25 23 -30
|
||||
B26 34.5 -22.5
|
||||
B27 46 -18
|
||||
B28 57.5 -18
|
||||
B29 57.5 0
|
||||
B30 69 0
|
||||
B31 80.5 0
|
||||
B32 92 0
|
||||
C1 11.5 54
|
||||
C2 23 30
|
||||
C3 23 0
|
||||
C4 34.5 0
|
||||
C5 34.5 22.5
|
||||
C6 46 18
|
||||
C7 46 0
|
||||
C8 57.5 18
|
||||
C9 69 15
|
||||
C10 80.5 15
|
||||
C11 92 15
|
||||
C12 92 30
|
||||
C13 80.5 30
|
||||
C14 69 30
|
||||
C15 69 45
|
||||
C16 80.5 45
|
||||
C17 92 45
|
||||
C18 92 60
|
||||
C19 80.5 60
|
||||
C20 69 60
|
||||
C21 57.5 54
|
||||
C22 57.5 36
|
||||
C23 46 36
|
||||
C24 34.5 45
|
||||
C25 23 60
|
||||
C26 34.5 67.5
|
||||
C27 46 54
|
||||
C28 46 72
|
||||
C29 57.5 72
|
||||
C30 69 75
|
||||
C31 80.5 75
|
||||
C32 92 75
|
||||
D1 -11.5 -54
|
||||
D2 23 90
|
||||
D3 34.5 90
|
||||
D4 46 90
|
||||
D5 57.5 90
|
||||
D6 69 90
|
||||
D7 80.5 90
|
||||
D8 92 90
|
||||
D9 -92 -75
|
||||
D10 -80.5 -75
|
||||
D11 -69 -75
|
||||
D12 -57.5 -72
|
||||
D13 -46 -72
|
||||
D14 -34.5 -67.5
|
||||
D15 -23 -60
|
||||
D16 -23 -30
|
||||
D17 -34.5 -45
|
||||
D18 -46 -54
|
||||
D19 -57.5 -54
|
||||
D20 -69 -60
|
||||
D21 -80.5 -60
|
||||
D22 -92 -60
|
||||
D23 -92 -45
|
||||
D24 -80.5 -45
|
||||
D25 -69 -45
|
||||
D26 -57.5 -36
|
||||
D27 -46 -36
|
||||
D28 -34.5 -22.5
|
||||
D29 -46 -18
|
||||
D30 -69 -30
|
||||
D31 -80.5 -30
|
||||
D32 -92 -30
|
||||
E1 -11.5 18
|
||||
E2 -23 0
|
||||
E3 -34.5 0
|
||||
E4 -46 0
|
||||
E5 -57.5 -18
|
||||
E6 -69 -15
|
||||
E7 -80.5 -15
|
||||
E8 -92 -15
|
||||
E9 -92 0
|
||||
E10 -80.5 0
|
||||
E11 -69 0
|
||||
E12 -57.5 0
|
||||
E13 -57.5 18
|
||||
E14 -69 15
|
||||
E15 -80.5 15
|
||||
E16 -92 15
|
||||
E17 -103.5 30
|
||||
E18 -92 30
|
||||
E19 -80.5 30
|
||||
E20 -69 30
|
||||
E21 -46 18
|
||||
E22 -34.5 22.5
|
||||
E23 -23 30
|
||||
E24 -23 60
|
||||
E25 -34.5 45
|
||||
E26 -46 36
|
||||
E27 -57.5 36
|
||||
E28 -69 45
|
||||
E29 -80.5 45
|
||||
E30 -92 45
|
||||
E31 -103.5 45
|
||||
E32 -115 45
|
||||
Nz 115 90
|
||||
LPA -115 0
|
||||
RPA 115 0
|
||||
260
mne/channels/data/montages/biosemi256.txt
Normal file
@@ -0,0 +1,260 @@
|
||||
Site Theta Phi
|
||||
A1 0 0
|
||||
A2 9.2 -90
|
||||
A3 18.4 -90
|
||||
A4 27.6 -90
|
||||
A5 36.8 -90
|
||||
A6 46 -90
|
||||
A7 -46 75
|
||||
A8 -55.2 75
|
||||
A9 -64.4 78
|
||||
A10 -73.6 78
|
||||
A11 -82.8 78.75
|
||||
A12 -92 78.75
|
||||
A13 -101.2 78.75
|
||||
A14 -110.4 78
|
||||
A15 -119.6 78
|
||||
A16 119.6 -90
|
||||
A17 110.4 -90
|
||||
A18 101.2 -90
|
||||
A19 92 -90
|
||||
A20 82.8 -90
|
||||
A21 73.6 -90
|
||||
A22 64.4 -90
|
||||
A23 55.2 -90
|
||||
A24 46 -75
|
||||
A25 55.2 -75
|
||||
A26 64.4 -78
|
||||
A27 73.6 -78
|
||||
A28 82.8 -78.75
|
||||
A29 92 -78.75
|
||||
A30 101.2 -78.75
|
||||
A31 110.4 -78
|
||||
A32 119.6 -78
|
||||
B1 18.4 -54
|
||||
B2 27.6 -66
|
||||
B3 36.8 -54
|
||||
B4 46 -60
|
||||
B5 55.2 -60
|
||||
B6 64.4 -66
|
||||
B7 73.6 -66
|
||||
B8 82.8 -67.5
|
||||
B9 92 -67.5
|
||||
B10 101.2 -67.5
|
||||
B11 110.4 -66
|
||||
B12 119.6 -66
|
||||
B13 110.4 -54
|
||||
B14 101.2 -56.25
|
||||
B15 92 -56.25
|
||||
B16 82.8 -56.25
|
||||
B17 73.6 -54
|
||||
B18 64.4 -54
|
||||
B19 55.2 -45
|
||||
B20 46 -45
|
||||
B21 27.6 -42
|
||||
B22 36.8 -36
|
||||
B23 46 -30
|
||||
B24 55.2 -30
|
||||
B25 64.4 -42
|
||||
B26 73.6 -42
|
||||
B27 82.8 -45
|
||||
B28 92 -45
|
||||
B29 101.2 -45
|
||||
B30 110.4 -42
|
||||
B31 110.4 -30
|
||||
B32 101.2 -33.75
|
||||
C1 9.2 -18
|
||||
C2 18.4 -18
|
||||
C3 27.6 -18
|
||||
C4 36.8 -18
|
||||
C5 46 -15
|
||||
C6 55.2 -15
|
||||
C7 64.4 -18
|
||||
C8 64.4 -30
|
||||
C9 73.6 -30
|
||||
C10 82.8 -33.75
|
||||
C11 92 -33.75
|
||||
C12 101.2 -22.5
|
||||
C13 92 -22.5
|
||||
C14 82.8 -22.5
|
||||
C15 73.6 -18
|
||||
C16 82.8 -11.25
|
||||
C17 92 -11.25
|
||||
C18 92 0
|
||||
C19 82.8 0
|
||||
C20 73.6 -6
|
||||
C21 64.4 -6
|
||||
C22 55.2 0
|
||||
C23 46 0
|
||||
C24 36.8 0
|
||||
C25 27.6 6
|
||||
C26 36.8 18
|
||||
C27 46 15
|
||||
C28 55.2 15
|
||||
C29 64.4 6
|
||||
C30 73.6 6
|
||||
C31 82.8 11.25
|
||||
C32 92 11.25
|
||||
D1 9.2 54
|
||||
D2 18.4 18
|
||||
D3 27.6 30
|
||||
D4 36.8 36
|
||||
D5 46 30
|
||||
D6 64.4 18
|
||||
D7 73.6 18
|
||||
D8 82.8 22.5
|
||||
D9 92 22.5
|
||||
D10 101.2 22.5
|
||||
D11 101.2 33.75
|
||||
D12 92 33.75
|
||||
D13 82.8 33.75
|
||||
D14 73.6 30
|
||||
D15 64.4 30
|
||||
D16 55.2 30
|
||||
D17 46 45
|
||||
D18 55.2 45
|
||||
D19 64.4 42
|
||||
D20 73.6 42
|
||||
D21 82.8 45
|
||||
D22 92 45
|
||||
D23 101.2 45
|
||||
D24 92 56.25
|
||||
D25 82.8 56.25
|
||||
D26 73.6 54
|
||||
D27 64.4 54
|
||||
D28 55.2 60
|
||||
D29 64.4 66
|
||||
D30 73.6 66
|
||||
D31 82.8 67.5
|
||||
D32 92 67.5
|
||||
E1 18.4 90
|
||||
E2 18.4 54
|
||||
E3 27.6 54
|
||||
E4 36.8 54
|
||||
E5 46 60
|
||||
E6 46 75
|
||||
E7 55.2 75
|
||||
E8 64.4 78
|
||||
E9 73.6 78
|
||||
E10 82.8 78.75
|
||||
E11 92 78.75
|
||||
E12 92 90
|
||||
E13 82.8 90
|
||||
E14 73.6 90
|
||||
E15 64.4 90
|
||||
E16 55.2 90
|
||||
E17 46 90
|
||||
E18 36.8 90
|
||||
E19 36.8 72
|
||||
E20 27.6 78
|
||||
E21 -27.6 -78
|
||||
E22 -36.8 -72
|
||||
E23 -46 -75
|
||||
E24 -55.2 -75
|
||||
E25 -64.4 -78
|
||||
E26 -73.6 -78
|
||||
E27 -82.8 -78.75
|
||||
E28 -92 -78.75
|
||||
E29 -92 -67.5
|
||||
E30 -82.8 -67.5
|
||||
E31 -73.6 -66
|
||||
E32 -64.4 -66
|
||||
F1 -9.2 -54
|
||||
F2 -18.4 -54
|
||||
F3 -27.6 -54
|
||||
F4 -36.8 -54
|
||||
F5 -46 -60
|
||||
F6 -55.2 -60
|
||||
F7 -64.4 -54
|
||||
F8 -73.6 -54
|
||||
F9 -82.8 -56.25
|
||||
F10 -92 -56.25
|
||||
F11 -101.2 -45
|
||||
F12 -92 -45
|
||||
F13 -82.8 -45
|
||||
F14 -73.6 -42
|
||||
F15 -64.4 -42
|
||||
F16 -55.2 -45
|
||||
F17 -46 -45
|
||||
F18 -36.8 -36
|
||||
F19 -27.6 -30
|
||||
F20 -18.4 -18
|
||||
F21 -27.6 -6
|
||||
F22 -36.8 -18
|
||||
F23 -46 -30
|
||||
F24 -55.2 -30
|
||||
F25 -64.4 -30
|
||||
F26 -73.6 -30
|
||||
F27 -82.8 -33.75
|
||||
F28 -92 -33.75
|
||||
F29 -101.2 -33.75
|
||||
F30 -101.2 -22.5
|
||||
F31 -92 -22.5
|
||||
F32 -82.8 -22.5
|
||||
G1 -9.2 18
|
||||
G2 -18.4 18
|
||||
G3 -27.6 18
|
||||
G4 -36.8 0
|
||||
G5 -46 -15
|
||||
G6 -55.2 -15
|
||||
G7 -64.4 -18
|
||||
G8 -73.6 -18
|
||||
G9 -82.8 -11.25
|
||||
G10 -92 -11.25
|
||||
G11 -92 0
|
||||
G12 -82.8 0
|
||||
G13 -73.6 -6
|
||||
G14 -64.4 -6
|
||||
G15 -55.2 0
|
||||
G16 -46 0
|
||||
G17 -55.2 15
|
||||
G18 -64.4 6
|
||||
G19 -73.6 6
|
||||
G20 -82.8 11.25
|
||||
G21 -92 11.25
|
||||
G22 -101.2 22.5
|
||||
G23 -92 22.5
|
||||
G24 -82.8 22.5
|
||||
G25 -73.6 18
|
||||
G26 -64.4 18
|
||||
G27 -64.4 30
|
||||
G28 -73.6 30
|
||||
G29 -82.8 33.75
|
||||
G30 -92 33.75
|
||||
G31 -101.2 33.75
|
||||
G32 -110.4 30
|
||||
H1 -18.4 54
|
||||
H2 -27.6 42
|
||||
H3 -36.8 36
|
||||
H4 -36.8 18
|
||||
H5 -46 15
|
||||
H6 -46 30
|
||||
H7 -55.2 30
|
||||
H8 -64.4 42
|
||||
H9 -73.6 42
|
||||
H10 -82.8 45
|
||||
H11 -92 45
|
||||
H12 -101.2 45
|
||||
H13 -110.4 42
|
||||
H14 -110.4 54
|
||||
H15 -101.2 56.25
|
||||
H16 -92 56.25
|
||||
H17 -82.8 56.25
|
||||
H18 -73.6 54
|
||||
H19 -64.4 54
|
||||
H20 -55.2 45
|
||||
H21 -46 45
|
||||
H22 -36.8 54
|
||||
H23 -27.6 66
|
||||
H24 -46 60
|
||||
H25 -55.2 60
|
||||
H26 -64.4 66
|
||||
H27 -73.6 66
|
||||
H28 -82.8 67.5
|
||||
H29 -92 67.5
|
||||
H30 -101.2 67.5
|
||||
H31 -110.4 66
|
||||
H32 -119.6 66
|
||||
Nz 115 90
|
||||
LPA -115 0
|
||||
RPA 115 0
|
||||
36
mne/channels/data/montages/biosemi32.txt
Normal file
@@ -0,0 +1,36 @@
|
||||
Site Theta Phi
|
||||
Fp1 -92 -72
|
||||
AF3 -74 -65
|
||||
F7 -92 -36
|
||||
F3 -60 -51
|
||||
FC1 -32 -45
|
||||
FC5 -72 -21
|
||||
T7 -92 0
|
||||
C3 -46 0
|
||||
CP1 -32 45
|
||||
CP5 -72 21
|
||||
P7 -92 36
|
||||
P3 -60 51
|
||||
Pz 46 -90
|
||||
PO3 -74 65
|
||||
O1 -92 72
|
||||
Oz 92 -90
|
||||
O2 92 -72
|
||||
PO4 74 -65
|
||||
P4 60 -51
|
||||
P8 92 -36
|
||||
CP6 72 -21
|
||||
CP2 32 -45
|
||||
C4 46 0
|
||||
T8 92 0
|
||||
FC6 72 21
|
||||
FC2 32 45
|
||||
F4 60 51
|
||||
F8 92 36
|
||||
AF4 74 65
|
||||
Fp2 92 72
|
||||
Fz 46 90
|
||||
Cz 0 0
|
||||
Nz 115 90
|
||||
LPA -115 0
|
||||
RPA 115 0
|
||||
68
mne/channels/data/montages/biosemi64.txt
Normal file
@@ -0,0 +1,68 @@
|
||||
Site Theta Phi
|
||||
Fp1 -92 -72
|
||||
AF7 -92 -54
|
||||
AF3 -74 -65
|
||||
F1 -50 -68
|
||||
F3 -60 -51
|
||||
F5 -75 -41
|
||||
F7 -92 -36
|
||||
FT7 -92 -18
|
||||
FC5 -72 -21
|
||||
FC3 -50 -28
|
||||
FC1 -32 -45
|
||||
C1 -23 0
|
||||
C3 -46 0
|
||||
C5 -69 0
|
||||
T7 -92 0
|
||||
TP7 -92 18
|
||||
CP5 -72 21
|
||||
CP3 -50 28
|
||||
CP1 -32 45
|
||||
P1 -50 68
|
||||
P3 -60 51
|
||||
P5 -75 41
|
||||
P7 -92 36
|
||||
P9 -115 36
|
||||
PO7 -92 54
|
||||
PO3 -74 65
|
||||
O1 -92 72
|
||||
Iz 115 -90
|
||||
Oz 92 -90
|
||||
POz 69 -90
|
||||
Pz 46 -90
|
||||
CPz 23 -90
|
||||
Fpz 92 90
|
||||
Fp2 92 72
|
||||
AF8 92 54
|
||||
AF4 74 65
|
||||
AFz 69 90
|
||||
Fz 46 90
|
||||
F2 50 68
|
||||
F4 60 51
|
||||
F6 75 41
|
||||
F8 92 36
|
||||
FT8 92 18
|
||||
FC6 72 21
|
||||
FC4 50 28
|
||||
FC2 32 45
|
||||
FCz 23 90
|
||||
Cz 0 0
|
||||
C2 23 0
|
||||
C4 46 0
|
||||
C6 69 0
|
||||
T8 92 0
|
||||
TP8 92 -18
|
||||
CP6 72 -21
|
||||
CP4 50 -28
|
||||
CP2 32 -45
|
||||
P2 50 -68
|
||||
P4 60 -51
|
||||
P6 75 -41
|
||||
P8 92 -36
|
||||
P10 115 -36
|
||||
PO8 92 -54
|
||||
PO4 74 -65
|
||||
O2 92 -72
|
||||
Nz 115 90
|
||||
LPA -115 0
|
||||
RPA 115 0
|
||||
131
mne/channels/data/montages/brainproducts-RNP-BA-128.txt
Normal file
@@ -0,0 +1,131 @@
|
||||
Name Theta Phi
|
||||
Fp1 -90 -72
|
||||
Fz 45 90
|
||||
F3 -60 -51
|
||||
F7 -90 -36
|
||||
F9 -113 -36
|
||||
FC5 -69 -21
|
||||
FC1 -31 -46
|
||||
C3 -45 0
|
||||
T7 -90 0
|
||||
CP5 -69 21
|
||||
CP1 -31 46
|
||||
Pz 45 -90
|
||||
P3 -60 51
|
||||
P7 -90 36
|
||||
P9 -113 36
|
||||
O1 -90 72
|
||||
Oz 90 -90
|
||||
O2 90 -72
|
||||
P10 113 -36
|
||||
P8 90 -36
|
||||
P4 60 -51
|
||||
CP2 31 -46
|
||||
CP6 69 -21
|
||||
T8 90 0
|
||||
C4 45 0
|
||||
Cz 0 0
|
||||
FC2 31 46
|
||||
FC6 69 21
|
||||
F10 113 36
|
||||
F8 90 36
|
||||
F4 60 51
|
||||
Fp2 90 72
|
||||
AF7 -90 -54
|
||||
AF3 -74 -68
|
||||
AFz 67 90
|
||||
F1 -49 -68
|
||||
F5 -74 -41
|
||||
FT7 -90 -18
|
||||
FC3 -49 -29
|
||||
C1 -23 0
|
||||
C5 -68 0
|
||||
TP7 -90 18
|
||||
CP3 -49 29
|
||||
P1 -49 68
|
||||
P5 -74 41
|
||||
PO7 -90 54
|
||||
PO3 -74 68
|
||||
Iz 112 -90
|
||||
POz 67 -90
|
||||
PO4 74 -68
|
||||
PO8 90 -54
|
||||
P6 74 -41
|
||||
P2 49 -68
|
||||
CPz 22 -90
|
||||
CP4 49 -29
|
||||
TP8 90 -18
|
||||
C6 68 0
|
||||
C2 23 0
|
||||
FC4 49 29
|
||||
FT8 90 18
|
||||
F6 74 41
|
||||
F2 49 68
|
||||
AF4 74 68
|
||||
AF8 90 54
|
||||
AFF3h -62 -67
|
||||
FFC1h -35 -73
|
||||
FFC5h -62 -35
|
||||
FT9 -113 -18
|
||||
FTT7h -79 -10
|
||||
FCC3h -35 -19
|
||||
CCP1h -16 45
|
||||
CCP5h -57 12
|
||||
TP9 -113 18
|
||||
TPP7h -81 29
|
||||
CPP3h -46 48
|
||||
PPO3h -62 67
|
||||
PPO9h -101 45
|
||||
POO1 -79 82
|
||||
PO9 -113 54
|
||||
I1 -112 72
|
||||
I2 112 -72
|
||||
PO10 113 -54
|
||||
POO2 79 -82
|
||||
PPO10h 101 -45
|
||||
PPO4h 62 -67
|
||||
CPP4h 46 -48
|
||||
TPP8h 81 -29
|
||||
TP10 113 -18
|
||||
CCP6h 57 -12
|
||||
CCP2h 16 -45
|
||||
FCC4h 35 19
|
||||
FTT8h 79 10
|
||||
FT10 113 18
|
||||
FFC6h 62 35
|
||||
FFC2h 35 73
|
||||
AFF4h 62 67
|
||||
AFp1 -79 -82
|
||||
AFF1h -57 -82
|
||||
AFF5h -72 -55
|
||||
FFT7h -81 -29
|
||||
FFC3h -46 -48
|
||||
FCC1h -16 -45
|
||||
FCC5h -57 -12
|
||||
TTP7h -79 10
|
||||
CCP3h -35 19
|
||||
CPP1h -35 73
|
||||
CPP5h -62 35
|
||||
TPP9h -101 27
|
||||
PPO5h -72 55
|
||||
PPO1h -57 82
|
||||
POO9h -101 63
|
||||
OI1h -101 81
|
||||
OI2h 101 -81
|
||||
POO10h 101 -63
|
||||
PPO2h 57 -82
|
||||
PPO6h 72 -55
|
||||
TPP10h 101 -27
|
||||
CPP6h 62 -35
|
||||
CPP2h 35 -73
|
||||
CCP4h 35 -19
|
||||
TTP8h 79 -10
|
||||
FCC6h 57 12
|
||||
FCC2h 16 45
|
||||
FFC4h 46 48
|
||||
FFT8h 81 29
|
||||
AFF6h 72 55
|
||||
AFF2h 57 82
|
||||
AFp2 79 82
|
||||
FCz 23 90
|
||||
Fpz 90 90
|
||||
75
mne/channels/data/montages/easycap-M1.txt
Normal file
@@ -0,0 +1,75 @@
|
||||
Site Theta Phi
|
||||
Fp1 -92 -72
|
||||
Fp2 92 72
|
||||
F3 -60 -51
|
||||
F4 60 51
|
||||
C3 -46 0
|
||||
C4 46 0
|
||||
P3 -60 51
|
||||
P4 60 -51
|
||||
O1 -92 72
|
||||
O2 92 -72
|
||||
F7 -92 -36
|
||||
F8 92 36
|
||||
T7 -92 0
|
||||
T8 92 0
|
||||
P7 -92 36
|
||||
P8 92 -36
|
||||
Fz 46 90
|
||||
Cz 0 0
|
||||
Pz 46 -90
|
||||
F1 -50 -68
|
||||
F2 50 68
|
||||
FC1 -32 -45
|
||||
FC2 32 45
|
||||
C1 -23 0
|
||||
C2 23 0
|
||||
CP1 -32 45
|
||||
CP2 32 -45
|
||||
P1 -50 68
|
||||
P2 50 -68
|
||||
AF3 -74 -65
|
||||
AF4 74 65
|
||||
FC3 -53 -33
|
||||
FC4 53 33
|
||||
CP3 -52 33
|
||||
CP4 52 -33
|
||||
PO3 -74 65
|
||||
PO4 74 -65
|
||||
F5 -75 -41
|
||||
F6 75 41
|
||||
FC5 -72 -21
|
||||
FC6 72 21
|
||||
C5 -69 0
|
||||
C6 69 0
|
||||
CP5 -72 21
|
||||
CP6 72 -21
|
||||
P5 -75 41
|
||||
P6 75 -41
|
||||
AF7 -92 -54
|
||||
AF8 92 54
|
||||
FT7 -92 -18
|
||||
FT8 92 18
|
||||
TP7 -92 18
|
||||
TP8 92 -18
|
||||
PO7 -92 54
|
||||
PO8 92 -54
|
||||
F9 -115 -36
|
||||
F10 115 36
|
||||
FT9 -115 -18
|
||||
FT10 115 18
|
||||
TP9 -115 18
|
||||
TP10 115 -18
|
||||
P9 -115 36
|
||||
P10 115 -36
|
||||
PO9 -115 54
|
||||
PO10 115 -54
|
||||
O9 -115 72
|
||||
O10 115 -72
|
||||
Fpz 92 90
|
||||
AFz 69 90
|
||||
FCz 23 90
|
||||
CPz 23 -90
|
||||
POz 69 -90
|
||||
Oz 92 -90
|
||||
Iz 115 -90
|
||||
62
mne/channels/data/montages/easycap-M10.txt
Normal file
@@ -0,0 +1,62 @@
|
||||
Site Theta Phi
|
||||
1 0 0
|
||||
2 23 90
|
||||
3 23 30
|
||||
4 23 -30
|
||||
5 23 -90
|
||||
6 -23 30
|
||||
7 -23 -30
|
||||
8 46 90
|
||||
9 46 66
|
||||
10 46 33
|
||||
11 46 0
|
||||
12 46 -33
|
||||
13 46 -66
|
||||
14 46 -90
|
||||
15 -46 66
|
||||
16 -46 33
|
||||
17 -46 0
|
||||
18 -46 -33
|
||||
19 -46 -66
|
||||
20 69 90
|
||||
21 69 66
|
||||
22 69 42
|
||||
23 69 18
|
||||
24 69 -6
|
||||
25 69 -30
|
||||
26 69 -54
|
||||
27 69 -78
|
||||
28 -69 78
|
||||
29 -69 54
|
||||
30 -69 30
|
||||
31 -69 6
|
||||
32 -69 -18
|
||||
33 -69 -42
|
||||
34 -69 -66
|
||||
35 92 90
|
||||
36 92 68
|
||||
37 92 45
|
||||
38 92 22
|
||||
39 92 0
|
||||
40 92 -22
|
||||
41 92 -45
|
||||
42 92 -68
|
||||
43 92 -90
|
||||
44 -92 68
|
||||
45 -92 45
|
||||
46 -92 22
|
||||
47 -92 0
|
||||
48 -92 -22
|
||||
49 -92 -45
|
||||
50 -92 -68
|
||||
51 115 35
|
||||
52 115 10
|
||||
53 115 -15
|
||||
54 115 -40
|
||||
55 115 -65
|
||||
56 115 -90
|
||||
57 -115 65
|
||||
58 -115 40
|
||||
59 -115 15
|
||||
60 -115 -10
|
||||
61 -115 -35
|
||||
65
mne/channels/data/montages/easycap-M43.txt
Normal file
@@ -0,0 +1,65 @@
|
||||
Site Theta Phi
|
||||
1 23 90
|
||||
2 23 30
|
||||
3 23 -30
|
||||
4 23 -90
|
||||
5 -23 30
|
||||
6 -23 -30
|
||||
7 46 74
|
||||
8 46 41
|
||||
9 46 8
|
||||
10 46 -25
|
||||
11 46 -57
|
||||
12 46 -90
|
||||
13 -46 57
|
||||
14 -46 25
|
||||
15 -46 -8
|
||||
16 -46 -41
|
||||
17 -46 -74
|
||||
18 69 76
|
||||
19 69 49
|
||||
20 69 21
|
||||
21 69 -7
|
||||
22 69 -35
|
||||
23 69 -62
|
||||
24 69 -90
|
||||
25 -69 62
|
||||
26 -69 35
|
||||
27 -69 7
|
||||
28 -69 -21
|
||||
29 -69 -49
|
||||
30 -69 -76
|
||||
31 92 90
|
||||
32 92 62
|
||||
33 92 34
|
||||
34 92 6
|
||||
35 92 -21
|
||||
36 92 -49
|
||||
37 92 -76
|
||||
38 -92 76
|
||||
39 -92 49
|
||||
40 -92 21
|
||||
41 -92 -6
|
||||
42 -92 -34
|
||||
43 -92 -62
|
||||
44 115 35
|
||||
45 115 10
|
||||
46 115 -15
|
||||
47 115 -40
|
||||
48 115 -65
|
||||
49 115 -90
|
||||
50 -115 65
|
||||
51 -115 40
|
||||
52 -115 15
|
||||
53 -115 -10
|
||||
54 -115 -35
|
||||
55 138 23
|
||||
56 138 -15
|
||||
57 138 -40
|
||||
58 138 -65
|
||||
59 138 -90
|
||||
60 -138 65
|
||||
61 -138 40
|
||||
62 -138 15
|
||||
63 -138 -23
|
||||
Ref 0 0
|
||||
132
mne/channels/data/montages/mgh60.elc
Normal file
@@ -0,0 +1,132 @@
|
||||
# ASA electrode file
|
||||
ReferenceLabel avg
|
||||
UnitPosition mm
|
||||
NumberPositions= 63
|
||||
Positions
|
||||
-86.0761 -19.9897 -47.9860
|
||||
85.7939 -20.0093 -48.0310
|
||||
0.0083 86.8110 -39.9830
|
||||
-29.4367 83.9171 -6.9900
|
||||
0.1123 88.2470 -1.7130
|
||||
29.8723 84.8959 -7.0800
|
||||
-54.8397 68.5722 -10.5900
|
||||
-33.7007 76.8371 21.2270
|
||||
35.7123 77.7259 21.9560
|
||||
55.7433 69.6568 -10.7550
|
||||
-70.2629 42.4743 -11.4200
|
||||
-64.4658 48.0353 16.9210
|
||||
-50.2438 53.1112 42.1920
|
||||
-27.4958 56.9311 60.3420
|
||||
0.3122 58.5120 66.4620
|
||||
29.5142 57.6019 59.5400
|
||||
51.8362 54.3048 40.8140
|
||||
67.9142 49.8297 16.3670
|
||||
73.0431 44.4217 -12.0000
|
||||
-84.0759 14.5673 -50.4290
|
||||
-80.7750 14.1203 -11.1350
|
||||
-77.2149 18.6433 24.4600
|
||||
-34.0619 26.0111 79.9870
|
||||
34.7841 26.4379 78.8080
|
||||
79.5341 19.9357 24.4380
|
||||
81.8151 15.4167 -11.3300
|
||||
84.1131 14.3647 -50.5380
|
||||
-85.8941 -15.8287 -48.2830
|
||||
-84.1611 -16.0187 -9.3460
|
||||
-80.2801 -13.7597 29.1600
|
||||
-65.3581 -11.6317 64.3580
|
||||
-36.1580 -9.9839 89.7520
|
||||
0.4009 -9.1670 100.2440
|
||||
37.6720 -9.6241 88.4120
|
||||
67.1179 -10.9003 63.5800
|
||||
83.4559 -12.7763 29.2080
|
||||
85.0799 -15.0203 -9.4900
|
||||
85.5599 -16.3613 -48.2710
|
||||
-85.6192 -46.5147 -45.7070
|
||||
-84.8302 -46.0217 -7.0560
|
||||
-63.5562 -47.0088 65.6240
|
||||
-35.5131 -47.2919 91.3150
|
||||
38.3838 -47.0731 90.6950
|
||||
66.6118 -46.6372 65.5800
|
||||
85.5488 -45.5453 -7.1300
|
||||
86.1618 -47.0353 -45.8690
|
||||
-72.4343 -73.4527 -2.4870
|
||||
-67.2723 -76.2907 28.3820
|
||||
-53.0073 -78.7878 55.9400
|
||||
-28.6203 -80.5249 75.4360
|
||||
0.3247 -81.1150 82.6150
|
||||
31.9197 -80.4871 76.7160
|
||||
55.6667 -78.5602 56.5610
|
||||
67.8877 -75.9043 28.0910
|
||||
73.0557 -73.0683 -2.5400
|
||||
-54.8404 -97.5279 2.7920
|
||||
-36.5114 -100.8529 37.1670
|
||||
36.7816 -100.8491 36.3970
|
||||
55.6666 -97.6251 2.7300
|
||||
-29.4134 -112.4490 8.8390
|
||||
0.1076 -114.8920 14.6570
|
||||
29.8426 -112.1560 8.8000
|
||||
0.0045 -118.5650 -23.0780
|
||||
Labels
|
||||
LPA
|
||||
RPA
|
||||
Nz
|
||||
EEG001
|
||||
EEG002
|
||||
EEG003
|
||||
EEG004
|
||||
EEG005
|
||||
EEG006
|
||||
EEG007
|
||||
EEG008
|
||||
EEG009
|
||||
EEG010
|
||||
EEG011
|
||||
EEG012
|
||||
EEG013
|
||||
EEG014
|
||||
EEG015
|
||||
EEG016
|
||||
EEG017
|
||||
EEG018
|
||||
EEG019
|
||||
EEG020
|
||||
EEG021
|
||||
EEG022
|
||||
EEG023
|
||||
EEG024
|
||||
EEG025
|
||||
EEG026
|
||||
EEG027
|
||||
EEG028
|
||||
EEG029
|
||||
EEG030
|
||||
EEG031
|
||||
EEG032
|
||||
EEG033
|
||||
EEG034
|
||||
EEG035
|
||||
EEG036
|
||||
EEG037
|
||||
EEG038
|
||||
EEG039
|
||||
EEG040
|
||||
EEG041
|
||||
EEG042
|
||||
EEG043
|
||||
EEG044
|
||||
EEG045
|
||||
EEG046
|
||||
EEG047
|
||||
EEG048
|
||||
EEG049
|
||||
EEG050
|
||||
EEG051
|
||||
EEG052
|
||||
EEG053
|
||||
EEG054
|
||||
EEG055
|
||||
EEG056
|
||||
EEG057
|
||||
EEG058
|
||||
EEG059
|
||||
EEG060
|
||||