from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, ) from numpy.random import choice import random import json author = 'Miriam Kachelmann' doc = """ An experience sampling vs description lottery with omission bias test. """ class Constants(BaseConstants): name_in_url = 'Card_Lottery' players_per_group = None num_rounds = 10 class Subsession(BaseSubsession): # create the session for all participants ### --- Creating the list 'order' for every participant with an identical number of 'B' and 'A' --- #### ### Shuffle this list to prevent unwanted side effects ### ### Store it in particpant variables, so it won't change each round ### def creating_session(self): ### ------------------ Set Condition for Participants and assign HTML Template to them ----------------------------------------------### if self.round_number == 1: # If and For Loops for setting and assigning participants to between conditions for player in self.get_players(): ### ----- Read Gambles ------------------------------------------------------------### # mit dieser Funktion lese ich das gambles.csv ein row by row und speichere dieses Objekt/Liste als # player.participant.vars['choice_pairs']. Das ist eine genestete liste, die jeweils eine Liste pro Choice Pair enthaet # d.h. jedes Choice Pair ist eine eigene Liste innerhalb der overall choice_pairs Liste # die Letzte Zeile zieht in Abhaengigkeit der Rundennummer den korrespondierenden Eintrag aus der Liste (also ein choice_pair) # und assigned diese kleine Liste (das eine choice_pair) der Variable player.trial # da man in Django/otree keine Listen einem models.StringField zuordnen kann, braucht es das import json Modul # zum Speichern json.dumps (> speichert Liste als string) und zum loaden json.loads (> konvertiert string zu Liste) # das Speichern der beiden Variablen muss auch im 2. Teil des If-Loops noch einmal erfolgen, sonst nur in Runde 1 definiert import csv gambles_file = 'OmEx_Lottery/gambles.csv' with open(gambles_file) as f: reader = csv.reader(f) all_gambles = [] for row in reader: all_var = (row) all_gambles.append(all_var) random.shuffle(all_gambles) #choice_pairs Randomisierung/ Shuffle player.participant.vars['choice_pairs'] = all_gambles player.choice_pairs = json.dumps(player.participant.vars['choice_pairs']) player.trial = json.dumps(player.participant.vars['choice_pairs'][player.round_number-1]) player.custom_round_number = self.round_number player.lottery_template = player.participant.vars['template'] player.treatment = player.participant.vars['treatment'] # store participant variable in player class player.order = str(player.participant.vars['order']) player.table_order = str(player.participant.vars['table_order']) trial = json.loads(player.trial) ## Initialize Bonus List player.participant.vars['final_bonus_list'] = [] ### ---- create gamble pairs and shuffle all ----- ### ## die Variablen aus dem objekt new_trial werden dann in pages.py extrahiert ### ## Der Trial muss hier gebaut werden, weil diese Funktion nur pro Runde aufgerufen wird, pages.py hingegen bei jedem Refresh. ## wenn also der User refreshed, wird new_Trial neu gemischt, wenn ## das nicht hier gemacht wird, sondern in pages.py new_trial = [] gamble_pair_1 = [] gamble_pair_2 = [] gamble_id = trial[0] player.gamble_id = json.dumps(gamble_id) ## Randomize Gamble Paare innerhalb des Trials gp1_inner_gamble1 = trial[1:3] # A1 Gamble gp1_inner_gamble2 = trial[3:5] # A2 Gamble gp2_inner_gamble1 = trial[5:7] # B1 Gamble gp2_inner_gamble2 = trial[7:9] # B2 Gamble ### create new shuffled gamble pairs # >> A Gambles gamble_pair_1.append(gp1_inner_gamble1) gamble_pair_1.append(gp1_inner_gamble2) random.shuffle(gamble_pair_1) # randomize order # >> B Gambles gamble_pair_2.append(gp2_inner_gamble1) gamble_pair_2.append(gp2_inner_gamble2) random.shuffle(gamble_pair_2) # randomize order ## Create new_trial out of shuffled inner_gamble_pairs and shuffle gamble pairs new_trial.append(gamble_pair_1) new_trial.append(gamble_pair_2) random.shuffle(new_trial) # shuffle Reihenfolge: A Gambles zuerst oder B Gambles zuerst player.gamble_pair_1 = json.dumps(gamble_pair_1) player.gamble_pair_2 = json.dumps(gamble_pair_2) player.new_trial = json.dumps(new_trial) # Save this new trial to variables so it is in data file # debug Code print("1 set Participant Template Variable to", player.participant.vars['template']) # print treatment to terminal for debug print("2 set Participant Treatment Variable to", player.participant.vars['treatment']) print("3 Participant Order Vars", player.participant.vars['order']) print("4 Again Participant Template Variable to", player.participant.vars['template']) # print treatment to terminal for debug print("5 Again Participant Treatment Variable to", player.participant.vars['treatment']) print(player.participant.vars['choice_pairs'][player.round_number - 1]) print('player trial', player.trial) print('The new trial is:', new_trial) print('New gamble_pair_1 is:', gamble_pair_1) print('New gamble_pair_2 is:', gamble_pair_2) print(player.table_order) print(player.order) else: for player in self.get_players(): player.order = str(player.participant.vars['order']) player.table_order = str(player.participant.vars['table_order']) player.custom_round_number = self.round_number # define lottery treatment/ template/ order fuer alle folgenden Runden player.lottery_template = player.participant.vars['template'] player.treatment = player.participant.vars['treatment'] # store participant variable in player class # define Trial in allen folgenden Runden - wird aber nur als Debeug benutzt player.trial = json.dumps(player.participant.vars['choice_pairs'][self.round_number-1]) ### ---- create gamble pairs and shuffle all ----- ### ## die Variablen aus dem objekt new_trial werden dann in pages.py extrahiert ### ## Der Trial muss hier gebaut werden, weil diese Funktion nur pro Runde aufgerufen wird, pages.py hingegen bei jedem Refresh. ## wenn also der User refreshed, wird new_Trial neu gemischt, wenn ## das nicht hier gemacht wird, sondern in pages.py trial = json.loads(player.trial) new_trial = [] gamble_pair_1 = [] gamble_pair_2 = [] gamble_id = trial[0] player.gamble_id = json.dumps(gamble_id) ## Randomize Gamble Paare innerhalb des Trials gp1_inner_gamble1 = trial[1:3] # A1 Gamble gp1_inner_gamble2 = trial[3:5] # A2 Gamble gp2_inner_gamble1 = trial[5:7] # B1 Gamble gp2_inner_gamble2 = trial[7:9] # B2 Gamble ### create new shuffled gamble pairs # >> A Gambles gamble_pair_1.append(gp1_inner_gamble1) gamble_pair_1.append(gp1_inner_gamble2) random.shuffle(gamble_pair_1) # randomize order # >> B Gambles gamble_pair_2.append(gp2_inner_gamble1) gamble_pair_2.append(gp2_inner_gamble2) random.shuffle(gamble_pair_2) # randomize order ## Create new_trial out of shuffled inner_gamble_pairs and shuffle gamble pairs new_trial.append(gamble_pair_1) new_trial.append(gamble_pair_2) random.shuffle(new_trial) # shuffle Reihenfolge: A Gambles zuerst oder B Gambles zuerst player.new_trial = json.dumps(new_trial) # Save this new trial to variables so it is in data file player.gamble_pair_1 = json.dumps(gamble_pair_1) player.gamble_pair_2 = json.dumps(gamble_pair_2) # debug Code print("1 set Participant Template Variable to", player.participant.vars['template']) # print treatment to terminal for debug print("2 set Participant Treatment Variable to", player.participant.vars['treatment']) print("3 Participant Order Vars", player.participant.vars['order']) print("4 Again Participant Template Variable to", player.participant.vars['template']) # print treatment to terminal for debug print("5 Again Participant Treatment Variable to", player.participant.vars['treatment']) print(player.participant.vars['choice_pairs']) print(player.round_number) print(player.participant.vars['choice_pairs'][player.round_number-1]) print('player trial', player.trial) print('The new trial is:', new_trial) print('New gamble_pair_1 is:', gamble_pair_1) print('New gamble_pair_2 is:', gamble_pair_2) print(player.table_order) print(player.order) # print(player.table_shuffle_var) # print('player a1_outcome', player.a1_outcome) class Group(BaseGroup): pass class Player(BasePlayer): order = models.LongStringField() lottery_template = models.StringField() treatment = models.StringField() choice = models.StringField(choices=[1, 'default', 2, 'alternative', 3, 'no-default-1', 4, 'no-default-2']) trial = models.LongStringField() choice_pairs = models.LongStringField() custom_round_number = models.IntegerField() new_trial = models.LongStringField() gamble_pair_1 = models.LongStringField() gamble_pair_2 = models.LongStringField() gamble_id = models.StringField() table_order = models.StringField() a1_prob = models.FloatField() a1_outcome = models.IntegerField() a2_prob = models.FloatField() a2_outcome = models.IntegerField() b1_prob = models.FloatField() b1_outcome = models.IntegerField() b2_prob = models.FloatField() b2_outcome = models.IntegerField() exp_deck = models.LongStringField() exp_lottery_win = models.IntegerField() desc_lottery_win = models.IntegerField() round_win = models.IntegerField() page_time_ms = models.IntegerField() exp_deck_seen_hidden = models.LongStringField(blank=True) length_exp_deck_seen_hidden = models.IntegerField(blank=True) real_lottery_win_hidden = models.LongStringField(blank=True) page_time_hidden = models.LongStringField(blank=True) default_side_hidden = models.LongStringField(blank=True) default_deck_letter_hidden = models.LongStringField(blank=True) # page_refresh_hidden = models.LongStringField(blank=True) def live_data(self, data): print('The win for this round is:', data['real_lottery_win']) self.payoff = data['real_lottery_win'] self.round_win = data['real_lottery_win'] print('The payout altogether is:', self.participant.payoff) self.page_time_ms = data['page_time_ms'] ## Create an own Bonus array that saves all round outcomes to an array ## to be able to draw one randomly as bonus at the end of the game self.participant.vars['final_bonus_list'].append(self.round_win) print('The Bonus list is:', self.participant.vars['final_bonus_list'])