nodus-ponens
Advanced tools
Comparing version 1.2.3 to 1.2.4
@@ -25,3 +25,3 @@ // -------------------------------------------------------------------------------------------------- | ||
console.log(" Designed by Sangeet Khemlani") | ||
console.log(" Copyright (C) 2016 Naval Research Laboratory") | ||
console.log(" Copyright (C) 2017 Naval Research Laboratory") | ||
console.log(" Navy Center of Applied Research in Artificial Intelligence") | ||
@@ -28,0 +28,0 @@ console.log(" https://www.nrl.navy.mil/itd/aic/\n") |
{ | ||
"name": "nodus-ponens", | ||
"version": "1.2.3", | ||
"version": "1.2.4", | ||
"description": "A framework for running high-level reasoning and cognitive science experiments in Node.js.", | ||
@@ -5,0 +5,0 @@ "main": "index.js", |
# nodus-ponens | ||
A full-stack framework for running high-level reasoning and cognitive science experiments in node.js. | ||
A full-stack framework for running high-level reasoning and cognitive science experiments in Node.js. | ||
## Modifications | ||
* Fixed errors in documentation specification (caught by Z. Horne) | ||
* Created hanging indentation for radio- and choice-tasks | ||
@@ -62,2 +63,2 @@ * Fixed logging errors (caught by J. Korman) | ||
(c) 2016 Sangeet Khemlani [http://sangeet.khemlani.net/][skhemlani], Creative Commons License. | ||
(c) 2017 Sangeet Khemlani [http://sangeet.khemlani.net/][skhemlani], Creative Commons License. |
@@ -48,4 +48,4 @@ // -------------------------------------------------------------------------------------------------- | ||
{ | ||
var text = fs.readFileSync('./Design.csv').toString(); // read design into CSV string | ||
var design = CSVtoJSON(text, PID); // CSVtoJSON returns stimuli as JSON object | ||
var text = fs.readFileSync('./Design.csv').toString(); // read design into CSV string | ||
var design = CSVtoJSON(text, PID); // CSVtoJSON returns stimuli as JSON object | ||
var stimuli = assignContents(design); // assign contents to the different problems in the design | ||
@@ -57,7 +57,7 @@ return stimuli; // To randomize the order of the stimuli, return np.randomize(stimuli) | ||
{ // and adds some columns for R analyses | ||
var results = []; | ||
var lines = text.split(/\r\n|\r|\n/g); | ||
var header = true; | ||
var results = []; | ||
var lines = text.split(/\r\n|\r|\n/g); | ||
var header = true; | ||
var headerColumns = ["ParticipantID", "ClockTime", "TrialHeader"]; | ||
var trialColumn = ["P" + PID, new Date().toISOString(), "Trial"]; | ||
var trialColumn = ["P" + PID, new Date().toISOString(), "Trial"]; | ||
@@ -64,0 +64,0 @@ lines.forEach(function(line) { |
// -------------------------------------------------------------------------------------------------- | ||
// CogNode-jQ-API.js is called from "showStimuli.html" | ||
// nodusponens-jQ-API.js is called from "showStimuli.html" | ||
// -------------------------------------------------------------------------------------------------- | ||
@@ -12,3 +12,3 @@ // Contents | ||
var trialNumber = 0; // Keeps track of number of trials completed | ||
var trialNumber = 0; // Keeps track of number of trials completed | ||
var startTime; | ||
@@ -22,11 +22,18 @@ var endTime; | ||
$(document).ready(function() // Sets up slider and button functionality, calls server to | ||
{ // get initial stimulus. | ||
var handle = $("#slider-handle"); | ||
$("#slider").slider({value: 50, | ||
create: function() {handle.text( $( this ).slider( "value" ) + "%"); }, | ||
slide: function( event, ui ) { handle.text( ui.value + "%"); } | ||
}); | ||
$("input[type=submit], a, button").button().click(function( event ) { event.preventDefault(); }); | ||
callServer(false); // Calls server to get first stimulus as soon as the page loads; | ||
}); // argument false ensures that the backend JS won't log anything | ||
{ // get initial stimulus. | ||
var handle = $("#slider-handle"); | ||
$("#slider").slider({ | ||
value: 50, | ||
create: function() { | ||
handle.text($(this).slider("value") + "%"); | ||
}, | ||
slide: function(event, ui) { | ||
handle.text(ui.value + "%"); | ||
} | ||
}); | ||
$("input[type=submit], a, button").button().click(function(event) { | ||
event.preventDefault(); | ||
}); | ||
callServer(false); // Calls server to get first stimulus as soon as the page loads; | ||
}); // argument false ensures that the backend JS won't log anything | ||
@@ -39,24 +46,34 @@ // -------------------------------------------------------------------------------------------------- | ||
{ | ||
var latency = (endTime-startTime)/1000; // Calculates latency client-side | ||
if(latency < latencyMinimum) | ||
{ // Use jQuery to create a "modal dialog", built from "message" div | ||
$("#message").dialog({ modal: true, dialogClass: 'no-close success-dialog', | ||
buttons: { Okay: function() { $( this ).dialog( "close" ); }}}); | ||
} | ||
else | ||
{ | ||
trialNumber++; | ||
$('#problem-info').hide(); // Hide problem and show loading text | ||
$('#' + task).hide(); // Show task (specified in showStimuli.html) | ||
$('#fixation-cross').show(); // Show loading message | ||
var url = "./getNextStimulus"; // Add real info as queries if response = something... | ||
if(answer) { url += "?answer=" + answer + "&latency=" + latency | ||
+ "&clockTime=" + new Date().toISOString(); } | ||
else { url += "?dumpQuery=dumpThisInformation"; } //...but if not, send dummy info | ||
$.getJSON(url, function (data) { | ||
if(data.Data == "Done") { window.location = "terminateDebrief.html"; } | ||
else { displayProblem(data); } // displayProblem is defined in showStimuli.html | ||
}); | ||
} | ||
var latency = (endTime - startTime) / 1000; // Calculates latency client-side | ||
if (latency < latencyMinimum) { // Create a "modal dialog" in jQuery, built from "message" div | ||
$("#message").dialog({ | ||
modal: true, | ||
dialogClass: 'no-close success-dialog', | ||
buttons: { | ||
Okay: function() { | ||
$(this).dialog("close"); | ||
} | ||
} | ||
}); | ||
} else { | ||
trialNumber++; | ||
$('#problem-info').hide(); // Hide problem and show loading text | ||
$('#' + task).hide(); // Show task (specified in showStimuli.html) | ||
$('#fixation-cross').show(); // Show loading message | ||
var url = "./getNextStimulus"; // Add real info as queries if response = something... | ||
if (answer) { | ||
url += "?answer=" + answer + "&latency=" + latency + | ||
"&clockTime=" + new Date().toISOString(); | ||
} else { | ||
url += "?dumpQuery=dumpThisInformation"; | ||
} //...but if not, send dummy info | ||
$.getJSON(url, function(data) { | ||
if (data.Data == "Done") { | ||
window.location = "terminateDebrief.html"; | ||
} else { | ||
displayProblem(data); | ||
} // displayProblem is defined in showStimuli.html | ||
}); | ||
} | ||
} | ||
@@ -68,61 +85,56 @@ | ||
function showProblemInfo() | ||
{ | ||
$('#problem-info').fadeIn(fadeTime); | ||
$('#fixation-cross').hide(); | ||
function showProblemInfo(seconds) { | ||
setTimeout(function(){ $('#problem-info').fadeIn(fadeTime*1000); | ||
$('#fixation-cross').hide(); }, | ||
seconds*1000); | ||
} | ||
function showTask () | ||
{ | ||
$('#' + task).fadeIn(fadeTime); | ||
startTime = $.now(); | ||
function showTask(seconds) { | ||
setTimeout(function(){ $('#' + task).fadeIn(fadeTime*1000); | ||
startTime = $.now(); }, | ||
seconds*1000); | ||
} | ||
function resetTask(task) | ||
{ | ||
switch(task) | ||
{ | ||
case "YN-task": | ||
if(Math.random(1.0)>0.5) | ||
{ | ||
setAFC('#YN-option1', "Yes"); | ||
setAFC('#YN-option2', "No"); | ||
} | ||
else | ||
{ | ||
setAFC('#YN-option1', "No"); | ||
setAFC('#YN-option2', "Yes"); | ||
} | ||
break; | ||
case "2AFC-task": | ||
setAFC('#2AFC-option1', "option-1-reset"); | ||
setAFC('#2AFC-option2', "option-2-reset"); | ||
break; | ||
case "3AFC-task": | ||
setAFC('#3AFC-option1', "option-1-reset"); | ||
setAFC('#3AFC-option2', "option-2-reset"); | ||
setAFC('#3AFC-option3', "option-3-reset"); | ||
break; | ||
case "slider-task": | ||
setSlider(50); | ||
break; | ||
case "radio-task": | ||
$('input[name="radio-task-buttons"]').attr('checked', false); | ||
setRadio("#radio-1", "radio-value-1-reset"); | ||
setRadio("#radio-2", "radio-value-2-reset"); | ||
setRadio("#radio-3", "radio-value-3-reset"); | ||
break; | ||
case "checkbox-task": | ||
$('input[name="checkbox-task-buttons"]').attr('checked', false); | ||
setCheck("#checkbox-1", "check-value-1-reset"); | ||
setCheck("#checkbox-2", "check-value-2-reset"); | ||
setCheck("#checkbox-3", "check-value-3-reset"); | ||
break; | ||
case "freeresponse-task": | ||
setFreeResponse(""); | ||
break; | ||
case "sentencecompletion-task": | ||
setSentenceCompletion(""); | ||
break; | ||
} | ||
function resetTask(task) { | ||
switch (task) { | ||
case "YN-task": | ||
if (Math.random(1.0) > 0.5) { | ||
setAFC('#YN-option1', "Yes"); | ||
setAFC('#YN-option2', "No"); | ||
} else { | ||
setAFC('#YN-option1', "No"); | ||
setAFC('#YN-option2', "Yes"); | ||
} | ||
break; | ||
case "2AFC-task": | ||
setAFC('#2AFC-option1', "option-1-reset"); | ||
setAFC('#2AFC-option2', "option-2-reset"); | ||
break; | ||
case "3AFC-task": | ||
setAFC('#3AFC-option1', "option-1-reset"); | ||
setAFC('#3AFC-option2', "option-2-reset"); | ||
setAFC('#3AFC-option3', "option-3-reset"); | ||
break; | ||
case "slider-task": | ||
setSlider(50); | ||
break; | ||
case "radio-task": | ||
$('input[name="radio-task-buttons"]').attr('checked', false); | ||
setRadio("#radio-1", "radio-value-1-reset"); | ||
setRadio("#radio-2", "radio-value-2-reset"); | ||
setRadio("#radio-3", "radio-value-3-reset"); | ||
break; | ||
case "checkbox-task": | ||
$('input[name="checkbox-task-buttons"]').attr('checked', false); | ||
setCheck("#checkbox-1", "check-value-1-reset"); | ||
setCheck("#checkbox-2", "check-value-2-reset"); | ||
setCheck("#checkbox-3", "check-value-3-reset"); | ||
break; | ||
case "freeresponse-task": | ||
setFreeResponse(""); | ||
break; | ||
case "sentencecompletion-task": | ||
setSentenceCompletion(""); | ||
break; | ||
} | ||
} | ||
@@ -134,70 +146,58 @@ | ||
function respondAFC(option) | ||
{ | ||
endTime = $.now(); | ||
callServer($(option).val()); | ||
function respondAFC(option) { | ||
endTime = $.now(); | ||
callServer($(option).val()); | ||
} | ||
function setAFC(option, value) | ||
{ | ||
$(option).html(value); | ||
$(option).val(value); | ||
function setAFC(option, value) { | ||
$(option).html(value); | ||
$(option).val(value); | ||
} | ||
function respondSlider(option) | ||
{ | ||
endTime = $.now(); | ||
callServer($("#slider").slider("value")); | ||
function respondSlider(option) { | ||
endTime = $.now(); | ||
callServer($("#slider").slider("value")); | ||
} | ||
function setSlider(value) | ||
{ | ||
$("#slider").slider("value", value); | ||
$("#slider-handle").text(value + "%"); | ||
function setSlider(value) { | ||
$("#slider").slider("value", value); | ||
$("#slider-handle").text(value + "%"); | ||
} | ||
function respondRadio() | ||
{ | ||
endTime = $.now(); | ||
var selected = $("#radio-task input[type='radio']:checked"); | ||
callServer($("label[for='"+selected.attr("id")+"']").text()); | ||
function respondRadio() { | ||
endTime = $.now(); | ||
var selected = $("#radio-task input[type='radio']:checked"); | ||
callServer($("label[for='" + selected.attr("id") + "']").text()); | ||
} | ||
function setRadio(option, value) | ||
{ | ||
$("label[for='"+$(option).attr("id")+"']").text(value); | ||
function setRadio(option, value) { | ||
$("label[for='" + $(option).attr("id") + "']").text(value); | ||
} | ||
function respondCheck() | ||
{ | ||
endTime = $.now(); | ||
var selected = $("#checkbox-task input[type='radio']:checked"); | ||
callServer($("label[for='"+selected.attr("id")+"']").text()); | ||
function respondCheck() { | ||
endTime = $.now(); | ||
var selected = $("#checkbox-task input[type='radio']:checked"); | ||
callServer($("label[for='" + selected.attr("id") + "']").text()); | ||
} | ||
function setCheck(option, value) | ||
{ | ||
$("label[for='"+$(option).attr("id")+"']").text(value); | ||
function setCheck(option, value) { | ||
$("label[for='" + $(option).attr("id") + "']").text(value); | ||
} | ||
function respondFreeResponse() | ||
{ | ||
endTime = $.now(); | ||
callServer($("#freeresponse").val()); | ||
function respondFreeResponse() { | ||
endTime = $.now(); | ||
callServer($("#freeresponse").val()); | ||
} | ||
function setFreeResponse(value) | ||
{ | ||
$("#freeresponse").val(value); | ||
function setFreeResponse(value) { | ||
$("#freeresponse").val(value); | ||
} | ||
function respondSentenceCompletion() | ||
{ | ||
endTime = $.now(); | ||
callServer($("#completion").val()); | ||
function respondSentenceCompletion() { | ||
endTime = $.now(); | ||
callServer($("#completion").val()); | ||
} | ||
function setSentenceCompletion(value) | ||
{ | ||
$("#completion").val(value); | ||
function setSentenceCompletion(value) { | ||
$("#completion").val(value); | ||
} | ||
@@ -209,11 +209,13 @@ | ||
function randomize(array) | ||
{ | ||
var currentIndex = array.length, temporaryValue, randomIndex; | ||
while (0 !== currentIndex) { // While there remain elements to shuffle... | ||
randomIndex = Math.floor(Math.random() * currentIndex); // Pick a remaining element... | ||
currentIndex -= 1; temporaryValue = array[currentIndex];// ...and swap it with the current element. | ||
array[currentIndex] = array[randomIndex]; array[randomIndex] = temporaryValue; | ||
} | ||
return array; | ||
function randomize(array) { | ||
var currentIndex = array.length, | ||
temporaryValue, randomIndex; | ||
while (0 !== currentIndex) { // While there remain elements to shuffle... | ||
randomIndex = Math.floor(Math.random() * currentIndex); // Pick a remaining element... | ||
currentIndex -= 1; | ||
temporaryValue = array[currentIndex]; // ...and swap it with the current element. | ||
array[currentIndex] = array[randomIndex]; | ||
array[randomIndex] = temporaryValue; | ||
} | ||
return array; | ||
} |
Sorry, the diff of this file is not supported yet
828797
24201
63