123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128 |
- # -*- coding: utf-8 -*-
- """
- Reading from neuroscope format files.
- Ref: http://neuroscope.sourceforge.net/
- It is an old format from Buzsaki's lab.
- Supported: Read
- #TODO:
- SpikeTrain file '.clu' '.res'
- Event '.ext.evt' or '.evt.ext'
- Author: sgarcia
- """
- # needed for python 3 compatibility
- from __future__ import absolute_import
- import os
- from xml.etree import ElementTree
- import numpy as np
- import quantities as pq
- from neo.io.baseio import BaseIO
- from neo.io.rawbinarysignalio import RawBinarySignalIO
- from neo.core import (Block, Segment, ChannelIndex,
- AnalogSignal)
- class NeuroScopeIO(BaseIO):
- """
- """
- is_readable = True
- is_writable = False
- supported_objects = [ Block, Segment , AnalogSignal, ChannelIndex]
- readable_objects = [ Block ]
- writeable_objects = [ ]
- has_header = False
- is_streameable = False
- read_params = {
- Segment : [ ]
- }
- # do not supported write so no GUI stuff
- write_params = None
- name = 'NeuroScope'
- extensions = [ 'xml' ]
- mode = 'file'
- def __init__(self , filename = None) :
- """
- Arguments:
- filename : the filename
-
- """
- BaseIO.__init__(self)
- self.filename = filename
-
-
- def read_block(self,
- lazy = False,
- cascade = True,
- ):
- """
- """
-
- tree = ElementTree.parse(self.filename)
- root = tree.getroot()
- acq = root.find('acquisitionSystem')
- nbits = int(acq.find('nBits').text)
- nbchannel = int(acq.find('nChannels').text)
- sampling_rate = float(acq.find('samplingRate').text)*pq.Hz
- voltage_range = float(acq.find('voltageRange').text)
- #offset = int(acq.find('offset').text)
- amplification = float(acq.find('amplification').text)
-
- bl = Block(file_origin = os.path.basename(self.filename).replace('.xml', ''))
- if cascade:
- seg = Segment()
- bl.segments.append(seg)
-
- # RCG
- for i, xml_chx in enumerate(root.find('anatomicalDescription').find('channelGroups').findall('group')):
- n_channels = len(xml_chx)
- chx = ChannelIndex(name='Group {0}'.format(i),
- index=np.arange(n_channels, dtype = int))
- chx.channel_ids = np.array([int(xml_rc.text) for xml_rc in xml_chx])
- chx.channel_names = np.array(['Channel{0}'.format(id) for id in chx.channel_ids], dtype = 'S')
- bl.channel_indexes.append(chx)
-
- # AnalogSignals
- reader = RawBinarySignalIO(filename = self.filename.replace('.xml', '.dat'))
- seg2 = reader.read_segment(cascade = True, lazy = lazy,
- sampling_rate = sampling_rate,
- t_start = 0.*pq.s,
- unit = pq.V, nbchannel = nbchannel,
- bytesoffset = 0,
- dtype = np.int16 if nbits<=16 else np.int32,
- rangemin = -voltage_range/2.,
- rangemax = voltage_range/2.,)
- for s, sig in enumerate(seg2.analogsignals):
- if not lazy:
- sig /= amplification
- sig.segment = seg
- seg.analogsignals.append(sig)
- chx.analogsignals.append(sig)
-
- bl.create_many_to_one_relationship()
- return bl
|