Esempio n. 1
0
    def _handleEvent(self, event):
        try:
            eventClass = None

            if self.checkForExperimentAndSessionIDs(event) is False:
                return False

            etype = event[DeviceEvent.EVENT_TYPE_ID_INDEX]

            #            print2err("*** ",DeviceEvent.EVENT_TYPE_ID_INDEX, '_handleEvent: ',etype,' : event list: ',event)
            eventClass = EventConstants.getClass(etype)

            etable = self.TABLES[eventClass.IOHUB_DATA_TABLE]
            event[DeviceEvent.
                  EVENT_EXPERIMENT_ID_INDEX] = self.active_experiment_id
            event[DeviceEvent.EVENT_SESSION_ID_INDEX] = self.active_session_id

            np_array = N.array([
                tuple(event),
            ], dtype=eventClass.NUMPY_DTYPE)
            etable.append(np_array)

            self.bufferedFlush()

        except:
            print2err("Error saving event: ", event)
            printExceptionDetailsToStdErr()
Esempio n. 2
0
 def flush(self):
     try:
         if self.emrtFile:
             self.emrtFile.flush()
     except ClosedFileError:
         pass
     except:
         printExceptionDetailsToStdErr()
Esempio n. 3
0
 def flush(self):
     try:
         if self.emrtFile:
             self.emrtFile.flush()
     except ClosedFileError:
         pass
     except:
         printExceptionDetailsToStdErr()
Esempio n. 4
0
 def _initializeConditionVariableTable(self,experiment_id,np_dtype):
     experimentConditionVariableTable=None
     self._EXP_COND_DTYPE=N.dtype(np_dtype)
     try:
         expCondTableName="EXP_CV_%d"%(experiment_id)
         experimentConditionVariableTable=self.emrtFile.root.data_collection.condition_variables._f_getChild(expCondTableName)
         self.TABLES['EXP_CV']=experimentConditionVariableTable
     except NoSuchNodeError, nsne:
         try:
             experimentConditionVariableTable=self.emrtFile.createTable(self.emrtFile.root.data_collection.condition_variables,expCondTableName,self._EXP_COND_DTYPE,title='Condition Variables for Experiment id %d'%(experiment_id))
             self.TABLES['EXP_CV']=experimentConditionVariableTable
             self.emrtFile.flush()
         except:
             printExceptionDetailsToStdErr()
             return False
Esempio n. 5
0
    def _addRowToConditionVariableTable(self,session_id,data):
        if self.emrtFile and 'EXP_CV' in self.TABLES and self._EXP_COND_DTYPE is not None:
            try:
                etable=self.TABLES['EXP_CV']

                for i,d in enumerate(data):
                    if isinstance(d,(list,tuple)):
                        data[i]=tuple(d)

                np_array= N.array([tuple(data),],dtype=self._EXP_COND_DTYPE)
                etable.append(np_array)

                self.bufferedFlush()
                return True

            except:
                printExceptionDetailsToStdErr()
        return False
Esempio n. 6
0
    def _addRowToConditionVariableTable(self, session_id, data):
        if self.emrtFile and 'EXP_CV' in self.TABLES and self._EXP_COND_DTYPE is not None:
            try:
                etable = self.TABLES['EXP_CV']

                for i, d in enumerate(data):
                    if isinstance(d, (list, tuple)):
                        data[i] = tuple(d)

                np_array = N.array([
                    tuple(data),
                ], dtype=self._EXP_COND_DTYPE)
                etable.append(np_array)

                self.bufferedFlush()
                return True

            except:
                printExceptionDetailsToStdErr()
        return False
