Parcourir la source

Update of expe

Jérôme BUISINE il y a 4 ans
Parent
commit
170a981749
7 fichiers modifiés avec 74 ajouts et 28 suppressions
  1. 4 1
      .gitignore
  2. 9 1
      expe/config.py
  3. 1 6
      expe/quest/expe.py
  4. 3 0
      expe/templates/expe/expe.html
  5. 11 1
      expe/utils/functions.py
  6. 39 19
      expe/views.py
  7. 7 0
      static/js/keyEvents.js

+ 4 - 1
.gitignore

@@ -113,4 +113,7 @@ GitHub.sublime-settings
 !.vscode/tasks.json 
 !.vscode/launch.json 
 !.vscode/extensions.json 
-.history
+.history
+
+expe_results
+media

+ 9 - 1
expe/config.py

@@ -9,4 +9,12 @@ output_expe_folder          = "expes_results/{0}/"
 output_tmp_folder           = "tmp"
 
 # expes list
-expe_name_list              = ["quest_same_image"]
+expe_name_list              = ["quest_one_image"]
+
+# configure experiences labels
+expe_questions              = {
+    'quest_one_image':{
+        'question': "Do you see one image or a composition of more than one?",
+        'indication': "press left if you see one image, right if not"
+    }
+}

+ 1 - 6
expe/quest/expe.py

@@ -87,12 +87,7 @@ for i in range(5):
     #current_image = Image.open(image_path)
     current_image= get_image(diran_domain_name, dataset, next_stim)
     crop_image, percentage, orientation, position = crop_images(image_ref, current_image)
-    img = visual.ImageStim(win=mywin, image=crop_image)
-    img.draw()
-    mywin.flip()
-    start = time.time()
-    key_answer = event.waitKeys(keyList=["left","right"])
-    end = time.time()
+
     answerTime.append(end-start)
     if key_answer == ['left']:
         answer = 1 #one image

+ 3 - 0
expe/templates/expe/expe.html

@@ -11,6 +11,9 @@
     {% if request.session.begin %}
         <h3>{{ question }}</h3>
         <p>{{ indication }}</p>
+
+        <br />
+        <p>Press enter to begin experience</p>
     {% endif %}
     
     <!-- TODO : Load    img from bitmap with javascript `loadImg.js` -->

+ 11 - 1
expe/utils/functions.py

@@ -4,4 +4,14 @@ def uniqueID():
     '''
     Return unique identifier for current user and 
     '''
-    return str(random.uniform(0, 1))[2:15]
+    return str(random.uniform(0, 1))[2:15]
+
+
+def write_header_expe(f, expe_name):
+    '''
+    Write specific header into file
+    '''
+
+    if expe_name == 'quest_one_image':
+        f.write('stimulus' + ";" + "name_stimulus" + ";" + 'cropping_percentage' + ";" + 'orientation' + ';' 
+            + 'image_ref_position' + ';' + 'answer' + ';' + 'time_reaction' + ';' + 'entropy' + '\n')

+ 39 - 19
expe/views.py

@@ -9,7 +9,7 @@ import json
 import base64
 import random
 import numpy as np
-import datetime
+from datetime import datetime
 
 # image processing imports
 import io
@@ -37,25 +37,30 @@ def expe_list(request):
 # Create your views here.
 def expe(request):
     
-    question_sentence  = "Do you see one image or a composition of more than one?"
-    indication_sentence = "press left if you see one image, right if not"
-
     # get param 
     expe_name = request.GET.get('expe')
     scene_name = request.GET.get('scene')
 
-    # first time expe is launched
+    # unique user ID during session (user can launch multiple exeperiences)
+    if 'id' not in request.session:
+        request.session['id'] = functions.uniqueID()
+
+    # first time expe is launched add expe information
     if 'expe' not in request.session:
         request.session['expe'] = expe_name
         request.session['begin'] = True
     else:
         request.session['begin'] = False
 
+    print(request.session.get('begin'))
+
     # update ref img at first time or expe changed
