PDA

View Full Version : running experimental trials


fivel_lab
03-16-2011, 06:13 PM
i recently created a makeshift balance board apparatus which was to be used as part of an experiment for a visuo-motor psychology experiment. after alot of trial, error, and some invaluable advice from the folks on this forum, i finally got the physics of the experiment running, but now i'm having difficulty getting the experiment to run as a series of trials.

this is the framework i'm going off of:
def experiment():

yield participantInfo()
yield loadWorld()
yield prePhase()
yield testPhase()
yield postPhase()

viztask.schedule(experiment)

the participant info and load world phases work well, and within the the participantInfo() phase i open a data file:
experiment_data = open(str(id) + '_experiment_data.txt','w')

#write participant data to file
data = "Participant ID: %s\tName: %s\tGender: %s\n\n" % (id,name,gender)
experiment_data.write(data)

and what i would like to do is open the same file within the the pre/test/post phases and write to it how long each participant is able to stay on task, which is measured by how long participants are able to keep a "ball" balanced on the center of the balance board.

right now, i have a loop set in the pre phase:

trials = [10]

#for loop for trials
for trial in trials:
global isDone
isDone = False
trialCount = 1
global writeData
def isIn():
inThere = 0
if abs(ball.getPosition()[0]) < TARGET_REGION:
inThere = 1
data = '%d' % trialCount
data = data + str(round(viz.tick(),3))
data = data + '\t%d\n' % inThere

experiment_data.write(data)

the stopping condition for each trial occurs when either the ball falls off the end of the balance board or the time hits 20 seconds:
while isDone is False:
startTime=viz.tick()
global elapsedTime
elapsedTime = viz.tick() - startTime


if abs(ball.getPosition()[0]) > BARLENGTH/2:
ball.setPosition((CENTERPOS[0],CENTERPOS[1]+5,CENTERPOS[2]))
trialCount = trialCount+1
isDone = True

i know i'm throwing alot out there for a single post, but i'm pulling my hair out trying to get this to work... for now, what i'd really like to know is to write the data during the prephase to the global "experiment_data" that i created in the participantInfo phase, and how to get each trial to run properly...

any help would be greatly appreciated, thanks in advance.

Jeff
03-17-2011, 05:01 PM
Where are your yield statement(s) for the prephase function?

fivel_lab
03-18-2011, 09:45 AM
i didn't have yield statements. i started out using vizact.ontimer within the while-loop to implement an elapsed time function :
startTime = viz.tick()

def elapsed():
elapsedTime = viz.tick()-startTime

vizact.ontimer(0, elapsed)

i wanted to use 'elapsed' to monitor each trials time and set isDone to True when the time hit 20 seconds. the partner i am working with pointed out that the preceeding script wouldn't create a timer at the start of the while loop like i had intended but would instead create timerS nonstop once the while loop began. as a result, i think i created a massive memory leak...

how would i go about implementing a yield statement to get an elapsed time function?

Jeff
03-18-2011, 02:58 PM
the stopping condition for each trial occurs when either the ball falls off the end of the balance board or the time hits 20 seconds

You can use the viztask.waitAny command to wait until one of several conditions occurs. In your case these conditons would be a viztask.waitTime condition and a custom condition related to the ball's position.

The viztask documentation describes these commands and how to create a custom condition.