-
-
Notifications
You must be signed in to change notification settings - Fork 111
/
quest_staircase_init.py
148 lines (119 loc) · 3.97 KB
/
quest_staircase_init.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#-*- coding:utf-8 -*-
"""
This file is part of OpenSesame.
OpenSesame is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenSesame is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with OpenSesame. If not, see <http://www.gnu.org/licenses/>.
"""
from libopensesame.py3compat import *
from libopensesame.exceptions import osexception
from libopensesame import plugins
from libopensesame.oslogging import oslogger
from libopensesame.item import item
from libqtopensesame.items.qtautoplugin import qtautoplugin
Quest = None
try:
import Quest
oslogger.debug(u'Loading Quest module directly')
except:
oslogger.debug(u'Failed to load Quest module directly')
if Quest is None:
try:
from psychopy.contrib import quest as Quest
oslogger.debug(u'Loading Quest module from PsychoPy')
except:
oslogger.debug(u'Failed to load Quest module from PsychoPy')
if Quest is None:
try:
Quest = plugins.load_mod(__file__, u'Quest')
oslogger.debug(u'Loading Quest module from plug-in folder')
except:
oslogger.debug(u'Failed to load Quest module from plug-in folder')
if Quest is None:
raise osexception(u'Failed to load Quest module.')
class quest_staircase_init(item):
"""
desc:
A plug-in that iniializes a Quest staircase.
"""
description = u'Initializes a new Quest staircase procedure'
def reset(self):
"""
desc:
Initialize default variables.
"""
self.var.t_guess = .5
self.var.t_guess_sd = .25
self.var.p_threshold = .75
self.var.beta = 3.5
self.var.delta = .01
self.var.gamma = .5
self.var.test_value_method = u'quantile'
self.var.min_test_value = 0
self.var.max_test_value = 1
self.var.var_test_value = u'quest_test_value'
def quest_set_next_test_value(self):
"""
desc:
Sets the next test value for the Quest procedure.
"""
if self.var.test_value_method == u'quantile':
self.experiment.quest_test_value = self.experiment.quest.quantile
elif self.var.test_value_method == u'mean':
self.experiment.quest_test_value = self.experiment.quest.mean
elif self.var.test_value_method == u'mode':
self.experiment.quest_test_value = self.experiment.quest.mode
else:
raise osexception(
u'Unknown test_value_method \'%s\' in quest_staircase_init' \
% self.var.test_value_method)
test_value = max(self.var.min_test_value, min(
self.var.max_test_value, self.experiment.quest_test_value()))
oslogger.debug(u'quest_test_value = %s' % test_value)
self.experiment.var.quest_test_value = test_value
self.experiment.var.set(self.var.var_test_value, test_value)
def prepare(self):
"""
desc:
Prepares the plug-in.
"""
self.experiment.quest = Quest.QuestObject(self.var.t_guess,
self.var.t_guess_sd, self.var.p_threshold, self.var.beta,
self.var.delta, self.var.gamma)
self.experiment.quest_set_next_test_value = \
self.quest_set_next_test_value
self.experiment.quest_set_next_test_value()
def var_info(self):
"""
desc:
Gives a list of dictionaries with variable descriptions.
returns:
desc: A list of (name, description) tuples.
type: list
"""
return item.var_info(self) + [(u'quest_test_value',
u'(Determined by Quest procedure)')]
class qtquest_staircase_init(quest_staircase_init, qtautoplugin):
"""
desc:
The GUI part of the plug-in. Controls are defined in info.json.
"""
def __init__(self, name, experiment, script=None):
"""
desc:
Constructor.
arguments:
name: The name of the plug-in.
experiment: The experiment object.
keywords:
script: A definition script.
"""
quest_staircase_init.__init__(self, name, experiment, script)
qtautoplugin.__init__(self, __file__)