#1 by vedube (edited )
Hi! I would like to assign randomly the participants I have in a session into the 2 apps I have in my code. The apps I have are "control" and "treatment" and the difference between them are that the first one has a time limit of 15 minutes and the second one a time limit of 5 minutes. After the main questions that have time limit, there are some final questions that are the same for everyone. I've been reading the oTree documentation about Treatment but I don't see the explanation on how to assign the participants into different apps, so I would like to know if it's possible or if it's not, then how could I implement different time limits depending of the assignment of the participant into control or treatment in one app? I didn't see either how to assign different time limits depending the treatment assigned to the participant. Thank you very much!
#2 by Daniel_Frey
Hi there! Is the only difference of the treatments the different countdown? If yes, you can show the participants the same page with different timeouts using get_timeout_seconds: class YourPage(Page): @staticmethod def get_timeout_seconds(player): # I assume you have saved the assigned treatment in a player-field if player.treatment == 'control': timeout_seconds = 5 * 60 if player.treatment == 'treatment': timeout_seconds = 15 * 60 return timeout_seconds If you want to send the players to different apps, you can use app_after_this_page: https://otree.readthedocs.io/en/latest/pages.html?highlight=app_after_this_page#app-after-this-page
#3 by vedube
Thank you so much for your help! As I am modifying an existing code, I am thinking of implementing the second method. In that case, should I hardcode the exact page each player will go? Again, I appreciate the help
#4 by vedube
I created this new app in order to assign each participant randomly to either the treat app or the control app but I don't know what error I'am making: import random from otree.api import * class C(BaseConstants): NAME_IN_URL = 'gbat_treatments' PLAYERS_PER_GROUP = None # You can set this to a specific number if needed NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): treatment = models.BooleanField() class MyWaitPage(WaitPage): def creating_session(subsession): if subsession.round_number == 1: for player in subsession.get_players(): participant = player.participant participant.treatment = random.choice([True, False]) class MyPage(Page): def app_after_this_page(self, player): participant = player.participant if participant.treatment: return "treat" else: return "control" page_sequence = [MyWaitPage]
#5 by Daniel_Frey (edited )
creating_session should be on the top level of your code (usually placed after the class Subsession), not on the WaitPage: ... class Subsession(BaseSubsession): pass def creating_session(subsession): if subsession.round_number == 1: # save the players in a local list, so the function get_players() is only executed once all_players = subsession.get_players() for player in all_players: participant = player.participant participant.treatment = random.choice([True, False]) class Group(BaseGroup): pass class Player(BasePlayer): treatment = models.BooleanField() class MyWaitPage(WaitPage): pass class MyPage(Page): @staticmethod def app_after_this_page(player, upcoming_apps): participant = player.participant if participant.treatment: return "treat" else: return "control" # you need to add MyPage to the page_sequence, otherwise you cannot sort the players into the different apps page_sequence = [MyWaitPage, MyPage]
#6 by Daniel_Frey
Furthermore, player.treatment and player.participant.treatment are two different variables: you initiate player.treatment in the Player class, but use player.participant.treatment for the treatment-assignment. Hope that helps! Best, Daniel