package edu.cmu.cs.eyetrack.state; import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import edu.cmu.cs.eyetrack.gui.shapes.Stimulus; import edu.cmu.cs.eyetrack.helper.Coordinate; import edu.cmu.cs.eyetrack.io.CSVWritable; public class Trial implements CSVWritable{ private int id; private long length; private long startTime; private long frameCount; private Stimulus target = null; private Coordinate<Double> targetFinalPos; private Coordinate<Integer> targetFinalGridPos; private Coordinate<Double> userClickPos; private Coordinate<Integer> userClickGridPos; private boolean gridClickCorrect = false; private long gridClickRT; private Stimulus lineupStimulus = null; private boolean lineupClickCorrect = false; private long lineupClickRT; private Set<Stimulus> stimList; private Map<Stimulus, List<Coordinate<Double>>> positionList; public Trial() { this(0); } public Trial(int id) { this.id = id; stimList = new HashSet<Stimulus>(); positionList = new HashMap<Stimulus, List<Coordinate<Double>>>(); frameCount = 0; targetFinalPos = new Coordinate<Double>(-1.0, -1.0); targetFinalGridPos = new Coordinate<Integer>(-1, -1); userClickPos = new Coordinate<Double>(-1.0, -1.0); userClickGridPos = new Coordinate<Integer>(-1, -1); } //@Override //TODO Java 1.5 screams about this; remove when not caring about Java 1.5 public String[] getCSVHeader() { return new String[] { "BEGIN New Trial" }; } //@Override //TODO Java 1.5 screams about this; remove when not caring about Java 1.5 public List<String[]> getCSVData() { List<String[]> data = new ArrayList<String[]>(); data.add(new String[] { "id", "length", "startTime", "target", "targetX", "targetY", "targetGridX", "targetGridY", "userX", "userY", "userGridX", "userGridY", "gridClickCorrect", "gridClickRT", "lineupStimulus", "lineupClickCorrect", "lineupClickRT", }); // Fill in the basic part data.add(new String[] { String.valueOf(id), String.valueOf(length), String.valueOf(startTime), String.valueOf(target), // target might be null early in the Trial, but who cares. String.valueOf(targetFinalPos.getX()), String.valueOf(targetFinalPos.getY()), String.valueOf(targetFinalGridPos.getX()), String.valueOf(targetFinalGridPos.getY()), String.valueOf(userClickPos.getX()), String.valueOf(userClickPos.getY()), String.valueOf(userClickGridPos.getX()), String.valueOf(userClickGridPos.getY()), String.valueOf(gridClickCorrect), String.valueOf(gridClickRT), String.valueOf(lineupStimulus), String.valueOf(lineupClickCorrect), String.valueOf(lineupClickRT), }); // Data for each distractor/target location, for each frame // Each target has its own column String[] isATargetHeader = new String[1 + stimList.size() * 2]; String[] targetTrackingHeader = new String[1 + stimList.size() * 2]; int colIdx=0; targetTrackingHeader[colIdx++] = "Frame Timestamp"; for(Stimulus stimulus : stimList) { isATargetHeader[colIdx] = stimulus == target ? "target" : ""; targetTrackingHeader[colIdx++] = stimulus.toString() + "_x"; isATargetHeader[colIdx] = stimulus == target ? "target" : ""; targetTrackingHeader[colIdx++] = stimulus.toString() + "_y"; } data.add(isATargetHeader); data.add(targetTrackingHeader); // Each frame has its own row int rowIdx=0; while(true) { if(rowIdx >= frameCount) { break; } String[] frame = new String[1 + stimList.size() * 2]; colIdx=0; frame[colIdx++] = String.valueOf( positionList.get(stimList.iterator().next()).get(rowIdx).getTimestamp() - startTime ); for( Stimulus stimulus : stimList ) { frame[colIdx++] = String.valueOf(positionList.get(stimulus).get(rowIdx).getX()); frame[colIdx++] = String.valueOf(positionList.get(stimulus).get(rowIdx).getY()); } data.add(frame); rowIdx++; } data.add(new String[] { "END New Trial" }); return data; } public void pushStims(Collection<Stimulus> stimuli) { for(Stimulus stimulus : stimuli) { pushStim(stimulus); } } public boolean pushStim(Stimulus stimulus) { if(positionList.get(stimulus) != null) { return false; } stimList.add(stimulus); positionList.put(stimulus, new ArrayList<Coordinate<Double>>()); return true; } public void pushPos(Stimulus stimulus, Coordinate<Double> center) { // Explicitly do not check for null? Maybe change later positionList.get(stimulus).add(center); } public void incFrameCount() { frameCount++; } public int getId() { return id; } public void setId(int id) { this.id = id; } public long getLength() { return length; } public void setLength(long length) { this.length = length; } public long getStartTime() { return startTime; } public void setStartTime(long startTime) { this.startTime = startTime; } public long getFrameCount() { return frameCount; } public void setFrameCount(long frameCount) { this.frameCount = frameCount; } public Stimulus getTarget() { return target; } public void setTarget(Stimulus target) { this.target = target; } public Coordinate<Double> getTargetFinalPos() { return targetFinalPos; } public void setTargetFinalPos(Coordinate<Double> targetFinalPos) { this.targetFinalPos = targetFinalPos; } public Coordinate<Integer> getTargetFinalGridPos() { return targetFinalGridPos; } public void setTargetFinalGridPos(Coordinate<Integer> targetFinalGridPos) { this.targetFinalGridPos = targetFinalGridPos; } public Coordinate<Double> getUserClickPos() { return userClickPos; } public void setUserClickPos(Coordinate<Double> userClickPos) { this.userClickPos = userClickPos; } public Coordinate<Integer> getUserClickGridPos() { return userClickGridPos; } public void setUserClickGridPos(Coordinate<Integer> userClickGridPos) { this.userClickGridPos = userClickGridPos; } public boolean isGridClickCorrect() { return gridClickCorrect; } public void setGridClickCorrect(boolean gridClickCorrect) { this.gridClickCorrect = gridClickCorrect; } public Set<Stimulus> getStims() { return stimList; } public void setStims(Set<Stimulus> stimList) { this.stimList = stimList; } public Map<Stimulus, List<Coordinate<Double>>> getPositionList() { return positionList; } public void setPositionList( HashMap<Stimulus, List<Coordinate<Double>>> positionList) { this.positionList = positionList; } public Stimulus getLineupStimulus() { return lineupStimulus; } public void setLineupStimulus(Stimulus lineupStimulus) { this.lineupStimulus = lineupStimulus; } public boolean isLineupClickCorrect() { return lineupClickCorrect; } public void setLineupClickCorrect(boolean lineupClickCorrect) { this.lineupClickCorrect = lineupClickCorrect; } public long getGridClickRT() { return gridClickRT; } public void setGridClickRT(long gridClickRT) { this.gridClickRT = gridClickRT; } public long getLineupClickRT() { return lineupClickRT; } public void setLineupClickRT(long lineupClickRT) { this.lineupClickRT = lineupClickRT; } }