initial commit

This commit is contained in:
2025-08-19 09:13:22 -07:00
parent 28464811d6
commit 0977a3e14d
820 changed files with 1003358 additions and 2 deletions

View File

@@ -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).
[![Python web site](https://img.shields.io/badge/Made%20with-Python-1f425f.svg)](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

File diff suppressed because it is too large Load Diff

255
flares_updater.py Normal file
View 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()

View 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

View 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

View 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

View 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
View File

@@ -0,0 +1,2 @@
[LocalizedFileNames]
updater.png=@updater.png,0

View 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

View 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

View 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

View 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

View 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

View 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

Binary file not shown.

BIN
icons/main.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 214 KiB

View 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

View 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

View 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

Binary file not shown.

BIN
icons/updater.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 208 KiB

1725
main.py Normal file

File diff suppressed because it is too large Load Diff

36
mne/__init__.py Normal file
View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

189
mne/_fiff/ctf_comp.py Normal file
View 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
View 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

File diff suppressed because it is too large Load Diff

386
mne/_fiff/open.py Normal file
View 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

File diff suppressed because it is too large Load Diff

345
mne/_fiff/proc_history.py Normal file
View 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

File diff suppressed because it is too large Load Diff

738
mne/_fiff/reference.py Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load Diff

224
mne/baseline.py Normal file
View 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

View 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__)

View 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

View 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
View 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
View 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,
)

View 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)

View 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

File diff suppressed because it is too large Load Diff

12
mne/channels/__init__.py Normal file
View 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
View 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,
)

View 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",
)

View 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

File diff suppressed because it is too large Load Diff

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

View 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

Some files were not shown because too many files have changed in this diff Show More