Esempio n. 7
0
 def _initializeConditionVariableTable(self, experiment_id, np_dtype):
     experimentConditionVariableTable = None
     self._EXP_COND_DTYPE = N.dtype(np_dtype)
     try:
         expCondTableName = "EXP_CV_%d" % (experiment_id)
         experimentConditionVariableTable = self.emrtFile.root.data_collection.condition_variables._f_getChild(
             expCondTableName)
         self.TABLES['EXP_CV'] = experimentConditionVariableTable
     except NoSuchNodeError, nsne:
         try:
             experimentConditionVariableTable = self.emrtFile.createTable(
                 self.emrtFile.root.data_collection.condition_variables,
                 expCondTableName,
                 self._EXP_COND_DTYPE,
                 title='Condition Variables for Experiment id %d' %
                 (experiment_id))
             self.TABLES['EXP_CV'] = experimentConditionVariableTable
             self.emrtFile.flush()
         except:
             printExceptionDetailsToStdErr()
             return False
Esempio n. 8
0
    def _handleEvent(self, event):
        try:
            eventClass=None

            if self.checkForExperimentAndSessionIDs(event) is False:
                return False

            etype=event[DeviceEvent.EVENT_TYPE_ID_INDEX]

#            print2err("*** ",DeviceEvent.EVENT_TYPE_ID_INDEX, '_handleEvent: ',etype,' : event list: ',event)
            eventClass=EventConstants.getClass(etype)
                
            etable=self.TABLES[eventClass.IOHUB_DATA_TABLE]
            event[DeviceEvent.EVENT_EXPERIMENT_ID_INDEX]=self.active_experiment_id
            event[DeviceEvent.EVENT_SESSION_ID_INDEX]=self.active_session_id

            np_array= N.array([tuple(event),],dtype=eventClass.NUMPY_DTYPE)
            etable.append(np_array)

            self.bufferedFlush()

        except:
            print2err("Error saving event: ",event)
            printExceptionDetailsToStdErr()
Esempio n. 9
0
            np_events=[]
            for event in events:
                event[DeviceEvent.EVENT_EXPERIMENT_ID_INDEX]=self.active_experiment_id
                event[DeviceEvent.EVENT_SESSION_ID_INDEX]=self.active_session_id
                np_events.append(tuple(event))

            np_array= N.array(np_events,dtype=eventClass.NUMPY_DTYPE)
            #ioHub.print2err('np_array:',np_array)
            etable.append(np_array)

            self.bufferedFlush(len(np_events))

        except ioHubError, e:
            print2err(e)
        except:
            printExceptionDetailsToStdErr()

    def bufferedFlush(self,eventCount=1):
        # if flushCounter threshold is >=0 then do some checks. If it is < 0, then
        # flush only occurs when command is sent to ioHub, so do nothing here.
        if self.flushCounter>=0:
            if self.flushCounter==0:
                self.flush()
                return True
            if self.flushCounter<=self._eventCounter:
                self.flush()
                self._eventCounter=0
                return True
            self._eventCounter+=eventCount
            return False
