From 7b733ab17605865f7ea192968c62456bd2f7deaf Mon Sep 17 00:00:00 2001 From: dengemann Date: Mon, 8 Oct 2012 15:37:32 +0200 Subject: [PATCH 1/2] ENH/WIP: Alternative Constructor for getting new Raw instances from existing plus modified data - use case #1 mixing of ica denoised data - use case #2 other filtering operations - use case #3 'ABC' for reading in externally processed data I added assert statement that makes sure the dimensionality of the external data and the original fiff is compatible. What do you think on this? --- mne/fiff/raw.py | 53 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/mne/fiff/raw.py b/mne/fiff/raw.py index c8085d4427d..db5240b3698 100644 --- a/mne/fiff/raw.py +++ b/mne/fiff/raw.py @@ -11,6 +11,7 @@ import numpy as np from scipy.signal import hilbert +from copy import deepcopy from .constants import FIFF from .open import fiff_open @@ -903,6 +904,58 @@ def _update_projector(self): return False +class RawFromMerge(Raw): + """ Initializes new raw instance from exisiting raw and custom data + Paramerters + ----------- + raw : instance of mne.fiff.Raw + existing raw instance + data : instance of numpy.core.ndarray + processed data matching the data contained by raw + + Attributes + ---------- + See __doc__ of mne.fiff.Raw + """ + def __init__(self, raw, data, info=None): + + print 'Initializing raw object from merge with custom data.' + + ntsl = (raw.last_samp - raw.first_samp) + 1 + nchan = len(raw.ch_names) + assert (nchan, ntsl) == data.shape + + raw = deepcopy(raw) + if info == None: + info = raw.info + + self.info = info + self._data = data + self.first_samp, self.last_samp = raw.first_samp, raw.last_samp + cals = np.zeros(info['nchan']) + for k in range(info['nchan']): + cals[k] = info['chs'][k]['range'] * \ + info['chs'][k]['cal'] + + self.cals = raw.cals + self.rawdir = raw.rawdir + self.proj = raw.proj + self.comp = raw.comp + + self.verbose = True + if self.verbose: + print ' Range : %d ... %d = %9.3f ... %9.3f secs' % ( + self.first_samp, self.last_samp, + float(self.first_samp) / info['sfreq'], + float(self.last_samp) / info['sfreq']) + print 'Ready.' + self.fid = None + self._preloaded = True + self._times = np.arange(self.first_samp, + self.last_samp + 1) / info['sfreq'] + del raw + + class _RawShell(): """Used for creating a temporary raw object""" def __init__(self): From 45567202a9bad6475d021685449cce2925bb8c7c Mon Sep 17 00:00:00 2001 From: dengemann Date: Mon, 8 Oct 2012 18:16:31 +0200 Subject: [PATCH 2/2] FIX catching up with most recent raw attrs - adding automatic attr setter for private attributes to RawFromMerge --- mne/fiff/raw.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/mne/fiff/raw.py b/mne/fiff/raw.py index db5240b3698..b678350a2e4 100644 --- a/mne/fiff/raw.py +++ b/mne/fiff/raw.py @@ -938,7 +938,7 @@ def __init__(self, raw, data, info=None): info['chs'][k]['cal'] self.cals = raw.cals - self.rawdir = raw.rawdir + self.rawdirs = raw.rawdirs self.proj = raw.proj self.comp = raw.comp @@ -953,6 +953,11 @@ def __init__(self, raw, data, info=None): self._preloaded = True self._times = np.arange(self.first_samp, self.last_samp + 1) / info['sfreq'] + + for name, value in raw.__dict__.items(): + if name not in self.__dict__: + setattr(self, name, value) + del raw