#!/usr/local/bin/perl # $answerCount= 1280 ; # expected total number of answers per session # basic conditions: @vowels = ("a","e","i","o","u"); @deltas = (0); @levels = (-35, -25, -15, -5, 5, 15, 25, 35); $# = "%.4g" ; # set output number format ; $| = 1; # unbuffered output ; # gather stats from file(s) into data arrays, summarize, print &gatherStats; # END OF PROGRAM sub gatherStats { $N = 0; # file counter (@ARGV) || die "usage: $0 \n" ; foreach $file (@ARGV) { $N++; &doFile; } } # process a file [subject / session] sub doFile { &openFile; &readFile; &printStats; } # initialize, open file sub openFile { # clear counters %t = (); # total per condition %s = (); # success per condition $nn = 0; # response counter $subject[$N] = $file; open (FILE, "$file") || die "couldn't open $file\n" ; } # read data line by line sub readFile { while () { if (! &doLine) { # didn't parse: wuznt an answer line # print STDERR $_, "\n"; next; } } ($nn == $answerCount) || die "wrong number of answers in $file: $nn\n" ; } # parse one line of response file sub doLine { chop; ($v, $vv, $f, $ff, $delta, $level, $r, $n) = split; ($v =~ /^[aeiou]$/ && $vv =~ /^[aeiou]$/ && $r =~ /^[aeiou]+$/) || return 0; # skip pause lines, etc. # process each stimulus vowel as a target in turn: &doTarget($v, $vv, $delta, $r, 0+$level); &doTarget($vv, $v, $delta, $r, 0-$level); return(1); } sub doTarget{ local($v, $vv, $delta, $r, $level) = @_; local ($cond); $cond = "_$v$vv" . "_$delta" . "_$level"; if ($vv =~ /[$r]/) { # success $s{$cond}++; } $t{$cond}++; $nn++; } # print statistics sub printStats { if (! $labels_printed) { &printLabels; $labels_printed = 1; } print "$file\t"; &printRates; print "\n"; } # print names of conditions sub printLabels { print "subject\t"; foreach $v (@vowels) { foreach $vv (@vowels) { if ($v ne $vv) { foreach $level (@levels) { foreach $delta (@deltas) { $cond = "_$v$vv" . "_$delta" . "_$level"; print "$cond\t"; }}}}} print "\n"; } sub printRates{ foreach $v (@vowels) { foreach $vv (@vowels) { if ($v ne $vv) { foreach $level (@levels) { foreach $delta (@deltas) { $cond = "_$v$vv" . "_$delta" . "_$level"; $x = $s{$cond}/$t{$cond}; # $x += 0.001; # to avoid integer values printf "%#.3f", $x; printf "\t"; }}}}} }