コード例 #1
0
ファイル: montage.py プロジェクト: oscarbenjamin/electro
 def __init__(self, infile, montage, *args, **kwargs):
     """Set montage and initialise EEGFile object"""
     if not montage in MONTAGES:
         msg = "Unrecognised montage: '{0}'".format(montage)
         raise UnrecognisedMontageError(msg)
     self.montage = MONTAGES[montage]
     EEGFile.__init__(self, infile, *args, **kwargs)
コード例 #2
0
ファイル: genfile.py プロジェクト: oscarbenjamin/electro
    def __init__(self, chan_pars, rec_id="Generated Signals", duration=60, sample_rate=200, secsblock=5):
        """Generate and store header information.

        The EEGFile is deemed to have as many channels as there are items in
        chan_pars, which should be a list of dictionaries. The label for each
        channel is taken from chan_pars[n]['label'].
        """

        # Generate channel header from chan_pars item
        def chan_from_pars(cp):
            return Chan(label=cp["label"], dim="uV", calib=1, offset=0, nsblock=int(secsblock * sample_rate), finfo=cp)

        # Initialise
        chan = [chan_from_pars(cp) for cp in chan_pars]
        descr = [(c.label, "i2", c.nsblock) for c in chan]
        descr = BlockDescriptor(descr)

        # Store
        self._head = Head(
            tstart=datetime.datetime.today(),
            nblocks=int(duration // secsblock),
            secsblock=secsblock,
            nchan=len(chan_pars),
            chan=chan,
        )
        self._block_descriptor = descr
        self.nblocks = self._head.nblocks
        self.name = "<genfile>"

        # Pass self in to silence EEGFile
        EEGFile.__init__(self, self)
コード例 #3
0
ファイル: iofile.py プロジェクト: oscarbenjamin/electro
    def __init__(self, eegfile, mode):
        """eegfile can be a path to a file or an open file object.
        mode should be 'r' or 'w'.
        
        1) On Windows if the file object is either sys.stdin or sys.stdout the
        mode will be changed to binary using msvcrt.setmode
        2) The file object must be a 'real' file object not a python
        'file-like' object.
        3) No other code should operate on the file.
        """
        # Accept only real files or file paths
        if not isinstance(eegfile, (file, basestring)):
            raise TypeError("eegfile must be either 'file' or 'string'")
        if not mode in ['r','w']:
            raise ValueError("Mode should be 'r' or 'w'")
        
        # Ensure eegfile is a binary file objects
        if isinstance(eegfile, basestring):
            _mode = mode
            if self._binary:
                _mode += 'b'
            eegfile = open(eegfile, _mode)
        # stdio is in text mode by default on windows
        elif eegfile in STDIO:
            if msvcrt and self._binary:
                msvcrt.setmode(eegfile.fileno(), os.O_BINARY)
        # Don't attempt to change mode if not STDIO
        elif self._binary and 'b' not in eegfile.mode:
            raise IOError("File not opened in binary mode")

        # Check if file object is a pipe
        st = os.fstat(eegfile.fileno())
        if st.st_mode & stat.S_IFIFO:
            seekable = False
            filesize = -1
        else:
            seekable = True
            filesize = st.st_size

        # Store relevant data
        self.__file = eegfile
        self.__fp = 0
        self.mode = mode
        self.seekable = seekable
        self.filesize = filesize

        # Store here just as in EEGFile
        EEGFile.__init__(self, eegfile)
コード例 #4
0
ファイル: montage.py プロジェクト: oscarbenjamin/electro
 def _get_blocks(self, n1, n2):
     """Wraps EEGFile._get_blocks to change the montage of the data"""
     block = EEGFile._get_blocks(self, n1, n2)
     new_block = self._block_descriptor.new(len(block))
     for label, elec1, elec2 in self.indices:
         new_block[label] = block[elec2] - block[elec1]
     return new_block
コード例 #5
0
ファイル: cachefile.py プロジェクト: oscarbenjamin/electro
 def _cache_blocks(self, n2):
     """Cache the first n blocks if not already done"""
     # Retrieve blocks
     n1 = self._last_block
     blockseg = EEGFile._get_blocks(self, n1, n2)
     block_ind = len(self._blocksegments)
     self._blocksegments.append((blockseg, n1))
     for n in range(n1, n2):
         self._blockrefs[n] = block_ind
     self._last_block = n2
コード例 #6
0
ファイル: filterfile.py プロジェクト: oscarbenjamin/electro
 def _get_blocks(self, n1, n2):
     block = EEGFile._get_blocks(self, n1, n2)
     block_new = block.copy()
     # Hopefully the filtering has previously ended on the block before
     initial_states = self._filter_states.get(n1, self._zero_states)
     final_states = []
     for name, f, zi in zip(block.keys(), self._filters, initial_states):
         x_old = block[name]
         x_new, zf = self._apply_filter(x_old, f, zi)
         block_new[name] = numpy.round(x_new)
         final_states.append(zf)
     self._filter_states[n2] = final_states
     # Return as normal
     return block_new
コード例 #7
0
ファイル: cachefile.py プロジェクト: oscarbenjamin/electro
 def __init__(self, *args, **kwargs):
     EEGFile.__init__(self, *args, **kwargs)
     self._blocksegments = []
     self._blockrefs = {}
     self._last_block = 0
コード例 #8
0
ファイル: blockfile.py プロジェクト: oscarbenjamin/electro
 def _get_blocks(self, n1, n2):
     """Wraps EEGFile._get_block to return a different block"""
     n1, n2 = [n + self._n1 for n in (n1, n2)]
     return EEGFile._get_blocks(self, n1, n2)
コード例 #9
0
ファイル: blockfile.py プロジェクト: oscarbenjamin/electro
 def __init__(self, eegfile, n1, n2):
     self._n1 = max(n1, 0)
     self._n2 = n2
     EEGFile.__init__(self, eegfile)