-    if 'ref_img' not in request.session or expe_name != request.session['expe']:
+    if expe_name != request.session.get('expe'):
+    #if 'ref_img' not in request.session or expe_name != request.session.get('expe'):
         request.session['begin'] = True
         request.session['qualities'] = api.get_scene_qualities(scene_name)
-        request.session['id'] = functions.uniqueID()
+        # update unique timestamp each time new experience is launched
+        request.session['timestamp'] = datetime.strftime(datetime.utcnow(), "%Y-%m-%d_%Hh%Mm%Ss")
 
         # TODO : add in cache ref_image
         # get reference image
@@ -73,33 +78,48 @@ def expe(request):
     img_merge, per, orien, swap_img = crop_images(noisy_image, ref_image)
 
     # create output folder for tmp files if necessary
-    folder = os.path.join(settings.MEDIA_ROOT, cfg.output_tmp_folder)
+    tmp_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_tmp_folder)
 
-    if not os.path.exists(folder):
-        os.makedirs(folder)
+    if not os.path.exists(tmp_folder):
+        os.makedirs(tmp_folder)
 
     # generate tmp merged image (pass as BytesIO was complicated..)
     # TODO : add crontab task to erase generated img
-    filepath_img = os.path.join(folder, request.session.get('id') + '_' + scene_name + '' + expe_name + '.png')
+    filepath_img = os.path.join(tmp_folder, request.session.get('id') + '_' + scene_name + '' + expe_name + '.png')
     img_merge.save(filepath_img)
 
     # create output folder for expe_result
-    timestamp = datetime.strftime(datetime.utcnow(), "%Y-%m-%d_%Hh%Mm%Ss")
-    filename += "online_ans" + timestamp +".csv"
-    f = open(filename,"w")
+    current_day = datetime.strftime(datetime.utcnow(), "%Y-%m-%d")
+    results_folder = os.path.join(cfg.output_expe_folder.format(current_day))
+
+    if not os.path.exists(results_folder):
+        os.makedirs(results_folder)
+
+    result_filename = expe_name + '_' + request.session.get('id') + '_' + request.session.get('timestamp') +".csv"
+    results_filepath = os.path.join(results_folder, result_filename)
+
+    if not os.path.exists(results_filepath):
+        f = open(results_filepath, 'w')
+        functions.write_header_expe(f, expe_name)
+    else:
+        f = open(results_filepath, 'a')
 
     #orientation : 0 = vertical, 1 = horizontal
     #image_ref_position : 0 = right/bottom, 1 = left/up
     #answer : left = 1, right = 0
-    f.write('stimulus' + ";" + "name_stimulus" + ";" + 'cropping_percentage' + ";" + 'orientation' + ';' 
-            + 'image_ref_position' + ';' + 'answer' + ';' + 'time_reaction' + ';' + 'entropy' + '\n')
+
+    print("here")
     
     # expe parameters
     data = {
         'expe_name': expe_name,
         'img_merged_path': filepath_img,
-        'question': question_sentence,
-        'indication': indication_sentence
+        'question': cfg.expe_questions[expe_name]['question'],
+        'indication': cfg.expe_questions[expe_name]['indication']
     }
 
-    return render(request, 'expe/expe.html', data)
+    return render(request, 'expe/expe.html', data)
+
+
+def run_quest_one_image():
+    pass

+ 7 - 0
static/js/keyEvents.js

@@ -5,6 +5,7 @@ function checkKey(e) {
 
     e = e || window.event;
 
+
     if (e.keyCode == '81') {
         // `q` for quit expe
        console.log('`q` key is pressed');
@@ -18,5 +19,11 @@ function checkKey(e) {
        // right arrow
        console.log('right arrow is pressed');
     }
+    else if (e.keyCode == '13') {
+       // right arrow
+       // TODO : avoid refresh with `enter` key when it is not necessary
+       console.log('right arrow is pressed');
+       window.location = window.location.href
+    }
 
 }