Esempio n. 10
0
class ioHubpyTablesFile():
    def __init__(self, fileName, folderPath, fmode='a', ioHubsettings=None):
        self.fileName = fileName
        self.folderPath = folderPath
        self.filePath = os.path.join(folderPath, fileName)

        self.settings = ioHubsettings

        self.active_experiment_id = None
        self.active_session_id = None

        self.flushCounter = self.settings.get('flush_interval', 32)
        self._eventCounter = 0

        self.TABLES = dict()
        self._eventGroupMappings = dict()
        self.emrtFile = openFile(self.filePath, mode=fmode)

        atexit.register(close_open_data_files, False)

        if len(self.emrtFile.title) == 0:
            self.buildOutTemplate()
            self.flush()
        else:
            self.loadTableMappings()

    def updateDataStoreStructure(self, device_instance, event_class_dict):
        dfilter = Filters(complevel=0,
                          complib='zlib',
                          shuffle=False,
                          fletcher32=False)

        def eventTableLabel2ClassName(event_table_label):
            tokens = str(event_table_label[0] + event_table_label[1:].lower() +
                         'Event').split('_')
            return ''.join([t[0].upper() + t[1:] for t in tokens])

        for event_cls_name, event_cls in event_class_dict.iteritems():
            if event_cls.IOHUB_DATA_TABLE:
                event_table_label = event_cls.IOHUB_DATA_TABLE
                if event_table_label not in self.TABLES:
                    self.TABLES[event_table_label] = self.emrtFile.createTable(
                        self._eventGroupMappings[event_table_label],
                        eventTableLabel2ClassName(event_table_label),
                        event_cls.NUMPY_DTYPE,
                        title="%s %s Data" %
                        (device_instance.__class__.__name__,
                         eventTableLabel2ClassName(event_table_label)),
                        filters=dfilter.copy())
                    self.flush()

                self.addClassMapping(event_cls, self.TABLES[event_table_label])

    def loadTableMappings(self):
        # create meta-data tables

        self._buildEventGroupMappingDict()

        self.TABLES[
            'EXPERIMENT_METADETA'] = self.emrtFile.root.data_collection.experiment_meta_data
        self.TABLES[
            'SESSION_METADETA'] = self.emrtFile.root.data_collection.session_meta_data
        self.TABLES[
            'CLASS_TABLE_MAPPINGS'] = self.emrtFile.root.class_table_mapping

        # create tables dict of hdf5 path mappings

        try:
            self.TABLES[
                'KEYBOARD_KEY'] = self.emrtFile.root.data_collection.events.keyboard.KeyboardKeyEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'KEYBOARD_CHAR'] = self.emrtFile.root.data_collection.events.keyboard.KeyboardCharEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'MOUSE_INPUT'] = self.emrtFile.root.data_collection.events.mouse.MouseInputEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'GAMEPAD_STATE_CHANGE'] = self.emrtFile.root.data_collection.events.gamepad.GamepadStateChangeEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'MESSAGE'] = self.emrtFile.root.data_collection.events.experiment.MessageEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'LOG'] = self.emrtFile.root.data_collection.events.experiment.LogEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'MULTI_CHANNEL_ANALOG_INPUT'] = self.emrtFile.root.data_collection.events.analog_input.MultiChannelAnalogInputEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'MONOCULAR_EYE_SAMPLE'] = self.emrtFile.root.data_collection.events.eyetracker.MonocularEyeSampleEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'BINOCULAR_EYE_SAMPLE'] = self.emrtFile.root.data_collection.events.eyetracker.BinocularEyeSampleEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'FIXATION_START'] = self.emrtFile.root.data_collection.events.eyetracker.FixationStartEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'FIXATION_END'] = self.emrtFile.root.data_collection.events.eyetracker.FixationEndEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'SACCADE_START'] = self.emrtFile.root.data_collection.events.eyetracker.SaccadeStartEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'SACCADE_END'] = self.emrtFile.root.data_collection.events.eyetracker.SaccadeEndEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'BLINK_START'] = self.emrtFile.root.data_collection.events.eyetracker.BlinkStartEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

        try:
            self.TABLES[
                'BLINK_END'] = self.emrtFile.root.data_collection.events.eyetracker.BlinkEndEvent
        except:
            # Just means the table for this event type has not been created as the event type is not being recorded
            pass

    def buildOutTemplate(self):
        self.emrtFile.title = DATA_FILE_TITLE
        self.emrtFile.FILE_VERSION = FILE_VERSION
        self.emrtFile.SCHEMA_DESIGNER = SCHEMA_AUTHORS
        self.emrtFile.SCHEMA_MODIFIED = SCHEMA_MODIFIED_DATE

        #CREATE GROUPS

        self.emrtFile.createGroup(
            self.emrtFile.root,
            'analysis',
            title=
            'Data Analysis Files, notebooks, scripts and saved results tables.'
        )
        self.emrtFile.createGroup(
            self.emrtFile.root,
            'data_collection',
            title='Data Collected from Experiment Sessions')
        self.flush()

        self.emrtFile.createGroup(
            self.emrtFile.root.data_collection,
            'events',
            title='Events that occurred and were saved during the experiments.'
        )

        self.emrtFile.createGroup(
            self.emrtFile.root.data_collection,
            'condition_variables',
            title=
            'Experiment DV and IVs used during and experiment session, or calculated and stored. In general, each row represents one trial of an experiment session.'
        )
        self.flush()

        self.TABLES['CLASS_TABLE_MAPPINGS'] = self.emrtFile.createTable(
            self.emrtFile.root,
            'class_table_mapping',
            ClassTableMappings,
            title='Mapping of ioObjects Classes to ioHub tables')

        self.TABLES['EXPERIMENT_METADETA'] = self.emrtFile.createTable(
            self.emrtFile.root.data_collection,
            'experiment_meta_data',
            ExperimentMetaData,
            title='Different Experiments Paradigms that have been run')
        self.TABLES['SESSION_METADETA'] = self.emrtFile.createTable(
            self.emrtFile.root.data_collection,
            'session_meta_data',
            SessionMetaData,
            title='Session run for the various experiments.')
        self.flush()

        self.emrtFile.createGroup(self.emrtFile.root.data_collection.events,
                                  'experiment',
                                  title='Experiment Generated Events')
        self.emrtFile.createGroup(self.emrtFile.root.data_collection.events,
                                  'keyboard',
                                  title='Keyboard Created Events')
        self.emrtFile.createGroup(self.emrtFile.root.data_collection.events,
                                  'mouse',
                                  title='Mouse Device Created Events')
        self.emrtFile.createGroup(self.emrtFile.root.data_collection.events,
                                  'gamepad',
                                  title='GamePad Created Events')
        self.emrtFile.createGroup(self.emrtFile.root.data_collection.events,
                                  'analog_input',
                                  title='AnalogInput Device Created Events')
        self.emrtFile.createGroup(self.emrtFile.root.data_collection.events,
                                  'eyetracker',
                                  title='Eye Tracker Generated Events')
        self.flush()

        self._buildEventGroupMappingDict()

    def _buildEventGroupMappingDict(self):
        self._eventGroupMappings[
            'KEYBOARD_KEY'] = self.emrtFile.root.data_collection.events.keyboard
        self._eventGroupMappings[
            'KEYBOARD_CHAR'] = self.emrtFile.root.data_collection.events.keyboard
        self._eventGroupMappings[
            'MOUSE_INPUT'] = self.emrtFile.root.data_collection.events.mouse
        self._eventGroupMappings[
            'GAMEPAD_STATE_CHANGE'] = self.emrtFile.root.data_collection.events.gamepad
        self._eventGroupMappings[
            'MULTI_CHANNEL_ANALOG_INPUT'] = self.emrtFile.root.data_collection.events.analog_input
        self._eventGroupMappings[
            'MESSAGE'] = self.emrtFile.root.data_collection.events.experiment
        self._eventGroupMappings[
            'LOG'] = self.emrtFile.root.data_collection.events.experiment
        self._eventGroupMappings[
            'MONOCULAR_EYE_SAMPLE'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'BINOCULAR_EYE_SAMPLE'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'FIXATION_START'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'FIXATION_END'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'SACCADE_START'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'SACCADE_END'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'BLINK_START'] = self.emrtFile.root.data_collection.events.eyetracker
        self._eventGroupMappings[
            'BLINK_END'] = self.emrtFile.root.data_collection.events.eyetracker

    def addClassMapping(self, ioClass, ctable):
        names = [
            x['class_id'] for x in self.TABLES['CLASS_TABLE_MAPPINGS'].where(
                "(class_id == %d)" % (ioClass.EVENT_TYPE_ID))
        ]
        if len(names) == 0:
            trow = self.TABLES['CLASS_TABLE_MAPPINGS'].row
            trow['class_id'] = ioClass.EVENT_TYPE_ID
            trow['class_type_id'] = 1  # Device or Event etc.
            trow['class_name'] = ioClass.__name__
            trow['table_path'] = ctable._v_pathname
            trow.append()
            self.flush()

    def createOrUpdateExperimentEntry(self, experimentInfoList):
        #ioHub.print2err("createOrUpdateExperimentEntry called with: ",experimentInfoList)
        experiment_metadata = self.TABLES['EXPERIMENT_METADETA']

        result = [
            row for row in experiment_metadata.iterrows()
            if row['code'] == experimentInfoList[1]
        ]
        if len(result) > 0:
            result = result[0]
            self.active_experiment_id = result['experiment_id']
            return self.active_experiment_id

        max_id = 0
        id_col = experiment_metadata.col('experiment_id')

        if len(id_col) > 0:
            max_id = N.amax(id_col)

        self.active_experiment_id = max_id + 1
        experimentInfoList[0] = self.active_experiment_id
        experiment_metadata.append([
            experimentInfoList,
        ])
        self.flush()
        #ioHub.print2err("Experiment ID set to: ",self.active_experiment_id)
        return self.active_experiment_id

    def createExperimentSessionEntry(self, sessionInfoDict):
        #ioHub.print2err("createExperimentSessionEntry called with: ",sessionInfoDict)
        session_metadata = self.TABLES['SESSION_METADETA']

        max_id = 0
        id_col = session_metadata.col('session_id')
        if len(id_col) > 0:
            max_id = N.amax(id_col)

        self.active_session_id = int(max_id + 1)

        values = (self.active_session_id, self.active_experiment_id,
                  sessionInfoDict['code'], sessionInfoDict['name'],
                  sessionInfoDict['comments'],
                  sessionInfoDict['user_variables'])
        session_metadata.append([
            values,
        ])
        self.flush()

        #ioHub.print2err("Session ID set to: ",self.active_session_id)
        return self.active_session_id

    def _initializeConditionVariableTable(self, experiment_id, np_dtype):
        experimentConditionVariableTable = None
        self._EXP_COND_DTYPE = N.dtype(np_dtype)
        try:
            expCondTableName = "EXP_CV_%d" % (experiment_id)
            experimentConditionVariableTable = self.emrtFile.root.data_collection.condition_variables._f_getChild(
                expCondTableName)
            self.TABLES['EXP_CV'] = experimentConditionVariableTable
        except NoSuchNodeError, nsne:
            try:
                experimentConditionVariableTable = self.emrtFile.createTable(
                    self.emrtFile.root.data_collection.condition_variables,
                    expCondTableName,
                    self._EXP_COND_DTYPE,
                    title='Condition Variables for Experiment id %d' %
                    (experiment_id))
                self.TABLES['EXP_CV'] = experimentConditionVariableTable
                self.emrtFile.flush()
            except:
                printExceptionDetailsToStdErr()
                return False
        except Exception:
            print2err(
                'Error getting experimentConditionVariableTable for experiment %d, table name: %s'
                % (experiment_id, expCondTableName))
            printExceptionDetailsToStdErr()
            return False
Esempio n. 11
0
                event[DeviceEvent.
                      EVENT_EXPERIMENT_ID_INDEX] = self.active_experiment_id
                event[DeviceEvent.
                      EVENT_SESSION_ID_INDEX] = self.active_session_id
                np_events.append(tuple(event))

            np_array = N.array(np_events, dtype=eventClass.NUMPY_DTYPE)
            #ioHub.print2err('np_array:',np_array)
            etable.append(np_array)

            self.bufferedFlush(len(np_events))

        except ioHubError, e:
            print2err(e)
        except:
            printExceptionDetailsToStdErr()

    def bufferedFlush(self, eventCount=1):
        # if flushCounter threshold is >=0 then do some checks. If it is < 0, then
        # flush only occurs when command is sent to ioHub, so do nothing here.
        if self.flushCounter >= 0:
            if self.flushCounter == 0:
                self.flush()
                return True
            if self.flushCounter <= self._eventCounter:
                self.flush()
                self._eventCounter = 0
                return True
            self._eventCounter += eventCount
            return False