Esempio n. 1
0
    def trial_completed(self, behavior_data):
        """Update outcome variables using bpod.session.current_trial
        Check trial for state entries, first value of first tuple"""
        # Update elapsed_time
        self.elapsed_time = datetime.datetime.now() - self.init_datetime
        self.behavior_data = behavior_data
        correct = ~np.isnan(
            self.behavior_data["States timestamps"]["correct"][0][0])
        error = ~np.isnan(
            self.behavior_data["States timestamps"]["error"][0][0])
        no_go = ~np.isnan(
            self.behavior_data["States timestamps"]["no_go"][0][0])
        assert correct or error or no_go
        # Add trial's response time to the buffer
        self.response_time = misc.get_trial_rt(self.behavior_data)
        self.response_time_buffer.append(self.response_time)
        # Update response buffer -1 for left, 0 for nogo, and 1 for rightward
        if (correct and self.position < 0) or (error and self.position > 0):
            self.response_side_buffer.append(1)
        elif (correct and self.position > 0) or (error and self.position < 0):
            self.response_side_buffer.append(-1)
        elif no_go:
            self.response_side_buffer.append(0)
        # Update the trial_correct variable + buffer
        self.trial_correct = bool(correct)
        self.trial_correct_buffer.append(self.trial_correct)
        # Increment the trial correct counter
        self.ntrials_correct += self.trial_correct
        # Update the water delivered
        if self.trial_correct:
            self.water_delivered += self.reward_amount

        # SAVE TRIAL DATA
        params = self.__dict__.copy()
        params.update({"behavior_data": behavior_data})
        # Convert to str all non serializable params
        params["data_file"] = str(params["data_file"])
        params["osc_client"] = "osc_client_pointer"
        params["init_datetime"] = params["init_datetime"].isoformat()
        params["elapsed_time"] = str(params["elapsed_time"])
        params["position"] = int(params["position"])
        # Delete buffered data
        params["stim_probability_left_buffer"] = ""
        params["position_buffer"] = ""
        params["contrast_buffer"] = ""
        params["signed_contrast_buffer"] = ""
        params["response_time_buffer"] = ""
        params["response_side_buffer"] = ""
        params["trial_correct_buffer"] = ""
        # Dump and save
        out = json.dumps(params, cls=ComplexEncoder)
        self.data_file.write(out)
        self.data_file.write("\n")
        self.data_file.close()
        # If more than 42 trials save transfer_me.flag
        if self.trial_num == 42:
            misc.create_flags(self.data_file_path, self.poop_count)

        return self
    def trial_completed(self, behavior_data):
        """Update outcome variables using bpod.session.current_trial
        Check trial for state entries, first value of first tuple """
        # Update elapsed_time
        self.elapsed_time = datetime.datetime.now() - self.init_datetime
        self.behavior_data = behavior_data
        correct = ~np.isnan(
            self.behavior_data['States timestamps']['correct'][0][0])
        error = ~np.isnan(
            self.behavior_data['States timestamps']['error'][0][0])
        no_go = ~np.isnan(
            self.behavior_data['States timestamps']['no_go'][0][0])
        assert correct or error or no_go
        # Add trial's response time to the buffer
        self.response_time = misc.get_trial_rt(self.behavior_data)
        self.response_time_buffer.append(self.response_time)
        # Update response buffer -1 for left, 0 for nogo, and 1 for rightward
        if (correct and self.position < 0) or (error and self.position > 0):
            self.response_buffer = misc.update_buffer(self.response_buffer, 1)
            self.response_side_buffer.append(1)
        elif (correct and self.position > 0) or (error and self.position < 0):
            self.response_buffer = misc.update_buffer(self.response_buffer, -1)
            self.response_side_buffer.append(-1)
        elif no_go:
            self.response_buffer = misc.update_buffer(self.response_buffer, 0)
            self.response_side_buffer.append(0)
        # Update the trial_correct variable
        self.trial_correct = bool(correct)
        # Increment the trial correct counter
        self.ntrials_correct += self.trial_correct
        # Update the water delivered
        if self.trial_correct:
            self.water_delivered += self.reward_amount

        # Propagate outcome to contrast object
        self.contrast.trial_completed(self.trial_correct)
        # Update non repeated trials
        self.non_rc_ntrials = self.trial_num - self.rc.ntrials

        # SAVE TRIAL DATA
        params = self.__dict__.copy()
        # open data_file is not serializable, convert to str
        params['data_file'] = str(params['data_file'])
        params['osc_client'] = 'osc_client_pointer'
        params['init_datetime'] = params['init_datetime'].isoformat()
        params['elapsed_time'] = str(params['elapsed_time'])
        # Delete buffered data
        # params['stim_probability_left_buffer'] = ''
        # params['position_buffer'] = ''
        # params['contrast_buffer'] = ''
        params['signed_contrast_buffer'] = ''
        params['response_time_buffer'] = ''
        params['response_side_buffer'] = ''
        # params['trial_correct_buffer'] = ''

        out = json.dumps(params, cls=ComplexEncoder)
        self.data_file.write(out)
        self.data_file.write('\n')
        self.data_file.close()
        # If more than 42 trials save transfer_me.flag
        if self.trial_num == 42:
            misc.create_flags(self.data_file_path, self.poop_count)

        return self