def get(self, feats=()): from json_param import Parameters from riglib import experiment Exp = experiment.make(self.task.get(), tuple(f.get() for f in self.feats.all())+feats) params = Parameters(self.params) params.trait_norm(Exp.class_traits()) if issubclass(Exp, experiment.Sequence): gen, gp = self.sequence.get() seq = gen(Exp, **gp) exp = Exp(seq, **params.params) else: exp = Exp(**params.params) exp.event_log = json.loads(self.report) return exp
class TaskWrapper(object): ''' Wrapper for Experiment classes launched from the web interface ''' def __init__(self, subj, task_rec, feats, params, seq=None, seq_params=None, saveid=None): ''' Parameters ---------- subj : tracker.models.Subject instance Database record for subject performing the task task_rec : tracker.models.Task instance Database record for base task being run (without features) feats : list List of features to enable for the task params : json_param.Parameters, or string representation of JSON object user input on configurable task parameters seq : models.Sequence instance, or tuple Database record of Sequence parameters/static target sequence If passed in as a tuple, then it's the result of calling 'seq.get' on the models.Sequence instance seq_params: params from seq (see above) saveid : int, optional ID number of db.tracker.models.TaskEntry associated with this task if None specified, then the data saved will not be linked to the database entry and will be lost after the program exits ''' self.saveid = saveid self.taskname = task_rec.name self.subj = subj if isinstance(params, Parameters): self.params = params elif isinstance(params, (string, str)): self.params = Parameters(params) base_class = task_rec.get() if None in feats: raise Exception("Features not found properly in database!") else: Task = experiment.make(base_class, feats=feats) # Run commands which must be executed before the experiment class can be instantiated (e.g., starting neural recording) Task.pre_init(saveid=saveid) self.params.trait_norm(Task.class_traits()) if issubclass(Task, experiment.Sequence): # retreive the sequence data from the db, or from the input argument if the input arg was a tuple if isinstance(seq, tuple): gen_constructor, gen_params = seq elif isinstance(seq, models.Sequence): gen_constructor, gen_params = seq.get() # Typically, 'gen_constructor' is the experiment.generate.runseq function (not an element of namelist.generators) else: raise ValueError("Unrecognized type for seq") gen = gen_constructor(Task, **gen_params) self.params.params['seq_params'] = seq_params # 'gen' is now a true python generator usable by experiment.Sequence self.task = Task(gen, **self.params.params) with open(log_filename, 'a') as f: f.write("instantiating task with a generator\n") else: self.task = Task(**self.params.params) self.task.start() def report(self): return experiment.report(self.task) def pause(self): self.task.pause = not self.task.pause return "pause" if self.task.pause else "running" def end_task(self): self.task.end_task() def enable_clda(self): self.task.enable_clda() def disable_clda(self): self.task.disable_clda() def get_state(self): return self.task.state def __getattr__(self, attr): # This function is only defined because __getattr__ is not defined # for children of 'object' by default, but the TaskObjProxy always calles '__getattr__' # when trying to remotely retreive an attribute. Might be avoidable if TaskObjProxy were # to use '__getattribute__' instead return getattr(self, attr) def set_task_attr(self, attr, value): setattr(self.task, attr, value) def cleanup(self): self.task.join() print("Calling saveout/task cleanup code") if self.saveid is not None: # get object representing function calls to the remote database # returns the result of tracker.dbq.rpc_handler database = xmlrpc.client.ServerProxy("http://localhost:8000/RPC2/", allow_none=True) cleanup_successful = self.task.cleanup(database, self.saveid, subject=self.subj) # if not self.task._task_init_complete: # from tracker import dbq # dbq.hide_task_entry(self.saveid) # print 'hiding task entry!' # else: # print 'not hiding task entry!' else: cleanup_successful = True self.task.terminate() return cleanup_successful
class TaskWrapper(object): ''' Wrapper for Experiment classes launched from the web interface ''' def __init__(self, subj, task_rec, feats, params, seq=None, seq_params=None, saveid=None): ''' Parameters ---------- subj : tracker.models.Subject instance Database record for subject performing the task task_rec : tracker.models.Task instance Database record for base task being run (without features) feats : list List of features to enable for the task params : json_param.Parameters, or string representation of JSON object user input on configurable task parameters seq : models.Sequence instance, or tuple Database record of Sequence parameters/static target sequence If passed in as a tuple, then it's the result of calling 'seq.get' on the models.Sequence instance seq_params: params from seq (see above) saveid : int, optional ID number of db.tracker.models.TaskEntry associated with this task if None specified, then the data saved will not be linked to the database entry and will be lost after the program exits ''' self.saveid = saveid self.taskname = task_rec.name self.subj = subj if isinstance(params, Parameters): self.params = params elif isinstance(params, (string, unicode)): self.params = Parameters(params) base_class = task_rec.get() if None in feats: raise Exception("Features not found properly in database!") else: Task = experiment.make(base_class, feats=feats) # Run commands which must be executed before the experiment class can be instantiated (e.g., starting neural recording) Task.pre_init(saveid=saveid) self.params.trait_norm(Task.class_traits()) if issubclass(Task, experiment.Sequence): # retreive the sequence data from the db, or from the input argument if the input arg was a tuple if isinstance(seq, tuple): gen_constructor, gen_params = seq elif isinstance(seq, models.Sequence): gen_constructor, gen_params = seq.get() # Typically, 'gen_constructor' is the experiment.generate.runseq function (not an element of namelist.generators) else: raise ValueError("Unrecognized type for seq") gen = gen_constructor(Task, **gen_params) self.params.params['seq_params'] = seq_params # 'gen' is now a true python generator usable by experiment.Sequence self.task = Task(gen, **self.params.params) with open(log_filename, 'a') as f: f.write("instantiating task with a generator\n") else: self.task = Task(**self.params.params) self.task.start() def report(self): return experiment.report(self.task) def pause(self): self.task.pause = not self.task.pause return "pause" if self.task.pause else "running" def end_task(self): self.task.end_task() def enable_clda(self): self.task.enable_clda() def disable_clda(self): self.task.disable_clda() def get_state(self): return self.task.state def __getattr__(self, attr): # This function is only defined because __getattr__ is not defined # for children of 'object' by default, but the TaskObjProxy always calles '__getattr__' # when trying to remotely retreive an attribute. Might be avoidable if TaskObjProxy were # to use '__getattribute__' instead return getattr(self, attr) def set_task_attr(self, attr, value): setattr(self.task, attr, value) def cleanup(self): self.task.join() print "Calling saveout/task cleanup code" if self.saveid is not None: # get object representing function calls to the remote database # returns the result of tracker.dbq.rpc_handler database = xmlrpclib.ServerProxy("http://localhost:8000/RPC2/", allow_none=True) cleanup_successful = self.task.cleanup(database, self.saveid, subject=self.subj) # if not self.task._task_init_complete: # from tracker import dbq # dbq.hide_task_entry(self.saveid) # print 'hiding task entry!' # else: # print 'not hiding task entry!' else: cleanup_successful = True self.task.terminate() return cleanup_successful