Пример #1
0
    def calculate_results(self,trialIndex):
        # -- Find outcomeMode for this trial --
        outcomeModeID = self.params.history['outcomeMode'][trialIndex]
        outcomeModeString = self.params['outcomeMode'].get_items()[outcomeModeID]

        eventsThisTrial = self.dispatcherModel.events_one_trial(trialIndex)
        #print eventsThisTrial
        statesThisTrial = eventsThisTrial[:,2]

        # -- Find beginning of trial --
        startTrialStateID = self.sm.statesNameToIndex['startTrial']
        # FIXME: Next line seems inefficient. Is there a better way?
        startTrialInd = np.flatnonzero(statesThisTrial==startTrialStateID)[0]
        self.results['timeTrialStart'][trialIndex] = eventsThisTrial[startTrialInd,0]
        #print 'TrialStart : {0}'.format(self.results['timeTrialStart'][trialIndex]) ### DEBUG

        # ===== Calculate times of events =====
        # -- Check if it's an aborted trial --
        lastEvent = eventsThisTrial[-1,:]
        if lastEvent[1]==-1 and lastEvent[2]==0:
            self.results['timeTarget'][trialIndex] = np.nan
            self.results['timeCenterIn'][trialIndex] = np.nan
            self.results['timeCenterOut'][trialIndex] = np.nan
            self.results['timeSideIn'][trialIndex] = np.nan
        # -- Otherwise evaluate times of important events --
        else:
            # -- Store time of stimulus --
            targetStateID = self.sm.statesNameToIndex['playNoiseStimulus']
            targetEventInd = np.flatnonzero(statesThisTrial==targetStateID)[0]
            self.results['timeTarget'][trialIndex] = eventsThisTrial[targetEventInd,0]

            # -- Find center poke-in time --
            if outcomeModeString in ['on_next_correct','only_if_correct']:
                seqCin = [self.sm.statesNameToIndex['waitForCenterPoke'],
                          self.sm.statesNameToIndex['delayPeriod'],
                          self.sm.statesNameToIndex['playNoiseStimulus']]
            elif outcomeModeString in ['simulated','sides_direct','direct']:
                seqCin = [self.sm.statesNameToIndex['waitForCenterPoke'],
                          self.sm.statesNameToIndex['playNoiseStimulus']]
            else:
                print 'CenterIn time cannot be calculated for this Outcome Mode.'
            seqPos = np.flatnonzero(utils.find_state_sequence(statesThisTrial,seqCin))
            timeValue = eventsThisTrial[seqPos[0]+1,0] if len(seqPos) else np.nan
            self.results['timeCenterIn'][trialIndex] = timeValue

            # -- Find center poke-out time --
            if len(seqPos):
                cInInd = seqPos[0]+1
                cOutInd = np.flatnonzero(eventsThisTrial[cInInd:,1]==self.sm.eventsDict['Cout'])
                timeValue = eventsThisTrial[cOutInd[0]+cInInd,0] if len(cOutInd) else np.nan
            else:
                timeValue = np.nan
            self.results['timeCenterOut'][trialIndex] = timeValue

            # -- Find side poke time --
            if outcomeModeString in ['on_next_correct','only_if_correct']:
                leftInInd = utils.find_transition(statesThisTrial,
                                                  self.sm.statesNameToIndex['waitForSidePoke'],
                                                  self.sm.statesNameToIndex['choiceLeft'])
                rightInInd = utils.find_transition(statesThisTrial,
                                                   self.sm.statesNameToIndex['waitForSidePoke'],
                                                   self.sm.statesNameToIndex['choiceRight'])
                if len(leftInInd):
                    timeValue = eventsThisTrial[leftInInd[0],0]
                elif len(rightInInd):
                    timeValue = eventsThisTrial[rightInInd[0],0]
                else:
                    timeValue = np.nan
            elif outcomeModeString in ['simulated','sides_direct','direct']:
                timeValue = np.nan
            self.results['timeSideIn'][trialIndex] = timeValue

        # ===== Calculate choice and outcome =====
        # -- Check if it's an aborted trial --
        lastEvent = eventsThisTrial[-1,:]
        if lastEvent[1]==-1 and lastEvent[2]==0:
            self.results['outcome'][trialIndex] = self.results.labels['outcome']['aborted']
            self.results['choice'][trialIndex] = self.results.labels['choice']['none']
        # -- Otherwise evaluate 'choice' and 'outcome' --
        else:
            if outcomeModeString in ['simulated','sides_direct','direct']:
                self.results['outcome'][trialIndex] = self.results.labels['outcome']['free']
                self.results['choice'][trialIndex] = self.results.labels['choice']['none']
                self.params['nValid'].add(1)
                self.params['nRewarded'].add(1)
                self.results['valid'][trialIndex] = 1
            if outcomeModeString=='on_next_correct' or outcomeModeString=='only_if_correct':
                if self.sm.statesNameToIndex['choiceLeft'] in eventsThisTrial[:,2]:
                    self.results['choice'][trialIndex] = self.results.labels['choice']['left']
                elif self.sm.statesNameToIndex['choiceRight'] in eventsThisTrial[:,2]:
                    self.results['choice'][trialIndex] = self.results.labels['choice']['right']
                else:
                    self.results['choice'][trialIndex] = self.results.labels['choice']['none']
                    self.results['outcome'][trialIndex] = \
                        self.results.labels['outcome']['nochoice']
                if self.sm.statesNameToIndex['reward'] in eventsThisTrial[:,2]:
                   self.results['outcome'][trialIndex] = \
                        self.results.labels['outcome']['correct']
                   self.params['nRewarded'].add(1)
                   if outcomeModeString=='on_next_correct' and \
                           self.sm.statesNameToIndex['keepWaitForSide'] in eventsThisTrial[:,2]:
                       self.results['outcome'][trialIndex] = \
                           self.results.labels['outcome']['aftererror']
                else:
                    #if self.sm.statesNameToIndex['earlyWithdrawal'] in eventsThisTrial[:,2]:
                    #    self.results['outcome'][trialIndex] = \
                    #        self.results.labels['outcome']['invalid']
                    if self.sm.statesNameToIndex['punish'] in eventsThisTrial[:,2]:
                        self.results['outcome'][trialIndex] = \
                            self.results.labels['outcome']['error']
                # -- Check if it was a valid trial --
                if self.sm.statesNameToIndex['playNoiseStimulus'] in eventsThisTrial[:,2]:
                    self.params['nValid'].add(1)
                    self.results['valid'][trialIndex] = 1
    def calculate_results(self, trialIndex):
        # -- Find outcomeMode for this trial --
        outcomeModeID = self.params.history['outcomeMode'][trialIndex]
        outcomeModeString = self.params['outcomeMode'].get_items(
        )[outcomeModeID]

        eventsThisTrial = self.dispatcherModel.events_one_trial(trialIndex)
        #print eventsThisTrial
        statesThisTrial = eventsThisTrial[:, 2]

        # -- Find beginning of trial --
        startTrialStateID = self.sm.statesNameToIndex['startTrial']
        # XFIXME: Next line seems inefficient. Is there a better way?
        startTrialInd = np.flatnonzero(statesThisTrial == startTrialStateID)[0]
        self.results['timeTrialStart'][trialIndex] = eventsThisTrial[
            startTrialInd, 0]
        #print 'TrialStart : {0}'.format(self.results['timeTrialStart'][trialIndex]) ### DEBUG

        # ===== Calculate times of events =====
        # -- Check if it's an aborted trial --
        lastEvent = eventsThisTrial[-1, :]
        if lastEvent[1] == -1 and lastEvent[2] == 0:
            self.results['timeTarget'][trialIndex] = np.nan
            self.results['timeCenterIn'][trialIndex] = np.nan
            self.results['timeCenterOut'][trialIndex] = np.nan
            self.results['timeSideIn'][trialIndex] = np.nan
        # -- Otherwise evaluate times of important events --
        else:
            # -- Store time of stimulus --
            targetStateID = self.sm.statesNameToIndex['playStimulus']
            targetEventInd = np.flatnonzero(
                statesThisTrial == targetStateID)[0]
            self.results['timeTarget'][trialIndex] = eventsThisTrial[
                targetEventInd, 0]

            # -- Find center poke-in time --
            if outcomeModeString in ['on_next_correct', 'only_if_correct']:
                seqCin = [
                    self.sm.statesNameToIndex['waitForCenterPoke'],
                    self.sm.statesNameToIndex['delayPeriod'],
                    self.sm.statesNameToIndex['playStimulus']
                ]
            elif outcomeModeString in ['simulated', 'sides_direct', 'direct']:
                seqCin = [
                    self.sm.statesNameToIndex['waitForCenterPoke'],
                    self.sm.statesNameToIndex['playStimulus']
                ]
            else:
                print 'CenterIn time cannot be calculated for this Outcome Mode.'
            seqPos = np.flatnonzero(
                utils.find_state_sequence(statesThisTrial, seqCin))
            timeValue = eventsThisTrial[seqPos[0] + 1,
                                        0] if len(seqPos) else np.nan
            self.results['timeCenterIn'][trialIndex] = timeValue

            # -- Find center poke-out time --
            if len(seqPos):
                cInInd = seqPos[0] + 1
                cOutInd = np.flatnonzero(
                    eventsThisTrial[cInInd:, 1] == self.sm.eventsDict['Cout'])
                timeValue = eventsThisTrial[cOutInd[0] + cInInd,
                                            0] if len(cOutInd) else np.nan
            else:
                timeValue = np.nan
            self.results['timeCenterOut'][trialIndex] = timeValue

            # -- Find side poke time --
            if outcomeModeString in ['on_next_correct', 'only_if_correct']:
                leftInInd = utils.find_transition(
                    statesThisTrial,
                    self.sm.statesNameToIndex['waitForSidePoke'],
                    self.sm.statesNameToIndex['choiceLeft'])
                rightInInd = utils.find_transition(
                    statesThisTrial,
                    self.sm.statesNameToIndex['waitForSidePoke'],
                    self.sm.statesNameToIndex['choiceRight'])
                if len(leftInInd):
                    timeValue = eventsThisTrial[leftInInd[0], 0]
                elif len(rightInInd):
                    timeValue = eventsThisTrial[rightInInd[0], 0]
                else:
                    timeValue = np.nan
            elif outcomeModeString in ['simulated', 'sides_direct', 'direct']:
                timeValue = np.nan
            self.results['timeSideIn'][trialIndex] = timeValue

        # ===== Calculate choice and outcome =====
        # -- Check if it's an aborted trial --
        lastEvent = eventsThisTrial[-1, :]
        if lastEvent[1] == -1 and lastEvent[2] == 0:
            self.results['outcome'][trialIndex] = self.results.labels[
                'outcome']['aborted']
            self.results['choice'][trialIndex] = self.results.labels['choice'][
                'none']
        # -- Otherwise evaluate 'choice' and 'outcome' --
        else:
            if outcomeModeString in ['simulated', 'sides_direct', 'direct']:
                self.results['outcome'][trialIndex] = self.results.labels[
                    'outcome']['free']
                self.results['choice'][trialIndex] = self.results.labels[
                    'choice']['none']
                self.params['nValid'].add(1)
                self.params['nRewarded'].add(1)
                self.results['valid'][trialIndex] = 1
            if outcomeModeString == 'on_next_correct' or outcomeModeString == 'only_if_correct':
                if self.sm.statesNameToIndex[
                        'choiceLeft'] in eventsThisTrial[:, 2]:
                    self.results['choice'][trialIndex] = self.results.labels[
                        'choice']['left']
                elif self.sm.statesNameToIndex[
                        'choiceRight'] in eventsThisTrial[:, 2]:
                    self.results['choice'][trialIndex] = self.results.labels[
                        'choice']['right']
                else:
                    self.results['choice'][trialIndex] = self.results.labels[
                        'choice']['none']
                    self.results['outcome'][trialIndex] = \
                        self.results.labels['outcome']['nochoice']
                if self.sm.statesNameToIndex['reward'] in eventsThisTrial[:,
                                                                          2]:
                    self.results['outcome'][trialIndex] = \
                         self.results.labels['outcome']['correct']
                    self.params['nRewarded'].add(1)
                    if outcomeModeString=='on_next_correct' and \
                            self.sm.statesNameToIndex['keepWaitForSide'] in eventsThisTrial[:,2]:
                        self.results['outcome'][trialIndex] = \
                            self.results.labels['outcome']['aftererror']
                else:
                    if self.sm.statesNameToIndex[
                            'earlyWithdrawal'] in eventsThisTrial[:, 2]:
                        self.results['outcome'][trialIndex] = \
                            self.results.labels['outcome']['invalid']
                    elif self.sm.statesNameToIndex[
                            'punish'] in eventsThisTrial[:, 2]:
                        self.results['outcome'][trialIndex] = \
                            self.results.labels['outcome']['error']
            # -- Check if it was a valid trial --
                if self.sm.statesNameToIndex[
                        'waitForSidePoke'] in eventsThisTrial[:, 2]:
                    self.params['nValid'].add(1)
                    self.results['valid'][trialIndex] = 1
    def calculate_results(self, trialIndex):
        #choice = self.results['choice']
        #choiceLabels = self.results.labels['choice']
        eventsThisTrial = self.dispatcherModel.events_one_trial(trialIndex)

        # -- Find beginning of trial --
        startTrialStateID = self.sm.statesNameToIndex['start_trial']
        startTrialInd = np.flatnonzero(
            eventsThisTrial[:, 2] == startTrialStateID)[0]
        self.results['timeTrialStart'][trialIndex] = eventsThisTrial[
            startTrialInd, 0]

        # -- Find valid center-port-in time --
        # XFIXME: be wiser when calculating the times (first may not be the right one)
        waitForCpokeStateID = self.sm.statesNameToIndex['wait_for_cpoke']
        playStimulusStateID = self.sm.statesNameToIndex['play_stimulus']
        centerInInds = utils.find_transition(eventsThisTrial[:, 2],
                                             waitForCpokeStateID,
                                             playStimulusStateID)
        if len(centerInInds) > 0:
            self.results['timeCenterIn'][trialIndex] = eventsThisTrial[
                centerInInds[0], 0]
        else:
            self.results['timeCenterIn'][trialIndex] = np.nan
        #print self.results['timeCenterIn'][:trialIndex+1] ### DEBUG

        # -- Find center-port-out time --
        waitForSidePokeStateID = self.sm.statesNameToIndex['wait_for_sidepoke']
        CoutID = self.sm.eventsDict['Cout']
        centerOutOnStimInds = utils.find_event(eventsThisTrial[:, 1],
                                               eventsThisTrial[:, 2], CoutID,
                                               playStimulusStateID)
        centerOutOnWaitInds = utils.find_event(eventsThisTrial[:, 1],
                                               eventsThisTrial[:, 2], CoutID,
                                               waitForSidePokeStateID)
        centerOutInds = np.concatenate(
            (centerOutOnStimInds, centerOutOnWaitInds))
        if len(centerOutInds) > 0:
            self.results['timeCenterOut'][trialIndex] = eventsThisTrial[
                min(centerOutInds), 0]
        else:
            self.results['timeCenterOut'][trialIndex] = np.nan

        #print centerOutInds ### DEBUG
        # print eventsThisTrial ### DEBUG

        # -- Find side-port-in time --
        LinID = self.sm.eventsDict['Lin']
        RinID = self.sm.eventsDict['Rin']
        LinInInds = utils.find_event(eventsThisTrial[:, 1], eventsThisTrial[:,
                                                                            2],
                                     LinID, waitForSidePokeStateID)
        RinInInds = utils.find_event(eventsThisTrial[:, 1], eventsThisTrial[:,
                                                                            2],
                                     RinID, waitForSidePokeStateID)
        SideInInds = np.concatenate((LinInInds, RinInInds))
        if len(SideInInds) > 0:
            self.results['timeSideIn'][trialIndex] = eventsThisTrial[
                min(SideInInds), 0]
        else:
            self.results['timeSideIn'][trialIndex] = np.nan

        # -- Store choice and outcome --
        if self.sm.statesNameToIndex['choiceL'] in eventsThisTrial[:, 2]:
            self.results['choice'][trialIndex] = self.results.labels['choice'][
                'left']
        elif self.sm.statesNameToIndex['choiceR'] in eventsThisTrial[:, 2]:
            self.results['choice'][trialIndex] = self.results.labels['choice'][
                'right']
        else:
            self.results['choice'][trialIndex] = self.results.labels['choice'][
                'none']

        if self.sm.statesNameToIndex['reward'] in eventsThisTrial[:, 2]:
            self.results['outcome'][trialIndex] = self.results.labels[
                'outcome']['correct']
        else:
            self.results['outcome'][trialIndex] = self.results.labels[
                'outcome']['error']
