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']
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']