class Experiment attr_reader :sentences def initialize(experiment, factors, options = {}) default_dir = "./data/" default_columns = [:words, :word_lengths, :word_positions, :regions, :experiment, :subject, :item, :condition, :sentence_number, :list_position, :reading_times, :log_reading_times, :accuracy] data_directory = options.fetch(:dir, default_dir) columns = options.fetch(:columns, default_columns) @experiments = ([experiment] + ["filler"]).flatten @factors = factors @columns = columns @sentences = [] Dir.foreach(data_directory) do |file| if file =~ /(\d+)\.dat/ puts file File.open(data_directory + file) do |current_file| sentence = Sentence.new list_position = 0 while line = current_file.gets columns = line.split if @experiments.any? {|exp| columns[1] == exp} if columns[4] != "?" sentence[:words] << columns[5] sentence[:regions] << columns[6] sentence[:reading_times] << columns[7] elsif columns[4] == "?" sentence[:subject] = columns[0] sentence[:experiment] = columns[1] sentence[:item] = columns[2] sentence[:condition] = columns[3] sentence[:factors] = self.factors(sentence[:condition]) sentence[:accuracy] = columns[6] sentence[:list_position] = (list_position += 1) @sentences << sentence sentence = Sentence.new end end end end end end end def factors(condition) @factors[condition].nil? ? %w(NA NA NA).join("\t") : @factors[condition].join("\t") end def to_s out = (@columns.map {|column| column.to_s}).join("\t") + "\n" # The header line. Doesn't expand factors. @sentences.each do |s| s.compute s.length.times do |word| line = self.output_columns(s, word) out << line.join("\t") + "\n" end end return out end def to_file(file) File.new(file, "w+").puts self puts "Created #{file}" end protected def output_columns(s, word) @columns.map {|column| s[column].class == Array ? s[column][word] : s[column]} end end class Sentence def initialize @attributes = {:words => [], :word_lengths => nil, :word_positions => nil, :regions => [], :experiment => nil, :subject => nil, :item => nil, :condition => nil, :factors => nil, :sentence_number => nil, :list_position => nil, :reading_times => [], :log_reading_times => [], :accuracy => nil} end def [](key) @attributes[key] end def []=(key, value) @attributes[key] = value end def compute self.word_lengths self.condition self.word_positions self.regions self.log_reading_times end def length @attributes[:words].length end protected def word_lengths @attributes[:word_lengths] = @attributes[:words].map {|word| word.length} end def condition @attributes[:condition] = "NA" if @attributes[:condition] == "-" end def word_positions @attributes[:word_positions] = (1..@attributes[:words].length).to_a end def regions @attributes[:regions] = @attributes[:regions].map {|region| (region == "-" or region == "NA") ? "NA" : region[0,1]} end def log_reading_times @attributes[:log_reading_times] = @attributes[:reading_times].map {|rt| Math::log(rt)} end end