Пример #4
0
    def calculate_results(self,trialIndex):
        #choice = self.results['choice']
        #choiceLabels = self.results.labels['choice']
        eventsThisTrial = self.dispatcherModel.events_one_trial(trialIndex)

        # -- Find beginning of trial --
        startTrialStateID = self.sm.statesNameToIndex['start_trial']
        startTrialInd = np.flatnonzero(eventsThisTrial[:,2]==startTrialStateID)[0]
        self.results['timeTrialStart'][trialIndex] = eventsThisTrial[startTrialInd,0]

        # -- Find valid center-port-in time --
        # FIXME: be wiser when calculating the times (first may not be the right one)
        waitForCpokeStateID = self.sm.statesNameToIndex['wait_for_cpoke']
        playStimulusStateID = self.sm.statesNameToIndex['play_stimulus']
        centerInInds = utils.find_transition(eventsThisTrial[:,2],
                                                   waitForCpokeStateID,playStimulusStateID)
        if len(centerInInds)>0:
            self.results['timeCenterIn'][trialIndex] = eventsThisTrial[centerInInds[0],0]
        else:
            self.results['timeCenterIn'][trialIndex] = np.nan
        #print self.results['timeCenterIn'][:trialIndex+1] ### DEBUG

        # -- Find center-port-out time --
        waitForSidePokeStateID = self.sm.statesNameToIndex['wait_for_sidepoke']
        CoutID = self.sm.eventsDict['Cout']
        centerOutOnStimInds =  utils.find_event(eventsThisTrial[:,1],eventsThisTrial[:,2],
                                               CoutID,playStimulusStateID)
        centerOutOnWaitInds =  utils.find_event(eventsThisTrial[:,1],eventsThisTrial[:,2],
                                               CoutID,waitForSidePokeStateID)
        centerOutInds = np.concatenate((centerOutOnStimInds,centerOutOnWaitInds))
        if len(centerOutInds)>0:
            self.results['timeCenterOut'][trialIndex] = eventsThisTrial[min(centerOutInds),0]
        else:
            self.results['timeCenterOut'][trialIndex] = np.nan

        #print centerOutInds ### DEBUG
        # print eventsThisTrial ### DEBUG

        # -- Find side-port-in time --
        LinID = self.sm.eventsDict['Lin']
        RinID = self.sm.eventsDict['Rin']
        LinInInds =  utils.find_event(eventsThisTrial[:,1],eventsThisTrial[:,2],
                                            LinID,waitForSidePokeStateID)
        RinInInds =  utils.find_event(eventsThisTrial[:,1],eventsThisTrial[:,2],
                                            RinID,waitForSidePokeStateID)
        SideInInds = np.concatenate((LinInInds,RinInInds))
        if len(SideInInds)>0:
            self.results['timeSideIn'][trialIndex] = eventsThisTrial[min(SideInInds),0]
        else:
            self.results['timeSideIn'][trialIndex] = np.nan
        
        # -- Store choice and outcome --
        if self.sm.statesNameToIndex['choiceL'] in eventsThisTrial[:,2]:
            self.results['choice'][trialIndex] = self.results.labels['choice']['left']
        elif self.sm.statesNameToIndex['choiceR'] in eventsThisTrial[:,2]:
            self.results['choice'][trialIndex] = self.results.labels['choice']['right']
        else:
            self.results['choice'][trialIndex] = self.results.labels['choice']['none']

        if self.sm.statesNameToIndex['reward'] in eventsThisTrial[:,2]:
            self.results['outcome'][trialIndex] = self.results.labels['outcome']['correct']
        else:
            self.results['outcome'][trialIndex] = self.results.labels['outcome']['error']