diff --git a/.gitignore b/.gitignore
index 5509140..9d30e53 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,9 @@
*.DS_Store
+modularTasks/tasks/AdrianTests/trials_post_expt/*
+modularTasks/tasks/AdrianTests/trials_pre_expt/training_3.csv
+modularTasks/tasks/AdrianTests/trials_pre_expt/training_4.csv
+modularTasks/tasks/AdrianTests/trials_pre_expt/training_5.csv
+modularTasks/tasks/AdrianTests/trials_pre_expt/training_6.csv
+modularTasks/tasks/AdrianTests/trials_pre_expt/training_7.csv
+modularTasks/tasks/AdrianTests/trials_pre_expt/training_8.csv
+*.png
diff --git a/configuration/dots_PsychophysicsMacMini_MachineConfig.xml b/configuration/dots_PsychophysicsMacMini_MachineConfig.xml
new file mode 100644
index 0000000..bbf65ab
--- /dev/null
+++ b/configuration/dots_PsychophysicsMacMini_MachineConfig.xml
@@ -0,0 +1,31 @@
+
+
+
+ @mglGetSecs
+ ['dotsDOut1208FS']
+ ['/Users/joshuagold/Users/Adrian']
+ [true ]
+ ['~']
+ ['~']
+
+
+ [ 1.0000000000]
+ ['127.0.0.1']
+ [ 49200.0000000000]
+ ['127.0.0.1']
+ [ 49201.0000000000]
+ [ 0.0000000000]
+ [ 10.0000000000]
+ ['dotsSocketPnet']
+
+
+ [ 0.0000000000, 0.0000000000, 0.0000000000]
+ []
+ [ 2.0000000000]
+ [ 70.0000000000]
+ [ 1.0000000000, 1.0000000000, 1.0000000000]
+ [ 33.6550000000]
+ [ 1.0000000000]
+ [ 59.69000000000]
+
+
diff --git a/configuration/dots_example_MachineConfig.xml b/configuration/dots_example_MachineConfig.xml
deleted file mode 100644
index bebe7c2..0000000
--- a/configuration/dots_example_MachineConfig.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-
-
-
- @mglGetSecs
- ['dotsWritableDOut1208FS']
- ['/Users/jigold/GoldWorks/Local/Data/Projects']
- [true ]
- ['~']
- ['~']
-
-
- [ 1.0000000000]
- ['192.168.1.1']
- [ 40000]
- ['192.168.1.2']
- [ 40001]
- [ 0.0000000000]
- [ 10.0000000000]
- ['dotsSocketPnet']
-
-
- [ 1452]
- [ 772.0000000000]
- [ 2.0000000000]
-
-
- [ 1008]
- [ 36]
- [ 6]
-
-
- [ 0.0000000000, 0.0000000000, 0.0000000000]
- []
- [ 0.0000000000]
- [ 50.0000000000]
- [ 1.0000000000, 1.0000000000, 1.0000000000]
- [ 20.7800000000]
- [ 1.0000000000]
- [ 33.2500000000]
-
-
\ No newline at end of file
diff --git a/modularTasks/tasks/AdrianTests/Lab_Matlab_Control_Adrian_Fork.json b/modularTasks/tasks/AdrianTests/Lab_Matlab_Control_Adrian_Fork.json
new file mode 100644
index 0000000..2461dbb
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/Lab_Matlab_Control_Adrian_Fork.json
@@ -0,0 +1,30 @@
+[
+ {
+ "name": "Lab_Matlab_Control_Adrian_Fork",
+ "type": "git",
+ "update": "never",
+ "url": "https://github.com/aernesto/Lab_Matlab_Control.git",
+ "pathPlacement": "append"
+ },
+ {
+ "name": "Lab_Matlab_Utilities",
+ "flavor": "5d8a529991e7d1db7bd9560078e886ca3f9a818d",
+ "type": "git",
+ "pathPlacement": "append",
+ "url": "https://github.com/TheGoldLab/Lab_Matlab_Utilities.git"
+ },
+ {
+ "name": "mgl",
+ "type": "git",
+ "flavor": "85153d66e0935b0c78a5447494e212c0e8592afe",
+ "url": "https://github.com/justingardner/mgl.git",
+ "pathPlacement": "append"
+ },
+ {
+ "name": "mQUESTPlus",
+ "pathPlacement": "append",
+ "flavor": "bd3673db5d3e47699bdb1820dcfe068262d8b609",
+ "type": "git",
+ "url": "https://github.com/brainardlab/mQUESTPlus.git"
+ }
+]
diff --git a/modularTasks/tasks/AdrianTests/payrate.m b/modularTasks/tasks/AdrianTests/payrate.m
new file mode 100644
index 0000000..6e2c5e7
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/payrate.m
@@ -0,0 +1,24 @@
+function payrate(timestamp)
+% compute extra pay for subject
+% ARGS:
+% timestamp - string like '2019_11_06_12_43'
+
+% max_rate - integer. maximum rate a subject can get. E.g. 10 $/hour
+max_rate=10;
+
+% th_perf - percent correct above which max pay rate is reached.
+% Between 0 and 1
+th_perf=0.75;
+
+pre= 'completed4AFCtrials_task100_date_';
+post='.csv';
+filename = which([pre, timestamp, post]);
+t1=readtable(filename);
+coh1 = t1(t1.coherence==100,:);
+refdim = size(coh1);
+dims=size(coh1(coh1.dirCorrect & coh1.cpCorrect, :));
+perf = dims(1) / refdim(1);
+%th_perf = .75;
+payrate = min(perf/th_perf, 1); % dollars per hour
+disp(['additional payrate: ', num2str( ceil(payrate * max_rate)), '$/hour'])
+end
\ No newline at end of file
diff --git a/modularTasks/tasks/AdrianTests/singlecp.m b/modularTasks/tasks/AdrianTests/singlecp.m
new file mode 100644
index 0000000..dcc6b05
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/singlecp.m
@@ -0,0 +1,247 @@
+function singlecp(subject_code, probCP)
+% function to launch single CP Reversing Dots task
+%
+% ARGS:
+% subject_code -- string that identifies subject uniquely, e.g. 'S4'
+% first_block_of_day -- true or false
+% probCP -- numeric value
+% dump_folder -- e.g '/Users/joshuagold/Documents/MATLAB/projects/Lab_M
+% atlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/'
+% quest_task_topsDataLog -- full path to topsDataLog containing the Quest
+% task (can be '' if no prior Quest task is
+% required)
+
+%-------------------------- DEFAULT ARGS
+dump_folder = '/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/';
+
+
+first_block_of_day = true; % if true, Quest block is added
+
+% the following variable should hold the full path to a topsDataLog.mat
+% file where a valid Quest block was run. This is when one wants to skip
+% the Quest block presently, and thus use the threshold estimated from a
+% prior Quest block.
+% An example path would be:
+% '/Users/joshuagold/Users/Adrian/oneCP/raw/2019_12_13_13_37/2019_12_13_13_37_topsDataLog.mat'
+% It is okay to leave the following variable as an empty string if
+% first_block_of_day is set to true above.
+quest_task_topsDataLog = '';
+
+
+%-------------------------- DOTS STIMULUS PROPERTIES
+ddots.Density = 150;
+ddots.Speed = 5;
+ddots.PixelSize = 6;
+ddots.Diameter = 8;
+ddots.CoherenceSTD = 10;
+
+ function newStruct = setDotsParams(dots, someStruct)
+ someStruct.density = dots.Density;
+ someStruct.speed = dots.Speed;
+ someStruct.diameter = dots.Diameter;
+ someStruct.pixelSize = dots.PixelSize;
+ someStruct.coherenceSTD = dots.CoherenceSTD;
+ newStruct = someStruct;
+ end
+
+
+%-------------------------- CREATE TOPNODE
+topNode = topsTreeNodeTopNode('oneCP');
+
+ function ts = extract_timestamp(tn)
+ % returns the timestamp as a string 'YYYY_MM_DD_HH_mm' associated
+ % with the topsTreeNodeTopNode object tn
+ ts = regexprep(tn.filename, ...
+ '[^[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2}]', '');
+ ts = ts(1:16);
+ end
+timestamp = extract_timestamp(topNode);
+
+
+%-------------------------- TURN DIARY ON (LOG CONSOLE OUTPUT TO FILE)
+diary([dump_folder, 'session_console_',timestamp,'.log'])
+
+
+%-------------------------- SET TOPNODE UP
+topNode.addHelpers('screenEnsemble', ...
+ 'displayIndex', 2, ...
+ 'remoteDrawing', false, ...
+ 'topNode', topNode);
+%topNode.addReadable('dotsReadableHIDKeyboard');
+topNode.addReadable('dotsReadableHIDGamepad');
+% -1 means wait for keypress -- see topsTreeNode.pauseBeforeTask
+pauseBeforeTask = -1;
+
+ function add_block(topnode, taskID, task_name, trials_file, ...
+ stop_cond, block_description)
+ % add a task to the topnode object
+ t = topsTreeNodeTaskReversingDots4AFC(task_name);
+ t.taskID = taskID;
+ t.independentVariables=trials_file;
+% t.trialIterationMethod='sequential';
+ t.randomizeWhenRepeating = false;
+ t.pauseBeforeTask = pauseBeforeTask;
+ t.stopCondition = stop_cond;
+
+ % must be numeric
+ t.subject = str2double(regexprep(subject_code,'[^0-9]',''));
+ t.date = str2double(regexprep(timestamp,'_','')); % must be numeric
+ t.probCP = probCP;
+
+ t.message.message.Instructions.text = {...
+ block_description ...
+ };
+
+ % DOTS PROPERTIES
+ oldDots = t.drawable.stimulusEnsemble.dots;
+ t.drawable.stimulusEnsemble.dots = setDotsParams(ddots, oldDots);
+
+ topnode.addChild(t);
+ end
+
+ function add_training_block(tid, name, condstop)
+ add_block(topNode, tid, name, [name,'.csv'], condstop, ...
+ {'training block',num2str(tid)})
+ end
+
+
+%-------------------------- ADD TRAINING BLOCKS TO TOPNODE
+num_training_blocks=2;
+
+stop_conditions = {...
+ 7, 'button' ...
+ };
+
+for jj = 1:num_training_blocks
+ if jj == 2
+ if probCP < .5
+ add_training_block(jj, 'training_2_lowprob', stop_conditions{jj})
+ else
+ add_training_block(jj, 'training_2_highprob', stop_conditions{jj})
+ end
+ else
+ add_training_block(jj, ['training_',num2str(jj)], stop_conditions{jj})
+ end
+end
+
+
+
+%-------------------------- ADD OPTIONAL QUEST BLOCK TO TOPNODE
+% only put Quest block if this is the first block of the day
+if first_block_of_day
+ questTask = topsTreeNodeTaskRTDots('Quest');
+ questTask.taskID = 99;
+ questTask.trialIterations = 60;
+ questTask.timing.dotsDuration = 0.4;
+ questTask.timing.showFeedback = 0;
+ questTask.pauseBeforeTask = pauseBeforeTask;
+ questTask.message.message.Instructions.text = {{'Quest block', ...
+ 'There are no switches'}};
+ % DOTS PROPERTIES
+ oldieDots = questTask.drawable.stimulusEnsemble.dots;
+ questTask.drawable.stimulusEnsemble.dots = ...
+ setDotsParams(ddots, oldieDots);
+ topNode.addChild(questTask);
+
+else
+ % extract timestamp from full path
+ ts = regexprep(quest_task_topsDataLog, ...
+ '[^[0-9]{4}_[0-9]{2}_[0-9]{2}_[0-9]{2}_[0-9]{2}]', '');
+ ts = ts(1:16);
+
+
+ % get questTask from first topsDataLog of the day
+ % right now, stops at first Quest block found
+ [oldTopNode, ~] = topsTreeNodeTopNode.loadRawData('oneCP', ts);
+
+
+ for tt = 1:length(oldTopNode.children)
+ task_child = oldTopNode.children{tt};
+ if strcmp(task_child.name,'Quest')
+ questTask = task_child;
+ break
+ end
+ end
+end
+
+
+
+%-------------------------- ADD TASK BLOCKS (4 by default)
+
+
+ttt = topsTreeNodeTaskReversingDots4AFC('TASK');
+ttt.timing.showFeedback = 0;
+ttt.taskID = 100;
+
+if probCP < 0.5
+ task_file = 'Block1.csv';
+ ttt.message.message.Instructions.text = {...
+ {'REAL TASK', 'RARE SWITCHES'} ...
+ };
+else
+ task_file = 'Block0.csv';
+ ttt.message.message.Instructions.text = {...
+ {'REAL TASK', 'FREQUENT SWITCHES'} ...
+ };
+end
+
+ttt.independentVariables=task_file;
+% ttt.trialIterationMethod='sequential';
+ttt.randomizeWhenRepeating = false;
+ttt.pauseBeforeTask = pauseBeforeTask;
+ttt.stopCondition = 'button';
+
+% subject, date and probCP must be numeric
+ttt.subject = str2double(regexprep(subject_code,'[^0-9]',''));
+ttt.date = str2double(regexprep(timestamp,'_',''));
+ttt.probCP = probCP;
+
+% set theshold coherence obtained from Quest
+if ~first_block_of_day
+ threshold = questTask.getQuestThreshold();
+ if (threshold <= 0) || (100 <= threshold)
+ error(['invalid threshold of', num2str(threshold)])
+ else
+ ttt.questThreshold = threshold;
+ end
+else
+ % if threshold hasn't been estimated yet, pass the Quest task instead
+ ttt.questThreshold = questTask;
+end
+
+% DOTS PROPERTIES
+oldieDots = ttt.drawable.stimulusEnsemble.dots;
+ttt.drawable.stimulusEnsemble.dots = ...
+ setDotsParams(ddots, oldieDots);
+
+topNode.addChild(ttt);
+
+
+%-------------------------- RUN TOPNODE
+
+topNode.run();
+
+
+%-------------------------- DUMP FIRA INFO (ONE FILE PER BLOCK)
+
+ function dumpFIRA(topnode, child)
+ task = topnode.children{child};
+ csvfile = ...
+ [dump_folder, 'completed4AFCtrials_task', ...
+ num2str(task.taskID), '_date_', ...
+ timestamp,'.csv'];
+ task.saveTrials(csvfile, 'all');
+ end
+
+num_children = length(topNode.children);
+
+for c = 1:num_children
+ if numel(topNode.children{c}.trialData)
+ dumpFIRA(topNode, c)
+ end
+end
+
+%-------------------------- TURN OFF DIARY
+disp(['file with timestamp ', timestamp, ' produced'])
+diary off
+end
diff --git a/modularTasks/tasks/AdrianTests/test_battery.txt b/modularTasks/tasks/AdrianTests/test_battery.txt
new file mode 100644
index 0000000..74684f0
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/test_battery.txt
@@ -0,0 +1,9 @@
+High level description
+======================
+run 3 training + Quest + 1 task (low probCP)
+run 3 training + noQuest + 1 task (low probCP)
+run 3 training + noQuest + 1 task (low probCP)
+
+Aggregate all FIRA data for this subject into single .csv
+
+Perform basic analysis
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/Block0.csv b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block0.csv
new file mode 100644
index 0000000..aaf119e
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block0.csv
@@ -0,0 +1,821 @@
+direction,coherence,reversal,duration,finalDuration
+180,-1,0.0,0.4,NaN
+0,0,0.2,0.25,NaN
+0,0,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.6,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+180,0,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+0,0,0.2,0.6,NaN
+0,-1,0.2,0.6,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.6,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.6,NaN
+0,-1,0.2,0.6,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.2,0.6,NaN
+0,0,0.2,0.6,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.0,0.25,NaN
+180,0,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.2,0.25,NaN
+0,0,0.0,0.1,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.6,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.1,NaN
+180,0,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.2,0.6,NaN
+0,0,0.2,0.6,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.6,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.6,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.6,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.2,0.25,NaN
+180,0,0.2,0.6,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.6,NaN
+180,0,0.0,0.25,NaN
+180,100,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+0,100,0.0,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+180,0,0.0,0.2,NaN
+0,0,0.2,0.3,NaN
+0,100,0.2,0.6,NaN
+0,-1,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.4,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+0,0,0.0,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+180,0,0.0,0.3,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.0,0.4,NaN
+180,100,0.0,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.2,0.25,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.25,NaN
+180,100,0.0,0.2,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.6,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,100,0.0,0.25,NaN
+180,0,0.2,0.6,NaN
+180,0,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+0,100,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.2,NaN
+0,0,0.0,0.25,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.6,NaN
+180,100,0.2,0.6,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.6,NaN
+0,0,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+180,0,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+180,0,0.2,0.6,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.6,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.25,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.6,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.4,NaN
+180,-1,0.2,0.6,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.0,0.1,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.6,NaN
+0,0,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.6,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.2,0.6,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.25,NaN
+180,100,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+0,100,0.0,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+0,0,0.0,0.2,NaN
+0,0,0.2,0.25,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+180,100,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.2,0.6,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.0,0.1,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,100,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.0,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.2,NaN
+0,100,0.0,0.25,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.6,NaN
+0,0,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+0,0,0.2,0.4,NaN
+0,0,0.0,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.0,0.1,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,100,0.0,0.3,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,-1,0.2,0.6,NaN
+0,100,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.0,0.4,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.6,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,100,0.0,0.2,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,0,0.2,0.4,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.0,0.4,NaN
+0,0,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.2,0.25,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.6,NaN
+180,0,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.6,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+0,0,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.2,0.6,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.2,0.6,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.6,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,0,0.2,0.6,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.25,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+180,0,0.0,0.2,NaN
+0,0,0.0,0.2,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/Block0_metadata.json b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block0_metadata.json
new file mode 100755
index 0000000..986c1ef
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block0_metadata.json
@@ -0,0 +1,55 @@
+{
+ "seed": 1,
+ "num_trials": 820,
+ "prob_cp": 0.7,
+ "cond_prob_cp": 0.8749999999999999,
+ "theoretical_marginals": {
+ "coh": {
+ "0": 0.4,
+ "th": 0.55,
+ "100": 0.05
+ },
+ "vd": {
+ "100": 0.1,
+ "200": 0.1,
+ "250": 0.25,
+ "300": 0.25,
+ "400": 0.25,
+ "600": 0.05
+ },
+ "dir": {
+ "left": 0.5,
+ "right": 0.5
+ },
+ "cp": {
+ "false": 0.30000000000000004,
+ "true": 0.7
+ }
+ },
+ "empirical_marginals": {
+ "coh": {
+ "0": 0.3902439024390244,
+ "th": 0.5597560975609757,
+ "100": 0.05
+ },
+ "vd": {
+ "100": 0.1,
+ "200": 0.10365853658536585,
+ "250": 0.2451219512195122,
+ "300": 0.24024390243902438,
+ "400": 0.2573170731707317,
+ "600": 0.05365853658536585
+ },
+ "dir": {
+ "left": 0.48902439024390243,
+ "right": 0.5109756097560976
+ },
+ "cp": {
+ "true": 0.698780487804878,
+ "false": 0.30121951219512194
+ }
+ },
+ "marginal_tolerance": 0.02,
+ "csv_filename": "Block0.csv",
+ "csv_md5": "cf31feec5a3537a2cbe4de24877672bc"
+}
\ No newline at end of file
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/Block1.csv b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block1.csv
new file mode 100644
index 0000000..6197bc0
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block1.csv
@@ -0,0 +1,821 @@
+direction,coherence,reversal,duration,finalDuration
+0,0,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.2,0.25,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.0,0.3,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.0,0.25,NaN
+0,100,0.0,0.4,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.0,0.4,NaN
+0,100,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,0,0.2,0.3,NaN
+0,100,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.6,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.6,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,0,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.25,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.25,NaN
+0,0,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,100,0.0,0.6,NaN
+0,100,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.2,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+0,0,0.0,0.3,NaN
+180,0,0.0,0.2,NaN
+0,0,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.6,NaN
+180,-1,0.0,0.25,NaN
+0,0,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.0,0.6,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.0,0.2,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,0,0.0,0.25,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.2,0.4,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.2,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.2,0.6,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.0,0.3,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.2,0.6,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+0,0,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.0,0.1,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.2,0.25,NaN
+180,0,0.0,0.1,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+180,100,0.0,0.25,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.4,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.25,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.0,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.3,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.6,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.4,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+180,100,0.0,0.3,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.4,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.4,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,0,0.0,0.1,NaN
+0,0,0.0,0.3,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.0,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+0,0,0.0,0.3,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.0,0.1,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.1,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+0,100,0.2,0.3,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.3,NaN
+0,0,0.2,0.4,NaN
+180,0,0.0,0.25,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.0,0.1,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.0,0.1,NaN
+0,0,0.0,0.4,NaN
+180,0,0.0,0.25,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.0,0.1,NaN
+0,0,0.2,0.6,NaN
+0,-1,0.0,0.6,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,100,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.4,NaN
+0,0,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.4,NaN
+180,0,0.2,0.6,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.0,0.3,NaN
+0,0,0.0,0.25,NaN
+0,0,0.0,0.25,NaN
+0,0,0.0,0.25,NaN
+180,100,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.0,0.6,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.2,0.4,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+0,-1,0.0,0.25,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.2,0.3,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.2,0.25,NaN
+0,0,0.2,0.6,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.0,0.2,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.3,NaN
+0,0,0.2,0.25,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.3,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+180,100,0.0,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.2,0.3,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.4,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.6,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.2,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.0,0.2,NaN
+180,0,0.2,0.6,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.2,0.25,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+0,0,0.0,0.6,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+0,100,0.0,0.25,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.2,0.25,NaN
+180,0,0.0,0.3,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.4,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,100,0.0,0.1,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.25,NaN
+180,-1,0.0,0.4,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.3,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.0,0.3,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.4,NaN
+0,-1,0.0,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.0,0.6,NaN
+0,-1,0.0,0.2,NaN
+0,0,0.0,0.6,NaN
+180,0,0.0,0.25,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.2,0.4,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.0,0.25,NaN
+0,0,0.2,0.25,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.0,0.25,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.2,0.3,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.2,0.6,NaN
+180,0,0.0,0.1,NaN
+0,0,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+0,100,0.0,0.4,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.6,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,0,0.2,0.25,NaN
+180,0,0.0,0.6,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.3,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.6,NaN
+0,0,0.0,0.6,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.4,NaN
+180,100,0.0,0.25,NaN
+180,0,0.2,0.4,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.0,0.1,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.2,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.2,0.3,NaN
+0,0,0.0,0.25,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.25,NaN
+0,0,0.0,0.2,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.2,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.2,0.3,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+0,-1,0.0,0.3,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.4,NaN
+0,0,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.0,0.2,NaN
+0,0,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.0,0.3,NaN
+0,-1,0.0,0.1,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.0,0.2,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.2,0.25,NaN
+180,0,0.0,0.2,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,0,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.0,0.6,NaN
+0,0,0.0,0.25,NaN
+180,0,0.0,0.2,NaN
+0,0,0.2,0.4,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.2,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+180,0,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.0,0.2,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.2,0.4,NaN
+0,100,0.0,0.4,NaN
+180,0,0.0,0.6,NaN
+180,0,0.0,0.4,NaN
+180,0,0.0,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+0,-1,0.2,0.6,NaN
+180,0,0.0,0.4,NaN
+180,-1,0.0,0.6,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.2,NaN
+180,-1,0.2,0.4,NaN
+180,0,0.0,0.1,NaN
+180,-1,0.0,0.4,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.2,0.25,NaN
+0,0,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+180,-1,0.0,0.25,NaN
+180,0,0.0,0.1,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.0,0.3,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,0,0.2,0.3,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.1,NaN
+0,-1,0.0,0.3,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.0,0.3,NaN
+180,100,0.0,0.1,NaN
+180,-1,0.0,0.3,NaN
+0,0,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.6,NaN
+180,-1,0.2,0.4,NaN
+0,-1,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+0,-1,0.2,0.4,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.3,NaN
+0,0,0.2,0.4,NaN
+0,-1,0.0,0.2,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.0,0.4,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.2,0.25,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.0,0.3,NaN
+0,-1,0.2,0.4,NaN
+0,0,0.2,0.3,NaN
+0,0,0.0,0.3,NaN
+0,-1,0.0,0.4,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+0,-1,0.0,0.3,NaN
+180,-1,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+0,0,0.2,0.4,NaN
+180,-1,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.2,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,-1,0.0,0.1,NaN
+0,0,0.0,0.1,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.2,0.25,NaN
+180,-1,0.0,0.25,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.0,0.25,NaN
+0,0,0.0,0.1,NaN
+180,0,0.0,0.3,NaN
+0,0,0.0,0.4,NaN
+0,-1,0.0,0.25,NaN
+180,-1,0.2,0.4,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.0,0.25,NaN
+180,0,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,0,0.2,0.25,NaN
+180,-1,0.0,0.2,NaN
+0,-1,0.2,0.3,NaN
+180,0,0.2,0.4,NaN
+180,-1,0.2,0.25,NaN
+0,-1,0.0,0.3,NaN
+0,-1,0.0,0.6,NaN
+0,-1,0.0,0.3,NaN
+0,100,0.0,0.25,NaN
+180,0,0.2,0.3,NaN
+0,0,0.0,0.4,NaN
+0,0,0.2,0.25,NaN
+0,100,0.0,0.4,NaN
+0,-1,0.2,0.25,NaN
+180,-1,0.0,0.1,NaN
+0,0,0.2,0.3,NaN
+0,100,0.0,0.1,NaN
+0,-1,0.0,0.3,NaN
+180,0,0.0,0.4,NaN
+0,0,0.0,0.25,NaN
+180,-1,0.0,0.6,NaN
+180,0,0.0,0.2,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.2,0.6,NaN
+180,0,0.2,0.4,NaN
+0,-1,0.0,0.1,NaN
+180,0,0.2,0.3,NaN
+180,-1,0.0,0.1,NaN
+180,0,0.0,0.3,NaN
+180,-1,0.0,0.3,NaN
+0,-1,0.0,0.25,NaN
+0,0,0.0,0.1,NaN
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/Block1_metadata.json b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block1_metadata.json
new file mode 100755
index 0000000..bf0633d
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/Block1_metadata.json
@@ -0,0 +1,55 @@
+{
+ "seed": 2,
+ "num_trials": 820,
+ "prob_cp": 0.3,
+ "cond_prob_cp": 0.37499999999999994,
+ "theoretical_marginals": {
+ "coh": {
+ "0": 0.4,
+ "th": 0.55,
+ "100": 0.05
+ },
+ "vd": {
+ "100": 0.1,
+ "200": 0.1,
+ "250": 0.25,
+ "300": 0.25,
+ "400": 0.25,
+ "600": 0.05
+ },
+ "dir": {
+ "left": 0.5,
+ "right": 0.5
+ },
+ "cp": {
+ "false": 0.7,
+ "true": 0.3
+ }
+ },
+ "empirical_marginals": {
+ "coh": {
+ "0": 0.4073170731707317,
+ "th": 0.5621951219512196,
+ "100": 0.03048780487804878
+ },
+ "vd": {
+ "100": 0.11097560975609756,
+ "200": 0.11585365853658537,
+ "250": 0.23780487804878048,
+ "300": 0.24634146341463414,
+ "400": 0.24878048780487805,
+ "600": 0.04024390243902439
+ },
+ "dir": {
+ "left": 0.5085365853658537,
+ "right": 0.49146341463414633
+ },
+ "cp": {
+ "true": 0.3097560975609756,
+ "false": 0.6902439024390243
+ }
+ },
+ "marginal_tolerance": 0.02,
+ "csv_filename": "Block1.csv",
+ "csv_md5": "3e2e6baf7d4e2acc320cc317d55d3c4b"
+}
\ No newline at end of file
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/training_1.csv b/modularTasks/tasks/AdrianTests/trials_pre_expt/training_1.csv
new file mode 100644
index 0000000..7f79a5f
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/training_1.csv
@@ -0,0 +1,33 @@
+direction,coherence,reversal,duration,finalDuration
+180,100,0,.4,NaN
+180,100,0,.4,NaN
+180,100,0,.4,NaN
+180,100,0,.4,NaN
+180,100,0.2,.4,NaN
+180,100,0.2,.4,NaN
+180,100,0.2,.4,NaN
+180,100,0.2,.4,NaN
+0,100,0,.4,NaN
+0,100,0,.4,NaN
+0,100,0,.4,NaN
+0,100,0,.4,NaN
+0,100,0.2,.4,NaN
+0,100,0.2,.4,NaN
+0,100,0.2,.4,NaN
+0,100,0.2,.4,NaN
+180,100,0,.4,NaN
+180,100,0,.4,NaN
+180,100,0,.4,NaN
+180,100,0,.4,NaN
+180,100,0.2,.4,NaN
+180,100,0.2,.4,NaN
+180,100,0.2,.4,NaN
+180,100,0.2,.4,NaN
+0,100,0,.4,NaN
+0,100,0,.4,NaN
+0,100,0,.4,NaN
+0,100,0,.4,NaN
+0,100,0.2,.4,NaN
+0,100,0.2,.4,NaN
+0,100,0.2,.4,NaN
+0,100,0.2,.4,NaN
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/training_2_highprob.csv b/modularTasks/tasks/AdrianTests/trials_pre_expt/training_2_highprob.csv
new file mode 100755
index 0000000..b3b9eb0
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/training_2_highprob.csv
@@ -0,0 +1,821 @@
+direction,coherence,reversal,duration,finalDuration
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.6,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.6,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.6,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.2,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.6,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0,0.1,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.6,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.6,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.6,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+0,100,0,0.1,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.6,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.6,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.6,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.6,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.6,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.6,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.6,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0,0.2,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.6,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.2,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
diff --git a/modularTasks/tasks/AdrianTests/trials_pre_expt/training_2_lowprob.csv b/modularTasks/tasks/AdrianTests/trials_pre_expt/training_2_lowprob.csv
new file mode 100644
index 0000000..850bbce
--- /dev/null
+++ b/modularTasks/tasks/AdrianTests/trials_pre_expt/training_2_lowprob.csv
@@ -0,0 +1,821 @@
+direction,coherence,reversal,duration,finalDuration
+0,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0,0.1,NaN
+0,100,0,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.6,NaN
+180,100,0,0.4,NaN
+180,100,0,0.6,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.6,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0,0.1,NaN
+180,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.6,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.6,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+180,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.6,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.6,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0,0.1,NaN
+0,100,0,0.2,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.2,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0,0.2,NaN
+0,100,0,0.3,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.6,NaN
+180,100,0,0.3,NaN
+0,100,0,0.6,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.4,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.1,NaN
+0,100,0,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.2,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0,0.1,NaN
+0,100,0,0.4,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.6,NaN
+0,100,0,0.6,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.6,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.6,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0,0.3,NaN
+0,100,0,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.1,NaN
+0,100,0,0.2,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.2,NaN
+0,100,0,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.6,NaN
+180,100,0,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.6,NaN
+0,100,0,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0,0.25,NaN
+180,100,0,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.6,NaN
+0,100,0,0.2,NaN
+0,100,0,0.6,NaN
+180,100,0,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0,0.3,NaN
+180,100,0,0.25,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.6,NaN
+180,100,0,0.1,NaN
+0,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.6,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.6,NaN
+0,100,0,0.6,NaN
+180,100,0,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.2,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.2,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.3,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0,0.25,NaN
+0,100,0,0.3,NaN
+0,100,0,0.1,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+180,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+180,100,0,0.2,NaN
+0,100,0,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.6,NaN
+0,100,0,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.2,NaN
+180,100,0,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.4,NaN
+180,100,0,0.6,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0.2,0.6,NaN
+180,100,0,0.4,NaN
+180,100,0,0.6,NaN
+0,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0,0.2,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+180,100,0,0.4,NaN
+180,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.25,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+180,100,0,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.2,NaN
+0,100,0,0.2,NaN
+0,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.2,NaN
+0,100,0,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0,0.3,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.3,NaN
+0,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.4,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0,0.4,NaN
+0,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0,0.2,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+180,100,0,0.25,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0.2,0.4,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.3,NaN
+0,100,0,0.4,NaN
+180,100,0,0.3,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.3,NaN
+0,100,0,0.3,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0.2,0.4,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.1,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.25,NaN
+0,100,0,0.3,NaN
+180,100,0,0.25,NaN
+0,100,0,0.1,NaN
+180,100,0,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.4,NaN
+180,100,0,0.1,NaN
+0,100,0,0.25,NaN
+180,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0.2,0.25,NaN
+180,100,0,0.2,NaN
+0,100,0.2,0.3,NaN
+180,100,0.2,0.4,NaN
+180,100,0.2,0.25,NaN
+0,100,0,0.3,NaN
+0,100,0,0.6,NaN
+0,100,0,0.3,NaN
+0,100,0,0.25,NaN
+180,100,0.2,0.3,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+0,100,0,0.4,NaN
+0,100,0.2,0.25,NaN
+180,100,0,0.1,NaN
+0,100,0.2,0.3,NaN
+0,100,0,0.1,NaN
+0,100,0,0.3,NaN
+180,100,0,0.4,NaN
+0,100,0,0.25,NaN
+180,100,0,0.6,NaN
+180,100,0,0.2,NaN
+180,100,0,0.1,NaN
+180,100,0.2,0.6,NaN
+180,100,0.2,0.4,NaN
+0,100,0,0.1,NaN
+180,100,0.2,0.3,NaN
+180,100,0,0.1,NaN
+180,100,0,0.3,NaN
+180,100,0,0.3,NaN
+0,100,0,0.25,NaN
+0,100,0,0.1,NaN
diff --git a/modularTasks/tasks/topsTreeNodeTaskRTDots.m b/modularTasks/tasks/topsTreeNodeTaskRTDots.m
index 5919dc4..967c40c 100644
--- a/modularTasks/tasks/topsTreeNodeTaskRTDots.m
+++ b/modularTasks/tasks/topsTreeNodeTaskRTDots.m
@@ -41,7 +41,7 @@
% Timing properties, referenced in statelist
timing = struct( ...
'fixationTimeout', 5.0, ...
- 'holdFixation', 0.5, ...
+ 'holdFixation', 0.1, ...
'minimumRT', 0.05, ...
'showSmileyFace', 0, ...
'showFeedback', 1.0, ...
@@ -86,8 +86,8 @@
'xCenter', 0, ...
'yCenter', 0, ...
'nSides', 4, ...
- 'width', 1.0.*[1.0 0.1], ...
- 'height', 1.0.*[0.1 1.0], ...
+ 'width', 0.5.*[1.0 0.1], ...
+ 'height', 0.5.*[0.1 1.0], ...
'colors', [1 1 1])), ...
...
... % Targets drawable settings
@@ -95,8 +95,8 @@
'fevalable', @dotsDrawableTargets, ...
'settings', struct( ...
'nSides', 100, ...
- 'width', 1.5.*[1 1], ...
- 'height', 1.5.*[1 1])), ...
+ 'width', 1.3.*[1 1], ...
+ 'height', 1.3.*[1 1])), ...
...
... % Smiley face for feedback
'smiley', struct( ...
@@ -114,9 +114,9 @@
'coherenceSTD', 10, ...
'stencilNumber', 1, ...
'pixelSize', 6, ...
- 'diameter', 10, ...
- 'density', 180, ...
- 'speed', 2))));
+ 'diameter', 8, ...
+ 'density', 150, ...
+ 'speed', 5))));
% Readable settings
readable = struct( ...
@@ -146,7 +146,7 @@
'dotsReadableHIDGamepad', struct( ...
'start', {{@defineEventsFromStruct, struct( ...
'name', {'holdFixation', 'choseLeft', 'choseRight'}, ...
- 'component', {'Button1', 'Trigger1', 'Trigger2'}, ...
+ 'component', {'Button1', 'Trigger1', 'Trigger2'}, ... %i.e. A button, Left Trigger, Right Trigger
'isRelease', {true, false, false})}}), ...
...
... % Dummy to run in demo mode
@@ -445,7 +445,10 @@ function showFeedback(self)
% ---- Show trial feedback on the screen
%
- self.helpers.message.show(messageGroup);
+ if self.timing.showFeedback > 0
+ self.helpers.message.show(messageGroup);
+ end
+
end
%% Get Quest threshold value(s)
@@ -523,7 +526,7 @@ function prepareDrawables(self)
% Now set the target x,y
ensemble.setObjectProperty('xCenter', [fpX - td, fpX + td], 2);
- ensemble.setObjectProperty('yCenter', [fpY fpY], 2);
+ ensemble.setObjectProperty('yCenter', [fpY, fpY], 2);
end
% ---- Set a new seed base for the dots random-number process
diff --git a/modularTasks/tasks/topsTreeNodeTaskReversingDots4AFC.m b/modularTasks/tasks/topsTreeNodeTaskReversingDots4AFC.m
new file mode 100644
index 0000000..80daae9
--- /dev/null
+++ b/modularTasks/tasks/topsTreeNodeTaskReversingDots4AFC.m
@@ -0,0 +1,848 @@
+classdef topsTreeNodeTaskReversingDots4AFC < topsTreeNodeTask
+ % @class topsTreeNodeTaskReversingDots4AFC
+ %
+ % Reversing dots (RD) task
+ %
+ % For standard configurations, call:
+ % topsTreeNodeTaskReversingDots.getStandardConfiguration
+ %
+ % Otherwise:
+ % 1. Create an instance directly:
+ % task = topsTreeNodeTaskReversingDots();
+ %
+ % 2. Set properties. These are required:
+ % task.screenEnsemble
+ % task.helpers.readers.theObject
+ % Others can use defaults
+ %
+ % 3. Add this as a child to another topsTreeNode
+ %
+ % 10/01/19 created by aer
+
+ properties % (SetObservable)
+
+ % Trial properties.
+ %
+ % Set useQuest to a handle to a topsTreeNodeTaskRTDots to use it
+ % to get coherences
+ settings = struct( ...
+ 'useQuest', [], ...
+ 'valsFromQuest', [], ... % % cor vals on pmf to get
+ 'targetDistance', 8, ...
+ 'dotsSeedBase', 1, ...
+ 'reversalSet', [0.3 0.6 0.9], ... % if reversal<-1
+ 'reversalType', 'time'); % 'time' or 'hazard'; see prepareDrawables
+
+ % Timing properties, referenced in statelist
+ timing = struct( ...
+ 'fixationTimeout', 5.0, ...
+ 'holdFixation', 0, ...
+ 'duration', [0.2 0.5 1.0], ... % min mean max
+ 'finalEpochDuration', [], ...
+ 'minEpochDuration', 0.1, ...
+ 'maxEpochDuration', 5.0, ...
+ 'minimumRT', 0.05, ...
+ 'showFeedback', 0.5, ...
+ 'interTrialInterval', 1.0, ...
+ 'preDots', [0.1 0.3 0.6], ...
+ 'dotsTimeout', 5.0, ...
+ 'choiceTimeout', 8.0);
+
+ % Fields below are optional but if found with the given names
+ % will be used to automatically configure the task
+
+ % Array of structures of independent variables, used by makeTrials
+ % NOTE that this is the simple way of setting up this struct. You can
+ % also still use:
+ % indepdendentVariables = struct( ...
+ % 'direction', struct('values', [0 180], 'priors', []), ...
+ % etc.
+ independentVariables = struct( ...
+ 'direction', [0 180], ...
+ 'coherence', 90, ...
+ 'reversal', [0.2 0.5], ...
+ 'duration', 1.0, ...
+ 'finalDuration', []);
+
+ % dataFieldNames are used to set up the trialData structure
+ trialDataFields = { ...
+ 'RT', ...
+ 'cpRT', ...
+ 'dirChoice', ...
+ 'cpChoice', ...
+ 'dirCorrect', ...
+ 'cpCorrect', ...
+ 'direction', ...
+ 'coherence', ...
+ 'randSeedBase', ...
+ 'fixationOn', ...
+ 'fixationStart', ...
+ 'targetOn', ...
+ 'dotsOn', ...
+ 'finalCPTime', ... % actual CP time
+ 'dotsOff', ...
+ 'choiceTime', ...
+ 'cpChoiceTime', ...
+ 'blankScreen', ...
+ 'feedbackOn', ...
+ 'subject', ...
+ 'date', ...
+ 'probCP', ...
+ 'cpScreenOn', ...
+ 'dummyBlank', ...
+ 'cpTimeDotsClock', ...
+ 'firstDraw', ...
+ 'lastDraw', ...
+ 'firstDrawPostCP', ...
+ 'numberDrawPreCP', ...
+ 'numberDrawPostCP'};
+
+ % Drawables settings
+ drawable = struct( ...
+ ...
+ ... % Stimulus ensemble and settings
+ 'stimulusEnsemble', struct( ...
+ ...
+ ... % Fixation drawable settings
+ 'fixation', struct( ...
+ 'fevalable', @dotsDrawableTargets, ...
+ 'settings', struct( ...
+ 'xCenter', 0, ...
+ 'yCenter', 0, ...
+ 'nSides', 4, ...
+ 'width', 0.5.*[1.0 0.1], ...
+ 'height', 0.5.*[0.1 1.0], ...
+ 'colors', [1 1 1])), ...
+ ...
+ ... % Targets drawable settings
+ 'targets', struct( ...
+ 'fevalable', @dotsDrawableTargets, ...
+ 'settings', struct( ...
+ 'nSides', 100, ...
+ 'width', 1.3.*[1 1], ...
+ 'height', 1.3.*[1 1])), ...
+ ...
+ ... % Dots drawable settings
+ 'dots', struct( ...
+ 'fevalable', @dotsDrawableDotKinetogram, ...
+ 'settings', struct( ...
+ 'xCenter', 0, ...
+ 'yCenter', 0, ...
+ 'coherenceSTD', 10, ...
+ 'stencilNumber', 1, ...
+ 'pixelSize', 6, ...
+ 'diameter', 8, ...
+ 'density', 150, ...
+ 'speed', 5)), ...
+ ... % CP Targets drawable settings
+ 'cpScreen', struct( ...
+ 'fevalable', @dotsDrawableText, ...
+ 'settings', struct( ...
+ 'x', 0, ...
+ 'y', 0))));
+
+ % Readable settings
+ readable = struct( ...
+ ...
+ ... % The readable object
+ 'reader', struct( ...
+ ...
+ 'copySpecs', struct( ...
+ ...
+ ... % The keyboard events .. 'uiType' is used to conditionally use these depending on the theObject type
+ 'dotsReadableHIDKeyboard', struct( ...
+ 'start', {{@defineEventsFromStruct, struct( ...
+ 'name', {'holdFixation', 'choseTopLeft', 'choseTopRight', 'choseBottomLeft', 'choseBottomRight'}, ...
+ 'component', {'KeyboardSpacebar', 'KeyboardA', 'KeyboardK', 'KeyboardZ', 'KeyboardM'}, ...
+ 'isRelease', {true, false, false, false, false})}}), ...
+ ...
+ ... % Gamepad
+ 'dotsReadableHIDGamepad', struct( ...
+ 'start', {{@defineEventsFromStruct, struct( ...
+ 'name', {'holdFixation', 'choseLeft', 'choseRight', 'nocpResponse'}, ...
+ 'component', {'Button1', 'Trigger1', 'Trigger2', 'Button2'}, ... %i.e. A button, Left Trigger, Right Trigger, B button
+ 'isRelease', {true, false, false, false})}}), ...
+ ...
+ ... % Dummy to run in demo mode
+ 'dotsReadableDummy', struct( ...
+ 'start', {{@defineEventsFromStruct, struct( ...
+ 'name', {'holdFixation', 'choseLeft', 'choseRight'}, ...
+ 'component', {'Dummy1', 'Dummy2', 'Dummy3'})}}))));
+
+ % Feedback messages
+ message = struct( ...
+ ...
+ 'message', struct( ...
+ ...
+ ... Instructions
+ 'Instructions', struct( ...
+ 'text', {{'bleble', 'blabla'}}, ...
+ 'duration', 1, ...
+ 'pauseDuration', 0.5, ...
+ 'bgEnd', [0 0 0]), ...
+ ...
+ ... Correct
+ 'Correct', struct( ...
+ 'text', 'Correct', ...
+ ...%'playable', 'cashRegister.wav', ...
+ 'bgStart', [0 0.25 0], ...
+ 'bgEnd', [0 0 0]), ...
+ ...
+ ... Error
+ 'Error', struct( ...
+ 'text', 'Error', ...
+ ...%'playable', 'buzzer.wav', ...
+ 'bgStart', [0.25 0 0], ...
+ 'bgEnd', [0 0 0]), ...
+ ...
+ ... No choice
+ 'No_choice', struct( ...
+ 'text', 'No choice - please try again!')));
+
+ % metadata
+ subject;
+ date;
+ probCP;
+ questThreshold;
+
+ % stop condition
+ stopCondition;
+ consecutiveCorrect;
+ end
+
+ properties (SetAccess = protected)
+
+ % Check for changes in properties that require drawables to be recomputed
+ targetDistance;
+
+ % Reversal directions/times -- precomputed for each trial and then executed.
+ reversals = struct('directions', [], 'plannedTimes', [], ...
+ 'actualTimes', []);
+
+ % Keep track of reversals
+ nextReversal;
+
+ % indices for drawable objects
+ fpIndex;
+ targetIndex;
+ dotsIndex;
+ cpScreenIndex;
+ end
+
+ methods
+
+ %% Constuctor
+ % Use topsTreeNodeTask method, which can parse the argument list
+ % that can set properties (even those nested in structs)
+ function self = topsTreeNodeTaskReversingDots4AFC(varargin)
+
+ % ---- Make it from the superclass
+ %
+ self = self@topsTreeNodeTask(varargin{:});
+ end
+
+ %% Start task (overloaded)
+ %
+ % Put stuff here that you want to do before each time you run this
+ % task
+ function startTask(self)
+ if ~isempty(self.questThreshold)
+ if ~isnumeric(self.questThreshold)
+ self.questThreshold = ...
+ self.questThreshold.getQuestThreshold();
+ if self.questThreshold <= 0 || ...
+ self.questThreshold >= 100
+ error(['Invalid questThreshold of ', ...
+ num2str(self.questThreshold)])
+ end
+ end
+ end
+ self.consecutiveCorrect = 0;
+
+ if ~isempty(self.settings.useQuest)
+
+ % Update independent variable struct using Quest threshold
+ self.independentVariables.coherence = ...
+ self.settings.useQuest.getQuestThreshold( ...
+ self.settings.valsFromQuest);
+ end
+
+ % ---- Get some useful indices
+ %
+ fn = fieldnames(self.drawable.stimulusEnsemble);
+ self.fpIndex = find(strcmp('fixation', fn));
+ self.targetIndex = find(strcmp('targets', fn));
+ self.dotsIndex = find(strcmp('dots', fn));
+ self.cpScreenIndex = find(strcmp('cpScreen', fn));
+
+ % ---- Initialize the state machine
+ %
+ self.initializeStateMachine();
+
+ % ---- Show task-specific instructions
+ %
+ self.helpers.message.show('Instructions');
+ end
+
+ %% Finish task (overloaded)
+ %
+ % Put stuff here that you want to do after each time you run this
+ % task
+ function finishTask(self)
+ end
+
+ %% Start trial
+ %
+ % Put stuff here that you want to do before each time you run a trial
+ function startTrial(self)
+
+ % ---- Prepare components
+ %
+ self.prepareDrawables();
+
+ % ---- Use the task ITI
+ %
+ self.interTrialInterval = self.timing.interTrialInterval;
+
+ % ---- Show information about the task/trial
+ %
+ % Task information
+ taskString = sprintf('%s (task %d/%d): %d dirCorrect, %d cpCorrect, %d dirError, %d cpError, mean RT=%.2f', ...
+ self.name, self.taskID, length(self.caller.children), ...
+ sum([self.trialData.dirCorrect]==1), ...
+ sum([self.trialData.cpCorrect]==1), ...
+ sum([self.trialData.dirCorrect]==0), ...
+ sum([self.trialData.cpCorrect]==0), ...
+ nanmean([self.trialData.RT]));
+
+ % Trial information
+ trial = self.getTrial();
+ if ~isempty(self.reversals)
+ numReversals = length(self.reversals.plannedTimes)-1;
+ else
+ numReversals = 0;
+ end
+
+ trialString = sprintf('Trial %d/%d, coh=%.0f, dur=%.2f, nflips=%d', ...
+ self.trialCount, numel(self.trialData), trial.coherence, ...
+ trial.duration, numReversals);
+
+ % Show the information on the GUI
+ self.updateStatus(taskString, trialString); % just update the second one
+ end
+
+ %% Finish Trial
+ %
+ % Could add stuff here
+ function finishTrial(self)
+ % update running count of consecutive correct trials
+ trial = self.getTrial();
+ dcorr = trial.dirCorrect;
+ ccorr = trial.cpCorrect;
+
+ % fetch important properties from the dotsDrawableDotKinetogram
+ % in order to be able to reproduce the dots at a later stage
+ dDDK = self.helpers.stimulusEnsemble.theObject;
+ trial.firstDraw = dDDK.getObjectProperty( ...
+ 'firstDraw', ...
+ self.dotsIndex);
+ trial.firstDrawPostCP = dDDK.getObjectProperty( ...
+ 'firstDrawPostCP', ...
+ self.dotsIndex);
+ trial.lastDraw = dDDK.getObjectProperty( ...
+ 'lastDraw', ...
+ self.dotsIndex);
+ trial.numberDrawPreCP = dDDK.getObjectProperty( ...
+ 'numberDrawPreCP', ...
+ self.dotsIndex);
+ trial.numberDrawPostCP = dDDK.getObjectProperty( ...
+ 'numberDrawPostCP', ...
+ self.dotsIndex);
+ trial.cpTimeDotsClock = dDDK.getObjectProperty( ...
+ 'cpTimeDotsClock', ...
+ self.dotsIndex);
+ self.setTrial(trial);
+
+ if ~isnan(ccorr) && ~isnan(dcorr)
+ if dcorr && ccorr
+ self.consecutiveCorrect = self.consecutiveCorrect + 1;
+ if isnumeric(self.stopCondition) && ...
+ self.consecutiveCorrect == self.stopCondition
+ self.abort()
+ end
+ else
+ self.consecutiveCorrect = 0;
+ end
+ end
+ end
+
+ %% Check for flip
+ %
+ %
+ function next = checkForReversal(self)
+
+ % For now, never return anything
+ next = '';
+
+ % Make sure we're reversing
+ if isempty(self.nextReversal)
+ return
+ end
+
+ % Get the trial for timing info
+ trial = self.getTrial();
+
+ % Check for reversal
+ if feval(self.clockFunction) - trial.trialStart - trial.dotsOn >= ...
+ self.reversals.plannedTimes(self.nextReversal)
+
+ % Reverse!
+ %
+ % Set the direction
+ eh = self.helpers.stimulusEnsemble;
+ eh.theObject.setObjectProperty('direction', ...
+ self.reversals.directions(self.nextReversal), ...
+ self.dotsIndex);
+ eh.theObject.setObjectProperty('passedCP', true, ...
+ self.dotsIndex);
+ eh.theObject.setObjectProperty('cpTimeDotsClock', ...
+ now, self.dotsIndex);
+
+ % Explicitly flip here so we can get the timestamp
+ frameInfo = eh.theObject.callObjectMethod(...
+ @dotsDrawable.drawFrame, {}, [], true);
+
+ % Save the time in SCREEN time
+ self.reversals.actualTimes(self.nextReversal) = ...
+ eh.getSynchronizedTime(frameInfo.onsetTime, true) - ...
+ trial.dotsOn;
+
+ % For debugging
+ fprintf('FLIPPED to %d at time: %.2f planned, %.2f actual\n', ...
+ self.reversals.directions(self.nextReversal), ...
+ self.reversals.plannedTimes(self.nextReversal), ...
+ self.reversals.actualTimes(self.nextReversal))
+
+ % update the counter
+ self.nextReversal = self.nextReversal + 1;
+ if self.nextReversal > length(self.reversals.plannedTimes)
+ self.nextReversal = [];
+ end
+ end
+ end
+
+ %% Check for choice
+ %
+ % Save choice/RT information and set up feedback for the dots task
+ function nextState = checkForChoice(self, events, eventTag, ...
+ nextStateAfterChoice)
+% disp('JUST ENTERED CHECK FOR CHOICE')
+% disp('events are')
+% disp(events)
+%
+ % ---- Check for event
+ %
+ eventName = self.helpers.reader.readEvent(events, self, ...
+ eventTag);
+
+ % Default return
+ nextState = [];
+
+ % Nothing... keep checking
+ if isempty(eventName)
+ return
+ end
+ isCPchoice = strcmp(eventName, 'holdFixation') || ...
+ strcmp(eventName, 'nocpResponse');
+% disp('detected Event')
+% disp(eventName)
+%
+ % Get current task/trial
+ trial = self.getTrial();
+
+ % ---- Good choice!
+ %
+ if isCPchoice
+ % Override completedTrial flag
+ self.completedTrial = true;
+ trial.cpRT = trial.cpChoiceTime - trial.choiceTime;
+ else
+ % Check for minimum RT, wrt dotsOn for RT, dotsOff for non-RT
+ RT = trial.choiceTime - trial.dotsOff;
+ % Save RT
+ trial.RT = RT;
+ if RT < self.timing.minimumRT
+ % write metadata (same for all trials)
+ trial.subject = self.subject;
+ trial.date = self.date;
+ trial.probCP = self.probCP;
+ self.setTrial(trial);
+ return
+ end
+ end
+
+ % Jump to next state when done
+ nextState = nextStateAfterChoice;
+
+ % Save the choice
+ if isCPchoice
+ trial.cpChoice = double(strcmp(eventName, 'holdFixation'));
+ trial.cpCorrect = double(...
+ (trial.cpChoice==0 && trial.reversal == 0) || ...
+ (trial.cpChoice==1 && trial.reversal ~= 0));
+ else
+ trial.dirChoice = double(strcmp(eventName, 'choseRight'));
+ % Mark as correct/error
+ trial.dirCorrect = double( ...
+ (trial.dirChoice==0 && cosd(trial.direction)<0) || ...
+ (trial.dirChoice==1 && cosd(trial.direction)>0));
+ end
+
+ % Save the final reversal time
+ if ~isempty(self.reversals)
+ trial.finalCPTime = self.reversals.actualTimes(end);
+ end
+
+ % Store the reversal times
+ topsDataLog.logDataInGroup(self.reversals, ...
+ 'ReversingDotsReversals');
+
+ % write metadata (same for all trials)
+ trial.subject = self.subject;
+ trial.date = self.date;
+ trial.probCP = self.probCP;
+
+ % ---- Re-save the trial
+ %
+ self.setTrial(trial);
+ end
+
+ %% Show feedback
+ %
+ function showFeedback(self)
+
+ % Get current task/trial
+ trial = self.getTrial();
+
+ % Get feedback message group
+ if trial.dirCorrect * trial.cpCorrect == 1
+ messageGroup = 'Correct';
+ elseif trial.dirCorrect * trial.cpCorrect == 0
+ messageGroup = 'Error';
+ else
+ messageGroup = 'No_choice';
+ end
+
+ % --- Show trial feedback in GUI/text window
+ %
+ trialString = ...
+ sprintf('Trial %d/%d: %s, RT=%.2f', ...
+ self.trialCount, numel(self.trialData), ...
+ messageGroup, trial.RT);
+ self.updateStatus([], trialString); % just update the second one
+
+ % ---- Show trial feedback on the screen
+ %
+ if self.timing.showFeedback > 0
+ self.helpers.message.show(messageGroup, self, ...
+ 'feedbackOn');
+ end
+ end
+
+% function displayCPchoiceScreen(self)
+% % do nothing on purpose
+% end
+ end
+
+ methods (Access = protected)
+
+ %% Prepare drawables for this trial
+ %
+ function prepareDrawables(self)
+
+ % ---- Get the current trial and other useful stuff, and set
+ % values
+ %
+ trial = self.getTrial();
+
+ % negative coherence in the .csv file is our way to code for
+ % threshold coherence
+ if trial.coherence < 0
+ trial.coherence = self.questThreshold;
+ end
+
+ % Set the seed base for the random number generator
+ trial.randSeedBase = sum(clock*10);
+
+ % Set the dots duration if not already given in trial struct
+ if ~isfinite(trial.duration)
+ trial.duration = self.timing.duration; % Set the dots duration
+ end
+
+ % Funny value in case we want to control timing after final
+ % change-point
+ if ~isfinite(trial.finalDuration)
+ trial.finalDuration = self.timing.finalEpochDuration;
+ end
+
+ % ---- Compute reversal times, start/final directions
+ %
+ % Defaults -- no flippy!
+ self.reversals = [];
+ self.nextReversal = [];
+ startDirection = trial.direction;
+
+ % Use trial.reversal property
+ if trial.reversal ~= 0
+
+ % Setting up reversals array
+ switch(self.settings.reversalType)
+ case 'hazard'
+
+ % Interpret "reversal" as fixed hazard rate.
+ [plannedTimes, trial.duration] = ...
+ computeChangePoints(trial.reversal, ...
+ self.timing.minEpochDuration, ...
+ self.timing.maxEpochDuration, ...
+ trial.duration, ...
+ trial.finalDuration);
+
+ otherwise % case 'time'
+
+ % Special case -- check if trial.reversal < 0 ... if so,
+ % that's just a flag saying to use the set
+ if trial.reversal < 0
+ plannedTimes = self.settings.reversalSet;
+ else
+ plannedTimes = trial.reversal;
+ end
+
+ % Strip unnecessary values
+ plannedTimes = plannedTimes(plannedTimes < ...
+ trial.duration);
+ end
+
+ % Check that we have reversals
+ numReversals = length(plannedTimes);
+ if numReversals > 0
+
+ % Set up reversals struct, with one entry per direction epoch
+ otherDirection = setdiff(...
+ self.independentVariables.direction, ...
+ trial.direction);
+ self.reversals.directions = repmat(trial.direction, ...
+ 1, numReversals+1);
+ self.reversals.directions(end:-2:1) = otherDirection;
+ self.reversals.plannedTimes = [0 plannedTimes];
+ self.reversals.actualTimes = ...
+ [0 nans(1, numReversals)];
+ self.nextReversal = 2;
+ startDirection = ...
+ self.reversals.directions(1);
+ % note how trial.direction represents the direction of
+ % motion in the last epoch of the trial
+ trial.direction = ...
+ self.reversals.directions(end);
+ end
+ end
+
+ % Set the dots duration in the statelist
+ self.stateMachine.editStateByName('showDots', 'timeout', ...
+ trial.duration);
+
+ % ---- Possibly update all stimulusEnsemble objects if settings
+ % changed
+ %
+ ensemble = self.helpers.stimulusEnsemble.theObject;
+ td = self.settings.targetDistance;
+ if isempty(self.targetDistance) || self.targetDistance ~= td
+
+ % Save current value(s)
+ self.targetDistance = self.settings.targetDistance;
+
+ % Get target locations relative to fp location
+ fpX = ensemble.getObjectProperty('xCenter', self.fpIndex);
+ fpY = ensemble.getObjectProperty('yCenter', self.fpIndex);
+
+ % Now set the targets x,y
+ ensemble.setObjectProperty('xCenter', ...
+ [fpX + td, fpX - td], self.targetIndex);
+ ensemble.setObjectProperty('yCenter', ...
+ [fpY, fpY], self.targetIndex);
+ end
+
+ % ---- Save dots properties
+ %
+ ensemble.setObjectProperty('randBase', trial.randSeedBase, ...
+ self.dotsIndex);
+ ensemble.setObjectProperty('coherence', trial.coherence, ...
+ self.dotsIndex);
+ ensemble.setObjectProperty('direction', startDirection, ...
+ self.dotsIndex);
+
+ % reset the timestamps and draw counters for current trial
+ ensemble.setObjectProperty('firstDraw', nan, self.dotsIndex);
+ ensemble.setObjectProperty('firstDrawPostCP', nan, ...
+ self.dotsIndex);
+ ensemble.setObjectProperty('lastDraw', nan, self.dotsIndex);
+ ensemble.setObjectProperty('numberDrawPreCP', 0, ...
+ self.dotsIndex);
+ ensemble.setObjectProperty('numberDrawPostCP', 0, ...
+ self.dotsIndex);
+ ensemble.setObjectProperty('cpTimeDotsClock', nan, ...
+ self.dotsIndex);
+ ensemble.setObjectProperty('passedCP', false, self.dotsIndex);
+
+ self.setTrial(trial);
+
+ % ---- Set CP screen instructions
+ %
+% ensemble.setObjectProperty('string', 'switch', 5);
+ ensemble.setObjectProperty('string', ...
+ 'WAS THERE A SWITCH? (YES=A / NO=B)', ...
+ self.cpScreenIndex);
+
+
+ % ---- Prepare to draw dots stimulus
+ %
+ ensemble.callObjectMethod(@prepareToDrawInWindow);
+
+ % ---- Save the trial
+ self.setTrial(trial);
+ end
+
+ %% Initialize StateMachine
+ %
+ function initializeStateMachine(self)
+
+ % ---- Fevalables for state list
+ %
+ % blanks = {@dotsTheScreen.blankScreen};
+ blanks = {@blankScreen, self, 'blankScreen'};
+
+ % chkuif = {@getNextEvent, self.helpers.reader.theObject, false, {'holdFixation'}};
+ chkuif = {@getNextEvent, self.helpers.reader.theObject, false, {'holdFixation'}};
+
+ chkuib = {}; % {@getNextEvent, self.readables.theObject, false, {}}; % {'brokeFixation'}
+
+ chkuic = {@checkForChoice, self, {'choseLeft' 'choseRight'}, ...
+ 'choiceTime', 'waitForCPchoice'};
+
+ chkuicp = {@checkForChoice, self, ...
+ {'holdFixation' 'nocpResponse'}, 'cpChoiceTime', 'blank'};
+
+ chkrev = {@checkForReversal, self};
+
+ showfx = {@draw, self.helpers.stimulusEnsemble, ...
+ {self.fpIndex, ...
+ [self.targetIndex self.dotsIndex self.cpScreenIndex]}, ...
+ self, 'fixationOn'};
+
+ showt = {@draw, self.helpers.stimulusEnsemble, ...
+ {self.targetIndex, []}, self, 'targetOn'};
+
+ showfb = {@showFeedback, self};
+
+ showd = {@draw,self.helpers.stimulusEnsemble, ...
+ {self.dotsIndex, []}, self, 'dotsOn'};
+
+ hided = {@draw,self.helpers.stimulusEnsemble, {[], ...
+ [self.fpIndex self.dotsIndex]}, self, 'dotsOff'};
+
+ cpscr = {@draw,self.helpers.stimulusEnsemble, ...
+ {[self.cpScreenIndex], ...
+ [self.fpIndex self.dotsIndex self.targetIndex]}, self, ...
+ 'cpScreenOn'};
+
+% cpopts = {@draw, self.helpers.stimulusEnsemble, {{'colors', ...
+% [1 1 1], 1}, {'isVisible', true, [4]}, ...
+% {'isVisible', false, [1 2 3]}}, self, 'cpScreenOn'};
+
+ blank = {@draw,self.helpers.stimulusEnsemble, ...
+ {[], [...
+ self.fpIndex ...
+ self.dotsIndex ...
+ self.targetIndex ...
+ self.cpScreenIndex]}, self, ...
+ 'dummyBlank'};
+
+ % Drift correction
+ hfdc = {@reset, self.helpers.reader.theObject, true};
+
+ % Save values in trialData
+ % tdhf = {@setTrialDataValue, self, 'holdFixation', value, trialIndex};
+
+ % Activate/deactivate readable events
+ % See dotsReadable.setEventsActiveFlag for function signature
+ sea = @setEventsActiveFlag;
+
+ % this activates holdFixation and deactivates everything else
+ gwfxw = {sea, self.helpers.reader.theObject, ...
+ 'holdFixation', 'all'};
+
+ % nothing
+ gwfxh = {};
+
+ % this activates choseLeft and choseRight but deactivates
+ % everything else
+ gwts = {sea, self.helpers.reader.theObject, ...
+ {'choseLeft', 'choseRight'}, 'all'};
+
+ % this activates holdFixation (to report CP) and nocpResponse but deactivates
+ % everything else
+ gwcp = {sea, self.helpers.reader.theObject, ...
+ {'holdFixation', 'nocpResponse'}, 'all'};
+
+ % ---- Timing variables, read directly from the timing property struct
+ %
+ t = self.timing;
+
+ % ---- Make the state machine. These will be added into the
+ % stateMachine (in topsTreeNode)
+ %
+ states = {...
+ 'name' 'entry' 'input' 'timeout' 'exit' 'next' ; ...
+ 'showFixation' showfx {} 0 {} 'waitForFixation' ; ...
+ 'waitForFixation' gwfxw chkuif t.fixationTimeout {} 'blankNoFeedback' ; ...
+ 'holdFixation' gwfxh chkuib t.holdFixation hfdc 'showTargets' ; ...
+ 'showTargets' showt chkuib t.preDots {} 'preDots' ; ...
+ 'preDots' {} {} 0 {} 'showDots' ; ...
+ 'showDots' showd chkrev 0 hided 'waitForChoice' ; ...
+ 'waitForChoice' gwts chkuic t.choiceTimeout cpscr 'blank' ; ...
+ 'waitForCPchoice' gwcp chkuicp t.choiceTimeout blank 'blank' ; ...
+ 'blank' {} {} 0.2 blanks 'showFeedback' ; ...
+ 'showFeedback' showfb {} t.showFeedback blanks 'done' ; ...
+ 'blankNoFeedback' {} {} 0 blanks 'done' ; ...
+ 'done' {} {} 0 {} '' ; ...
+ };
+
+ % Set up the state list with automatic drawing/fipping of the
+ % objects in stimulusEnsemble in the given list of states
+ self.addStateMachineWithDrawing(states, ...
+ 'stimulusEnsemble', {'preDots' 'showDots'});
+
+ end
+ end
+
+ methods (Static)
+
+ %% ---- Utility for defining standard configurations
+ %
+ % name is string
+ function task = getStandardConfiguration(name, varargin)
+
+ % ---- Get the task object, with optional property/value pairs
+ %
+ task = topsTreeNodeTaskReversingDots4AFC(name, varargin{:});
+ end
+
+ %% ---- Utility for getting test configuration
+ %
+ function task = getTestConfiguration()
+
+ task = topsTreeNodeTaskReversingDots4AFC();
+ task.timing.minimumRT = 0.3;
+ task.message.message.Instructions.text = {'Testing', 'topsTreeNodeTaskRTDots'};
+ end
+ end
+end
diff --git a/modularTasks/testing/dotsReproducibilityTest/cpTime_with_dotsClock.txt b/modularTasks/testing/dotsReproducibilityTest/cpTime_with_dotsClock.txt
new file mode 100644
index 0000000..cabb848
--- /dev/null
+++ b/modularTasks/testing/dotsReproducibilityTest/cpTime_with_dotsClock.txt
@@ -0,0 +1,34 @@
+The variable t below was obtained by calling readtable on the FIRA .csv file from session 2019_12_18_14_00 (task100)
+and only taking the first 10 rows of the resulting table (only 10 valid trials were performed)
+
+======== Code on MATLAB console leading to plot with filename similar to present text filename =====
+
+>> t
+t =
+ taskID trialIndex trialStart trialEnd RT cpRT dirChoice cpChoice dirCorrect cpCorrect direction coherence randSeedBase fixationOn fixationStart targetOn dotsOn finalCPTime dotsOff choiceTime cpChoiceTime blankScreen feedbackOn subject date probCP cpScreenOn dummyBlank cpTimeDotsClock firstDraw lastDraw firstDrawPostCP numberDrawPreCP numberDrawPostCP reversal duration finalDuration
+ ______ __________ __________ __________ _______ _______ _________ ________ __________ _________ _________ _________ ____________ __________ _____________ ________ _______ ___________ _______ __________ ____________ ___________ __________ _______ __________ ______ __________ __________ _______________ __________ __________ _______________ _______________ ________________ ________ ________ _____________
+ 100 1 3.0322e+06 3.0322e+06 0.43945 0.968 1 1 1 0 0 0 1 0.071271 NaN 1.0204 1.2069 NaN 1.3256 1.7651 2.7331 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7833 2.7494 NaN 7.3778e+05 7.3778e+05 NaN 7 0 0 0.1 NaN
+ 100 2 3.0322e+06 3.0322e+06 0.28089 0.79999 1 1 1 1 0 14 2 0.072815 NaN 0.63214 0.86943 0.23729 1.1406 1.4215 2.2215 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4287 2.2254 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 2 0.2 0.25 NaN
+ 100 3 3.0322e+06 3.0322e+06 0.14804 0.824 1 1 1 0 0 14 3 0.066609 NaN 0.49034 0.82932 NaN 1.0497 1.1977 2.0217 3.0322e+06 NaN 99 2.0191e+11 0.3 1.2022 2.0327 NaN 7.3778e+05 7.3778e+05 NaN 13 0 0 0.2 NaN
+ 100 4 3.0322e+06 3.0322e+06 0.17857 0.632 1 1 0 1 180 14 4 0.047647 NaN 1.0646 1.3697 0.23729 1.6239 1.8025 2.4345 3.0322e+06 NaN 99 2.0191e+11 0.3 1.8104 2.4375 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 15 1 0.2 0.25 NaN
+ 100 5 3.0322e+06 3.0322e+06 0.19255 0.784 1 1 0 1 180 14 5 0.032352 NaN 0.45608 0.82896 0.23729 1.2527 1.4452 2.2292 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4561 2.2357 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 6 3.0322e+06 3.0322e+06 0.17039 0.896 1 1 1 1 0 14 6 0.041483 NaN 0.44826 1.1601 0.23886 1.5685 1.7389 2.6349 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7549 2.6532 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 7 3.0322e+06 3.0322e+06 0.26472 0.84 1 1 0 1 180 14 7 0.03441 NaN 0.35644 0.81407 0.23729 1.1361 1.4008 2.2408 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4073 2.2547 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 8 3.0322e+06 3.0322e+06 0.18809 0.912 1 1 0 0 180 0 8 0.042727 NaN 0.41561 0.70374 NaN 0.95895 1.147 2.059 3.0322e+06 NaN 99 2.0191e+11 0.3 1.1623 2.0776 NaN 7.3778e+05 7.3778e+05 NaN 16 0 0 0.25 NaN
+ 100 9 3.0322e+06 3.0322e+06 0.42278 1.176 1 1 1 1 0 14 9 0.044909 NaN 0.45169 0.75663 0.23384 1.0754 1.4982 2.6742 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5161 2.6856 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 10 3.0322e+06 3.0322e+06 0.27053 0.84799 1 1 0 0 180 0 10 0.040582 NaN 0.6338 0.88804 NaN 1.2946 1.5651 2.4131 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5827 2.4301 NaN 7.3778e+05 7.3778e+05 NaN 25 0 0 0.4 NaN
+>> plot(t.trialIndex,(t.cpTimeDotsClock - t.firstDraw)*24*3600)
+>> plot(t.trialIndex,(t.cpTimeDotsClock - t.firstDraw)*24*3600,'*', 'MarkerSize',5)
+>> plot(t.trialIndex,(t.cpTimeDotsClock - t.firstDraw)*24*3600,'*', 'MarkerSize',15)
+>> plot(t.trialIndex,(t.cpTimeDotsClock - t.firstDraw)*24*3600,'*r', 'MarkerSize',15)
+>> ylim(.2,.25)
+Error using ylim (line 29)
+Wrong number of arguments
+>> ylim([.2,.25])
+>> hold on
+>> plot(t.trialIndex,t.finalCPTime,'ob', 'MarkerSize',15)
+>> legend({'dotsClock','finalCPTime'})
+>> ylabel('time (s)')
+>> xlabel('trialIndex')
+>> title('a more precise measure of CPtime (red)')
+>> hold off
diff --git a/modularTasks/testing/dotsReproducibilityTest/ddk2.txt b/modularTasks/testing/dotsReproducibilityTest/ddk2.txt
new file mode 100644
index 0000000..5ed4864
--- /dev/null
+++ b/modularTasks/testing/dotsReproducibilityTest/ddk2.txt
@@ -0,0 +1,45 @@
+ddk2 = readtable('/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/2019_12_19_09_57/completed4AFCtrials_task100_date_2019_12_19_09_57.csv');
+{Error using readtable (line 143)
+Unable to open file
+'/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/2019_12_19_09_57/completed4AFCtrials_task100_date_2019_12_19_09_57.csv'.}
+ddk2 = readtable('/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/2019_12_19_09_57/completed4AFCtrials_task100_date_2019_12_19_09_57.csv');
+ddk = readtable('/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/2019_12_18_14_00/completed4AFCtrials_task100_date_2019_12_18_14_00.csv');
+ddk = ddk(1:10,:); ddk2 = ddk2(1:10,:);
+ddk
+ddk =
+ taskID trialIndex trialStart trialEnd RT cpRT dirChoice cpChoice dirCorrect cpCorrect direction coherence randSeedBase fixationOn fixationStart targetOn dotsOn finalCPTime dotsOff choiceTime cpChoiceTime blankScreen feedbackOn subject date probCP cpScreenOn dummyBlank cpTimeDotsClock firstDraw lastDraw firstDrawPostCP numberDrawPreCP numberDrawPostCP reversal duration finalDuration
+ ______ __________ __________ __________ _______ _______ _________ ________ __________ _________ _________ _________ ____________ __________ _____________ ________ _______ ___________ _______ __________ ____________ ___________ __________ _______ __________ ______ __________ __________ _______________ __________ __________ _______________ _______________ ________________ ________ ________ _____________
+ 100 1 3.0322e+06 3.0322e+06 0.43945 0.968 1 1 1 0 0 0 1 0.071271 NaN 1.0204 1.2069 NaN 1.3256 1.7651 2.7331 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7833 2.7494 NaN 7.3778e+05 7.3778e+05 NaN 7 0 0 0.1 NaN
+ 100 2 3.0322e+06 3.0322e+06 0.28089 0.79999 1 1 1 1 0 14 2 0.072815 NaN 0.63214 0.86943 0.23729 1.1406 1.4215 2.2215 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4287 2.2254 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 2 0.2 0.25 NaN
+ 100 3 3.0322e+06 3.0322e+06 0.14804 0.824 1 1 1 0 0 14 3 0.066609 NaN 0.49034 0.82932 NaN 1.0497 1.1977 2.0217 3.0322e+06 NaN 99 2.0191e+11 0.3 1.2022 2.0327 NaN 7.3778e+05 7.3778e+05 NaN 13 0 0 0.2 NaN
+ 100 4 3.0322e+06 3.0322e+06 0.17857 0.632 1 1 0 1 180 14 4 0.047647 NaN 1.0646 1.3697 0.23729 1.6239 1.8025 2.4345 3.0322e+06 NaN 99 2.0191e+11 0.3 1.8104 2.4375 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 15 1 0.2 0.25 NaN
+ 100 5 3.0322e+06 3.0322e+06 0.19255 0.784 1 1 0 1 180 14 5 0.032352 NaN 0.45608 0.82896 0.23729 1.2527 1.4452 2.2292 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4561 2.2357 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 6 3.0322e+06 3.0322e+06 0.17039 0.896 1 1 1 1 0 14 6 0.041483 NaN 0.44826 1.1601 0.23886 1.5685 1.7389 2.6349 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7549 2.6532 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 7 3.0322e+06 3.0322e+06 0.26472 0.84 1 1 0 1 180 14 7 0.03441 NaN 0.35644 0.81407 0.23729 1.1361 1.4008 2.2408 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4073 2.2547 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 8 3.0322e+06 3.0322e+06 0.18809 0.912 1 1 0 0 180 0 8 0.042727 NaN 0.41561 0.70374 NaN 0.95895 1.147 2.059 3.0322e+06 NaN 99 2.0191e+11 0.3 1.1623 2.0776 NaN 7.3778e+05 7.3778e+05 NaN 16 0 0 0.25 NaN
+ 100 9 3.0322e+06 3.0322e+06 0.42278 1.176 1 1 1 1 0 14 9 0.044909 NaN 0.45169 0.75663 0.23384 1.0754 1.4982 2.6742 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5161 2.6856 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 10 3.0322e+06 3.0322e+06 0.27053 0.84799 1 1 0 0 180 0 10 0.040582 NaN 0.6338 0.88804 NaN 1.2946 1.5651 2.4131 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5827 2.4301 NaN 7.3778e+05 7.3778e+05 NaN 25 0 0 0.4 NaN
+ddk2
+ddk2 =
+ taskID trialIndex trialStart trialEnd RT cpRT dirChoice cpChoice dirCorrect cpCorrect direction coherence randSeedBase fixationOn fixationStart targetOn dotsOn finalCPTime dotsOff choiceTime cpChoiceTime blankScreen feedbackOn subject date probCP cpScreenOn dummyBlank cpTimeDotsClock firstDraw lastDraw firstDrawPostCP numberDrawPreCP numberDrawPostCP reversal duration finalDuration
+ ______ __________ __________ _________ _______ _______ _________ ________ __________ _________ _________ _________ ____________ __________ _____________ ________ _______ ___________ _______ __________ ____________ ___________ __________ _______ __________ ______ __________ __________ _______________ __________ __________ _______________ _______________ ________________ ________ ________ _____________
+ 100 1 3.104e+06 3.104e+06 0.41953 0.44798 1 1 1 0 0 0 1 0.071788 NaN 0.71586 1.004 NaN 1.1057 1.5252 1.9732 3.104e+06 NaN 99 2.0191e+11 0.3 1.5294 1.987 NaN 7.3778e+05 7.3778e+05 NaN 7 0 0 0.1 NaN
+ 100 2 3.104e+06 3.104e+06 0.49188 0.40802 1 1 1 1 0 14 2 0.072776 NaN 0.4965 0.86939 0.23775 1.141 1.6329 2.0409 3.104e+06 NaN 99 2.0191e+11 0.3 1.6495 2.0563 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 2 0.2 0.25 NaN
+ 100 3 3.104e+06 3.104e+06 0.36819 0.48 1 1 1 0 0 14 3 0.067797 NaN 0.45763 0.67797 NaN 0.89831 1.2665 1.7465 3.104e+06 NaN 99 2.0191e+11 0.3 1.2712 1.7627 NaN 7.3778e+05 7.3778e+05 NaN 13 0 0 0.2 NaN
+ 100 4 3.104e+06 3.104e+06 0.34208 0.46399 1 1 0 1 180 14 4 0.038515 NaN 0.83513 0.98767 0.23595 1.2406 1.5826 2.0466 3.104e+06 NaN 99 2.0191e+11 0.3 1.5965 2.0541 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 16 1 0.2 0.25 NaN
+ 100 5 3.104e+06 3.104e+06 0.32099 0.47199 1 1 0 1 180 14 5 0.036103 NaN 0.52763 0.78187 0.23729 1.2053 1.5263 1.9983 3.104e+06 NaN 99 2.0191e+11 0.3 1.5443 2.0019 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 12 0.2 0.4 NaN
+ 100 6 3.104e+06 3.104e+06 0.36077 0.56 1 1 1 1 0 14 6 0.041204 NaN 0.53273 0.97341 0.23866 1.3816 1.7423 2.3023 3.104e+06 NaN 99 2.0191e+11 0.3 1.7544 2.3138 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 16 11 0.2 0.4 NaN
+ 100 7 3.104e+06 3.104e+06 0.32873 0.632 1 1 0 1 180 14 7 0.041409 NaN 0.87192 1.5838 0.234 1.9014 2.2301 2.8621 3.104e+06 NaN 99 2.0191e+11 0.3 2.2404 2.8675 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 6 0.2 0.3 NaN
+ 100 8 3.104e+06 3.104e+06 0.45673 0.536 1 1 0 0 180 0 8 0.039383 NaN 1.3784 1.5648 NaN 1.819 2.2758 2.8118 3.104e+06 NaN 99 2.0191e+11 0.3 2.2936 2.819 NaN 7.3778e+05 7.3778e+05 NaN 17 0 0 0.25 NaN
+ 100 9 3.104e+06 3.104e+06 0.43882 0.488 1 1 1 1 0 14 9 0.035016 NaN 0.76383 1.4926 0.23729 1.7977 2.2366 2.7245 3.104e+06 NaN 99 2.0191e+11 0.3 2.2554 2.7299 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 16 4 0.2 0.3 NaN
+ 100 10 3.104e+06 3.104e+06 0.65402 0.60801 1 1 0 0 180 0 10 0.031661 NaN 0.77742 1.0147 NaN 1.4211 2.0751 2.6831 3.104e+06 NaN 99 2.0191e+11 0.3 2.0821 2.6923 NaN 7.3778e+05 7.3778e+05 NaN 26 0 0 0.4 NaN
+plot(ddk.trialIndex, ddk.numberDrawPreCP, 'bo', 'MarkerSize', 15)
+hold on
+plot(ddk2.trialIndex, ddk2.numberDrawPreCP, 'r*', 'MarkerSize', 15)
+plot(ddk2.trialIndex, ddk2.numberDrawPostCP, 'r^', 'MarkerSize', 15)
+plot(ddk.trialIndex, ddk.numberDrawPostCP, 'b.', 'MarkerSize', 23)
+legend({'epoch1 ddk', 'epoch1 ddk2', 'epoch2 ddk2', 'epoch2 ddk'})
+title('frame count with dDDK vs dDDK2')
+ylabel('calls to draw()')
+xlabel('trialIndex')
+diary off
diff --git a/modularTasks/testing/dotsReproducibilityTest/ddk_vs_ddkd.txt b/modularTasks/testing/dotsReproducibilityTest/ddk_vs_ddkd.txt
new file mode 100644
index 0000000..7ff879d
--- /dev/null
+++ b/modularTasks/testing/dotsReproducibilityTest/ddk_vs_ddkd.txt
@@ -0,0 +1,46 @@
+ddk = readtable('/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/2019_12_18_14_00/completed4AFCtrials_task100_date_2019_12_18_14_00.csv');
+ddkd = readtable('/Users/joshuagold/Documents/MATLAB/projects/Lab_Matlab_Control_Adrian_Fork/modularTasks/tasks/AdrianTests/trials_post_expt/2019_12_18_17_06/completed4AFCtrials_task100_date_2019_12_18_17_06.csv');
+ddk = ddk(1:10,:); ddkd = ddkd(1:10,:);
+epoch1_ddk = (ddk.cpTimeDotsClock - ddk.firstDraw)*24*3600;
+epoch1_ddkd = (ddkd.cpTimeDotsClock - ddkd.firstDraw)*24*3600;
+epoch1_ddkd - epoch1_ddk
+ans =
+ NaN
+ -0.0030
+ NaN
+ -0.0016
+ 0.0060
+ 0.0132
+ 0.0015
+ NaN
+ 0.0074
+ NaN
+(epoch1_ddkd - epoch1_ddk)*1000
+ans =
+ NaN
+ -3.0175
+ NaN
+ -1.6294
+ 5.9545
+ 13.2166
+ 1.4685
+ NaN
+ 7.4230
+ NaN
+plot(ddk.trialIndex, ddk.numberDrawPreCP, 'bo', 'MarkerSize', 15)
+hold on
+plot(ddkd.trialIndex, ddkd.numberDrawPreCP, 'r*', 'MarkerSize', 15)
+legend({'ddk', 'ddkd'})
+plot(ddkd.trialIndex, ddkd.numberDrawPostCP, 'r^', 'MarkerSize', 15)
+plot(ddk.trialIndex, ddk.numberDrawPostCP, 'b.', 'MarkerSize', 23)
+legend({'epoch1 ddk', 'epoch1 ddkd', 'epoch2 ddkd', 'epoch2 ddk'})
+title('frame count with dDDK vs dDDKDebug')
+ylabel('calls to draw()')
+xlabel('trialIndex')
+hold off
+hold on
+stairs(1:10, ddk.numberDrawPreCP + ddk.numberDrawPostCP, 'r')
+stairs(1:10, ddkd.numberDrawPreCP + ddkd.numberDrawPostCP, 'b')
+stairs(1:10, ddk.numberDrawPreCP + ddk.numberDrawPostCP, 'b')
+stairs(1:10, ddkd.numberDrawPreCP + ddkd.numberDrawPostCP, 'r')
+diary off
diff --git a/modularTasks/testing/dotsReproducibilityTest/frameRateSecondEpoch.txt b/modularTasks/testing/dotsReproducibilityTest/frameRateSecondEpoch.txt
new file mode 100644
index 0000000..df88868
--- /dev/null
+++ b/modularTasks/testing/dotsReproducibilityTest/frameRateSecondEpoch.txt
@@ -0,0 +1,23 @@
+frameRateSecondEpoch = t.numberDrawPostCP ./ ((t.lastDraw - t.firstDrawPostCP)*24*3600 + mean(frameDurations, 'omitnan'));
+plot(t.trialIndex, frameRateSecondEpoch, 'ob', 'MarkerSize', 15)
+hold on
+plot(t.trialIndex, frameRate, '*r', 'MarkerSize', 15)
+ylim([59,64])
+legend({'second epoch', 'first epoch'})
+frameRateNoCP = t.numberDrawPreCP ./ ((t.lastDraw - t.firstDrawPostCP)*24*3600 + mean(frameDurations, 'omitnan'));
+plot([1,3,8,10], frameRateNoCP([1,3,8,10]), 'k.', 'MarkerSize',20)
+frameRateNoCP = t.numberDrawPreCP ./ ((t.lastDraw - t.firstDraw)*24*3600 + mean(frameDurations, 'omitnan'));
+plot([1,3,8,10], frameRateNoCP([1,3,8,10]), 'k.', 'MarkerSize',20)
+ylim([58,65])
+ylim([59,65])
+legend({'second epoch', 'first epoch', 'noCP'})
+7/.091
+ans =
+ 76.9231
+7/.118
+ans =
+ 59.3220
+.091 + 0.0162
+ans =
+ 0.1072
+diary off
diff --git a/modularTasks/testing/dotsReproducibilityTest/framerate.txt b/modularTasks/testing/dotsReproducibilityTest/framerate.txt
new file mode 100644
index 0000000..6210a13
--- /dev/null
+++ b/modularTasks/testing/dotsReproducibilityTest/framerate.txt
@@ -0,0 +1,24 @@
+t
+t =
+ taskID trialIndex trialStart trialEnd RT cpRT dirChoice cpChoice dirCorrect cpCorrect direction coherence randSeedBase fixationOn fixationStart targetOn dotsOn finalCPTime dotsOff choiceTime cpChoiceTime blankScreen feedbackOn subject date probCP cpScreenOn dummyBlank cpTimeDotsClock firstDraw lastDraw firstDrawPostCP numberDrawPreCP numberDrawPostCP reversal duration finalDuration
+ ______ __________ __________ __________ _______ _______ _________ ________ __________ _________ _________ _________ ____________ __________ _____________ ________ _______ ___________ _______ __________ ____________ ___________ __________ _______ __________ ______ __________ __________ _______________ __________ __________ _______________ _______________ ________________ ________ ________ _____________
+ 100 1 3.0322e+06 3.0322e+06 0.43945 0.968 1 1 1 0 0 0 1 0.071271 NaN 1.0204 1.2069 NaN 1.3256 1.7651 2.7331 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7833 2.7494 NaN 7.3778e+05 7.3778e+05 NaN 7 0 0 0.1 NaN
+ 100 2 3.0322e+06 3.0322e+06 0.28089 0.79999 1 1 1 1 0 14 2 0.072815 NaN 0.63214 0.86943 0.23729 1.1406 1.4215 2.2215 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4287 2.2254 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 2 0.2 0.25 NaN
+ 100 3 3.0322e+06 3.0322e+06 0.14804 0.824 1 1 1 0 0 14 3 0.066609 NaN 0.49034 0.82932 NaN 1.0497 1.1977 2.0217 3.0322e+06 NaN 99 2.0191e+11 0.3 1.2022 2.0327 NaN 7.3778e+05 7.3778e+05 NaN 13 0 0 0.2 NaN
+ 100 4 3.0322e+06 3.0322e+06 0.17857 0.632 1 1 0 1 180 14 4 0.047647 NaN 1.0646 1.3697 0.23729 1.6239 1.8025 2.4345 3.0322e+06 NaN 99 2.0191e+11 0.3 1.8104 2.4375 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 15 1 0.2 0.25 NaN
+ 100 5 3.0322e+06 3.0322e+06 0.19255 0.784 1 1 0 1 180 14 5 0.032352 NaN 0.45608 0.82896 0.23729 1.2527 1.4452 2.2292 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4561 2.2357 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 6 3.0322e+06 3.0322e+06 0.17039 0.896 1 1 1 1 0 14 6 0.041483 NaN 0.44826 1.1601 0.23886 1.5685 1.7389 2.6349 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7549 2.6532 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 7 3.0322e+06 3.0322e+06 0.26472 0.84 1 1 0 1 180 14 7 0.03441 NaN 0.35644 0.81407 0.23729 1.1361 1.4008 2.2408 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4073 2.2547 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 8 3.0322e+06 3.0322e+06 0.18809 0.912 1 1 0 0 180 0 8 0.042727 NaN 0.41561 0.70374 NaN 0.95895 1.147 2.059 3.0322e+06 NaN 99 2.0191e+11 0.3 1.1623 2.0776 NaN 7.3778e+05 7.3778e+05 NaN 16 0 0 0.25 NaN
+ 100 9 3.0322e+06 3.0322e+06 0.42278 1.176 1 1 1 1 0 14 9 0.044909 NaN 0.45169 0.75663 0.23384 1.0754 1.4982 2.6742 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5161 2.6856 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 10 3.0322e+06 3.0322e+06 0.27053 0.84799 1 1 0 0 180 0 10 0.040582 NaN 0.6338 0.88804 NaN 1.2946 1.5651 2.4131 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5827 2.4301 NaN 7.3778e+05 7.3778e+05 NaN 25 0 0 0.4 NaN
+firstEpoch = (t.firstDrawPostCP - t.firstDraw)*24*3600;
+frameRate = t.numberDrawPreCP ./ firstEpoch;
+plot(t.trialIndex, frameRate)
+plot(t.trialIndex, frameRate, '*r', 'MarkerSize', 15)
+ylim([59,64])
+ylabel('frame rate (Hz)')
+xlabel('trialIndex')
+title('true frame rate')
+title('true frame rate on 1st Epoch')
+diary off
diff --git a/modularTasks/testing/dotsReproducibilityTest/trialduration.txt b/modularTasks/testing/dotsReproducibilityTest/trialduration.txt
new file mode 100644
index 0000000..ccae5f0
--- /dev/null
+++ b/modularTasks/testing/dotsReproducibilityTest/trialduration.txt
@@ -0,0 +1,62 @@
+t
+t =
+ taskID trialIndex trialStart trialEnd RT cpRT dirChoice cpChoice dirCorrect cpCorrect direction coherence randSeedBase fixationOn fixationStart targetOn dotsOn finalCPTime dotsOff choiceTime cpChoiceTime blankScreen feedbackOn subject date probCP cpScreenOn dummyBlank cpTimeDotsClock firstDraw lastDraw firstDrawPostCP numberDrawPreCP numberDrawPostCP reversal duration finalDuration
+ ______ __________ __________ __________ _______ _______ _________ ________ __________ _________ _________ _________ ____________ __________ _____________ ________ _______ ___________ _______ __________ ____________ ___________ __________ _______ __________ ______ __________ __________ _______________ __________ __________ _______________ _______________ ________________ ________ ________ _____________
+ 100 1 3.0322e+06 3.0322e+06 0.43945 0.968 1 1 1 0 0 0 1 0.071271 NaN 1.0204 1.2069 NaN 1.3256 1.7651 2.7331 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7833 2.7494 NaN 7.3778e+05 7.3778e+05 NaN 7 0 0 0.1 NaN
+ 100 2 3.0322e+06 3.0322e+06 0.28089 0.79999 1 1 1 1 0 14 2 0.072815 NaN 0.63214 0.86943 0.23729 1.1406 1.4215 2.2215 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4287 2.2254 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 2 0.2 0.25 NaN
+ 100 3 3.0322e+06 3.0322e+06 0.14804 0.824 1 1 1 0 0 14 3 0.066609 NaN 0.49034 0.82932 NaN 1.0497 1.1977 2.0217 3.0322e+06 NaN 99 2.0191e+11 0.3 1.2022 2.0327 NaN 7.3778e+05 7.3778e+05 NaN 13 0 0 0.2 NaN
+ 100 4 3.0322e+06 3.0322e+06 0.17857 0.632 1 1 0 1 180 14 4 0.047647 NaN 1.0646 1.3697 0.23729 1.6239 1.8025 2.4345 3.0322e+06 NaN 99 2.0191e+11 0.3 1.8104 2.4375 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 15 1 0.2 0.25 NaN
+ 100 5 3.0322e+06 3.0322e+06 0.19255 0.784 1 1 0 1 180 14 5 0.032352 NaN 0.45608 0.82896 0.23729 1.2527 1.4452 2.2292 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4561 2.2357 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 6 3.0322e+06 3.0322e+06 0.17039 0.896 1 1 1 1 0 14 6 0.041483 NaN 0.44826 1.1601 0.23886 1.5685 1.7389 2.6349 3.0322e+06 NaN 99 2.0191e+11 0.3 1.7549 2.6532 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 11 0.2 0.4 NaN
+ 100 7 3.0322e+06 3.0322e+06 0.26472 0.84 1 1 0 1 180 14 7 0.03441 NaN 0.35644 0.81407 0.23729 1.1361 1.4008 2.2408 3.0322e+06 NaN 99 2.0191e+11 0.3 1.4073 2.2547 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 8 3.0322e+06 3.0322e+06 0.18809 0.912 1 1 0 0 180 0 8 0.042727 NaN 0.41561 0.70374 NaN 0.95895 1.147 2.059 3.0322e+06 NaN 99 2.0191e+11 0.3 1.1623 2.0776 NaN 7.3778e+05 7.3778e+05 NaN 16 0 0 0.25 NaN
+ 100 9 3.0322e+06 3.0322e+06 0.42278 1.176 1 1 1 1 0 14 9 0.044909 NaN 0.45169 0.75663 0.23384 1.0754 1.4982 2.6742 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5161 2.6856 7.3778e+05 7.3778e+05 7.3778e+05 7.3778e+05 14 5 0.2 0.3 NaN
+ 100 10 3.0322e+06 3.0322e+06 0.27053 0.84799 1 1 0 0 180 0 10 0.040582 NaN 0.6338 0.88804 NaN 1.2946 1.5651 2.4131 3.0322e+06 NaN 99 2.0191e+11 0.3 1.5827 2.4301 NaN 7.3778e+05 7.3778e+05 NaN 25 0 0 0.4 NaN
+durationFIRA = t.dotsOff - t.dotsOn;
+durationDots = (t.lastDraw - t.firstDraw)*24*3600;
+hold off
+plot(t.trialIndex, durationFIRA, 'ob', 'MarkerSize', 15)
+hold on
+plot(t.trialIndex, durationDots, '*r', 'MarkerSize', 15)
+legend({'dotsOff-dotsOn', 'lastDraw - firstDraw'})
+title('measures of trial duration')
+ylabel('duration (s)')
+xlabel('trialIndex')
+durationFIRA - durationDots
+ans =
+ 0.0268
+ 0.0199
+ 0.0246
+ 0.0170
+ 0.0270
+ 0.0187
+ 0.0247
+ 0.0185
+ 0.0291
+ 0.0176
+frameDurations = 1 ./ frameRate
+frameDurations =
+ NaN
+ 0.0167
+ NaN
+ 0.0158
+ 0.0166
+ 0.0159
+ 0.0165
+ NaN
+ 0.0159
+ NaN
+2 ./ frameRate
+ans =
+ NaN
+ 0.0334
+ NaN
+ 0.0316
+ 0.0332
+ 0.0318
+ 0.0330
+ NaN
+ 0.0319
+ NaN
+hold off
+diary off
diff --git a/snow-dots/classes/drawable/dotsDrawableDotKinetogram.m b/snow-dots/classes/drawable/dotsDrawableDotKinetogram.m
index 99fb5a4..1d77620 100755
--- a/snow-dots/classes/drawable/dotsDrawableDotKinetogram.m
+++ b/snow-dots/classes/drawable/dotsDrawableDotKinetogram.m
@@ -21,7 +21,7 @@
coherenceSTD = 0;
% if flip when random coherence < 0
- flipDir = false;
+ flipDir = true;
% density of dots in the kinetogram (dots per degree-visual-angle^2
% per second)
@@ -79,6 +79,27 @@
% and direction (assuming all other properties are constant).
% Seed is computed as randBase+coherence+100*direction;
randBase = sum(clock*10);
+
+ % timestamp for CP time
+ cpTimeDotsClock = nan;
+
+ % timestamp of first call to draw
+ firstDraw = nan;
+
+ % timestamp of first call to draw after direction has been swapped
+ firstDrawPostCP = nan;
+
+ % timestamp of last call to draw
+ lastDraw = nan;
+
+ % number of calls to draw before CP
+ numberDrawPreCP = 0;
+
+ % number of calls to draw after CP
+ numberDrawPostCP = 0;
+
+ % bool: whether CP has been passed or not
+ passedCP = false;
end
properties (SetAccess = protected)
@@ -132,7 +153,7 @@
% Compute some parameters and create a circular aperture texture.
function prepareToDrawInWindow(self)
- disp('HERE')
+ %disp('HERE')
% Get the frame rate -- rounding to nearest 10 to avoid
% problems with keeping track of random positions when there
% are slight differences in frame rate
@@ -147,7 +168,7 @@ function prepareToDrawInWindow(self)
else
% use the given seed
self.thisRandStream = RandStream('mt19937ar', ...
- 'Seed', abs(round(self.randBase + self.coherence + 100*self.direction(1) + 50000)));
+ 'Seed', abs(round(self.randBase)));
end
% gross accounting for the underlying dot field
@@ -210,7 +231,8 @@ function computeNextFrame(self)
if self.coherenceSTD==0
cohCoinToss = 100*self.thisRandStream.rand(1, nFrameDots) < self.coherence;
else
- coh = normrnd(self.coherence, self.coherenceSTD);
+% coh = normrnd(self.coherence, self.coherenceSTD);
+ coh = self.coherence + self.coherenceSTD .* self.thisRandStream.randn();
if coh < 0
if self.flipDir
degreeOffset = 180;
@@ -318,6 +340,27 @@ function draw(self)
self.computeNextFrame;
mglStencilSelect(self.stencilNumber);
self.draw@dotsDrawableVertices;
+
+ % the whole if block below stores timestamps used to reproduce
+ % dots later
+ if self.passedCP
+ if isnan(self.firstDrawPostCP)
+ self.firstDrawPostCP = now;
+ self.lastDraw = self.firstDrawPostCP;
+ else
+ self.lastDraw = now;
+ end
+ self.numberDrawPostCP = self.numberDrawPostCP + 1;
+ else
+ if isnan(self.firstDraw)
+ self.firstDraw = now;
+ self.lastDraw = self.firstDraw;
+ else
+ self.lastDraw = now;
+ end
+ self.numberDrawPreCP = self.numberDrawPreCP + 1;
+ end
+
mglStencilSelect(0);
end
end
diff --git a/snow-dots/classes/drawable/dotsDrawableDotKinetogramDebug.m b/snow-dots/classes/drawable/dotsDrawableDotKinetogramDebug.m
index 6f4e5c7..dd1c3b7 100644
--- a/snow-dots/classes/drawable/dotsDrawableDotKinetogramDebug.m
+++ b/snow-dots/classes/drawable/dotsDrawableDotKinetogramDebug.m
@@ -21,7 +21,7 @@
coherenceSTD = 0;
% if flip when random coherence < 0
- flipDir = false;
+ flipDir = true;
% density of dots in the kinetogram (dots per degree-visual-angle^2
% per second)
@@ -80,6 +80,27 @@
% Seed is computed as randBase+coherence+100*direction;
randBase = sum(clock*10);
+ % timestamp for CP time
+ cpTimeDotsClock = nan;
+
+ % timestamp of first call to draw
+ firstDraw = nan;
+
+ % timestamp of first call to draw after direction has been swapped
+ firstDrawPostCP = nan;
+
+ % timestamp of last call to draw
+ lastDraw = nan;
+
+ % number of calls to draw before CP
+ numberDrawPreCP = 0;
+
+ % number of calls to draw after CP
+ numberDrawPostCP = 0;
+
+ % bool: whether CP has been passed or not
+ passedCP = false;
+
% dot positions, active and coherence states, all gathered in a
% single x-by-y-by-z 3D-matrix.
%
@@ -99,8 +120,13 @@
dotsPositions = [];
% Flag controlling whether to record dots positions or not
- % Note, this doesn't record any time stamp.
+ % Note, this doesn't record any time stamp.
recordDotsPositions = false;
+
+ reversal = 0; % theoretical CP time
+ duration = 0; % theoretical duration of stimulus (sec)
+ finalDuration = 0; % precise duration of last epoch
+ finalCPTime = 0; % real flip time
end
properties (SetAccess = protected)
@@ -143,17 +169,31 @@
end
methods
- % Constructor takes no arguments.
- function self = dotsDrawableDotKinetogramDebug()
+ function self = dotsDrawableDotKinetogramDebug(dots_params)
self = self@dotsDrawableVertices();
-
+ fields = fieldnames(dots_params);
+ num_fields = length(fields);
+ %disp('====== constructor dotsDrawableDotKinetogramDebug')
+ for ix = 1:num_fields
+ f = fields{ix};
+ if strcmp(f, 'randSeedBase')
+ newf = 'randBase';
+ else
+ newf = f;
+ end
+
+ %disp(['setting property ', newf])
+
+ self.(newf) = dots_params.(f);
+ end
+ %disp('----- done')
% draw as points
self.primitive = 0;
end
% Compute some parameters and create a circular aperture texture.
function prepareToDrawInWindow(self)
- disp('ENTERING prepareToDrawInWindow ')
+ %disp('ENTERING prepareToDrawInWindow ')
% Get the frame rate -- rounding to nearest 10 to avoid
% problems with keeping track of random positions when there
% are slight differences in frame rate
@@ -165,11 +205,11 @@ function prepareToDrawInWindow(self)
% no seed given, use the clock
self.thisRandStream = RandStream('mt19937ar', ...
'Seed', round(sum(clock*10)));
- disp(' somehow self.randBase is NaN')
+ %disp(' somehow self.randBase is NaN')
else
% use the given seed
- initseed=abs(round(self.randBase + self.coherence + 100*self.direction(1) + 50000));
- fprintf(' initial seed line171: %d\n', initseed)
+ initseed=abs(round(self.randBase));
+ %fprintf(' initial seed line171: %d\n', initseed)
self.thisRandStream = RandStream('mt19937ar', ...
'Seed', initseed);
end
@@ -210,7 +250,79 @@ function prepareToDrawInWindow(self)
% pick random start positions for all dots
self.normalizedXY = self.thisRandStream.rand(2, self.nDots);
% fprintf(' start positions: %0.6f\n', self.normalizedXY)
- fprintf(' position %d: %0.6f\n', length(self.normalizedXY), self.normalizedXY(end))
+ %fprintf(' position %d: %0.6f\n', length(self.normalizedXY), self.normalizedXY(end))
+
+ % Re-set the frame number to 0
+ self.frameNumber = 0;
+
+ % pre-allocate size of first 2 dimensions of dotsPositions
+ % the third dimension is unknown (I believe)
+ if self.recordDotsPositions
+ self.dotsPositions = zeros(4,self.nDots,0);
+ end
+ end
+
+
+ % Compute some parameters and create a circular aperture texture.
+ function prepare_to_virtually_draw(self, frameRate)
+ %disp('ENTERING prepare_to_virtually_draw')
+ % Get the frame rate -- rounding to nearest 10 to avoid
+ % problems with keeping track of random positions when there
+ % are slight differences in frame rate
+
+ %frameRate = 10*round(screen.windowFrameRate/10);
+
+ % Check for random number seed
+ if isnan(self.randBase)
+ % no seed given, use the clock
+ self.thisRandStream = RandStream('mt19937ar', ...
+ 'Seed', round(sum(clock*10)));
+ %disp(' somehow self.randBase is NaN')
+ else
+ % use the given seed
+ initseed=abs(round(self.randBase + self.coherence + 100*self.direction(1) + 50000));
+ %fprintf(' initial seed line171: %d\n', initseed)
+ self.thisRandStream = RandStream('mt19937ar', ...
+ 'Seed', initseed);
+ end
+
+ % gross accounting for the underlying dot field
+ self.fieldWidth = self.diameter*self.fieldScale;
+ self.nDots = ceil(self.density * self.fieldWidth^2 / frameRate);
+ self.frameSelector = false(1, self.nDots);
+ self.dotLifetimes = zeros(1, self.nDots);
+
+ % treat speed as step-per-interleaved-frame
+ self.deltaR = self.speed / self.fieldWidth ...
+ * (self.interleaving / frameRate);
+
+ % draw into an OpenGL stencil to make the circular aperture
+% mglStencilCreateBegin(self.stencilNumber);
+ sizeStencil = self.diameter*[1 1];
+% mglFillOval(self.xCenter, self.yCenter, sizeStencil);
+% mglStencilCreateEnd();
+% mglClearScreen();
+
+ % build a lookup table to pick weighted directions
+ % based on a uniform random variable.
+ if ~isequal( ...
+ numel(self.directionWeights), numel(self.direction))
+ self.directionWeights = ones(1, length(self.direction));
+ end
+
+ directionCDF = cumsum(self.directionWeights) ...
+ / sum(self.directionWeights);
+ self.directionCDFInverse = ones(1, self.directionCDFSize);
+ probs = linspace(0, 1, self.directionCDFSize);
+ for ii = 1:self.directionCDFSize
+ nearest = find(directionCDF >= probs(ii), 1, 'first');
+ self.directionCDFInverse(ii) = self.direction(nearest);
+ end
+
+ % pick random start positions for all dots
+ self.normalizedXY = self.thisRandStream.rand(2, self.nDots);
+ % fprintf(' start positions: %0.6f\n', self.normalizedXY)
+ %fprintf(' position %d: %0.6f\n', length(self.normalizedXY), self.normalizedXY(end))
% Re-set the frame number to 0
self.frameNumber = 0;
@@ -354,7 +466,7 @@ function computeNextFrame(self)
self.x = (XY(1, thisFrame)-0.5)*self.fieldWidth + self.xCenter;
self.y = (XY(2, thisFrame)-0.5)*self.fieldWidth + self.yCenter;
- disp([self.x(end) self.y(end)])
+ %disp([self.x(end) self.y(end)])
% fill out dotsPositions
if self.recordDotsPositions
self.dotsPositions(:,:,end+1) = [...
@@ -370,6 +482,27 @@ function draw(self)
self.computeNextFrame;
mglStencilSelect(self.stencilNumber);
self.draw@dotsDrawableVertices;
+
+ % the whole if block below stores timestamps used to reproduce
+ % dots later
+ if self.passedCP
+ if isnan(self.firstDrawPostCP)
+ self.firstDrawPostCP = now;
+ self.lastDraw = self.firstDrawPostCP;
+ else
+ self.lastDraw = now;
+ end
+ self.numberDrawPostCP = self.numberDrawPostCP + 1;
+ else
+ if isnan(self.firstDraw)
+ self.firstDraw = now;
+ self.lastDraw = self.firstDraw;
+ else
+ self.lastDraw = now;
+ end
+ self.numberDrawPreCP = self.numberDrawPreCP + 1;
+ end
+
mglStencilSelect(0);
end
end
diff --git a/snow-dots/classes/drawable/sdotsDrawableDotKinetogramDebug.m b/snow-dots/classes/drawable/sdotsDrawableDotKinetogramDebug.m
new file mode 100644
index 0000000..8549e1d
--- /dev/null
+++ b/snow-dots/classes/drawable/sdotsDrawableDotKinetogramDebug.m
@@ -0,0 +1,4 @@
+function s=sdotsDrawableDotKinetogramDebug()
+ s=dotsDrawableDotKinetogramDebug(struct());
+end
+
diff --git a/snow-dots/classes/readable/dotsReadable.m b/snow-dots/classes/readable/dotsReadable.m
index 1688b1c..112aca6 100755
--- a/snow-dots/classes/readable/dotsReadable.m
+++ b/snow-dots/classes/readable/dotsReadable.m
@@ -784,7 +784,13 @@ function setEventsActiveFlag(self, activateList, deactivateList)
%> look up the event name for convenience
data = self.history(historyIndex, :);
ID = data(1);
+ if ID > length(self.eventDefinitions)
+ if strcmp(acceptedEvents, 'holdFixation')
+ ID = 3;
+ end
+ end
name = self.eventDefinitions(ID).name;
+
% check release flag
if self.eventDefinitions(ID).isRelease && ...