class Trial(ResponseHandler, EventRecorder): trial_header = ['subject', 'experiment', 'item', 'condition'] def __init__(self, config, experiment, item, condition, mode, phrases, responses, question=None): self.experiment = experiment self.item = item self.condition = condition self.audio = None self.feedback = None self.config = config self.mode = mode if question: self.question = Question(config, question) else: self.question = None # list for recording the actual signal timing, if necessary (not used in SPR) self.signals = [] # list for recording the actual display timing self.display_updates = [] self.evtStart = Event() self.evtUpdate = Event() self.evtContinue = Event() self.phraseLast = None self.phraseCurrent = None EventRecorder.__init__(self) ResponseHandler.__init__(self, config) self.trial_header_val = "" for name in self.config.trial_header: if name == 'subject': self.trial_header_val = self.trial_header_val + str( self.config.participantNumber) + ' ' elif name == 'experiment': self.trial_header_val = self.trial_header_val + str( self.experiment) + ' ' elif name == 'item': self.trial_header_val = self.trial_header_val + str( self.item) + ' ' elif name == 'condition': self.trial_header_val = self.trial_header_val + str( self.condition) + ' ' def saveResponses(self, results): lines = self.__eventLines(self.config.records_header, self.trial_header_val) results.write(lines) results.flush() def stimulusId(self): return { 'experiment': self.experiment, 'item': self.item, 'condition': self.condition } def __eventRecords(self): header, records = EventRecorder.eventRecords(self) headerQ, recordsQ = {}, [] if self.question: headerQ, recordsQ = self.question.eventRecords() header.update(headerQ) records.extend(recordsQ) return header, records def __eventLines(self, columns, prefix=''): fullHeader, records = self.__eventRecords() allColumns = fullHeader.keys() lines = "" for record in records: line = prefix + self.__eventLine(record, columns) + '\n' lines = lines + line return lines def __eventLine(self, record, columns): line = "" for column in columns: format = "%s" if column == "time": format = "%f" line = line + " " + (format % float(record[column])) elif record.has_key(column): line = line + " " + (format % record[column]) else: line = line + " NA" return line def isPractice(self): if (self.experiment == "practiceSentences" or self.experiment == "practiceBasic"): return True else: return False def isWordStimulus(self): if self.experiment == "practiceBasic": return False else: return True def notifyTextUpdateStart(self, word): debug("DISPLAY UPDATE START, word <%s>" % word) t = get_time() self.display_updates.append([word, t, None]) def notifyTextUpdateFinished(self, word): debug("DISPLAY UPDATE FINISH, word <%s>" % word) if self.display_updates[-1][0] != word: raise "TextChangeFinish expected for a different word." t = get_time() self.display_updates[-1][2] = t
class Trial(ResponseHandler, EventRecorder): trial_header = ['subject', 'experiment', 'item', 'condition'] def __init__(self, config, experiment, item, condition, mode, phrases, responses, question=None): self.experiment = experiment self.item = item self.condition = condition self.audio = None self.feedback = None self.config = config self.mode = mode if question: self.question = Question(config, question) else: self.question = None # list for recording the actual signal timing, if necessary (not used in SPR) self.signals = [] # list for recording the actual display timing self.display_updates = [] self.evtStart = Event() self.evtUpdate = Event() self.evtContinue = Event() self.phraseLast = None self.phraseCurrent = None EventRecorder.__init__(self) ResponseHandler.__init__(self, config) self.trial_header_val = "" for name in self.config.trial_header: if name == 'subject': self.trial_header_val = self.trial_header_val+str(self.config.participantNumber)+' ' elif name == 'experiment': self.trial_header_val = self.trial_header_val+str(self.experiment)+' ' elif name == 'item': self.trial_header_val = self.trial_header_val+str(self.item)+' ' elif name == 'condition': self.trial_header_val = self.trial_header_val+str(self.condition)+' ' def saveResponses(self, results): lines = self.__eventLines(self.config.records_header, self.trial_header_val) results.write(lines) results.flush() def stimulusId(self): return {'experiment': self.experiment, 'item': self.item, 'condition': self.condition} def __eventRecords(self): header, records = EventRecorder.eventRecords(self) headerQ, recordsQ = {}, [] if self.question: headerQ, recordsQ = self.question.eventRecords() header.update(headerQ) records.extend(recordsQ) return header, records def __eventLines(self, columns, prefix=''): fullHeader, records = self.__eventRecords() allColumns = fullHeader.keys() lines = "" for record in records: line = prefix + self.__eventLine(record, columns) + '\n' lines = lines + line return lines def __eventLine(self, record, columns): line = "" for column in columns: format = "%s" if column == "time": format = "%f" line = line + " " + (format % float(record[column])) elif record.has_key(column): line = line + " " + (format % record[column]) else: line = line + " NA" return line def isPractice(self): if(self.experiment == "practiceSentences" or self.experiment == "practiceBasic"): return True else: return False def isWordStimulus(self): if self.experiment == "practiceBasic": return False else: return True def notifyTextUpdateStart(self, word): debug("DISPLAY UPDATE START, word <%s>" % word) t = get_time() self.display_updates.append([word, t, None]) def notifyTextUpdateFinished(self, word): debug("DISPLAY UPDATE FINISH, word <%s>" % word) if self.display_updates[-1][0] != word: raise "TextChangeFinish expected for a different word." t = get_time() self.display_updates[-1][2] = t