#1 by ekmallory (edited )
I'm putting together a public goods game with treatments which involve both within and between group competition. I've been trying to figure out how to access and display each subject's / team's relative contributions to each participant intermittently between rounds. Does anyone have experience with something similar or have any ideas about how to do it? Thank you for your help, Erik
#2 by Daniel_Frey
Hi Erik I'd suggest you use participant variables / fields: https://otree.readthedocs.io/en/latest/rounds.html#participant-fields If you have a value that is the same for each player in the group and you are in a group function, you can store it like this: def some_group_function(group) for p in group.get_players() player.participant.vars['your_variable'] = value
#3 by ekmallory (edited )
Thank you Daniel, your bit of code is very helpful, I think that I'm starting to understand the structure. I am trying to avoid using the participant fields though so that I don't mix things up across treatments/apps, if my understanding is correct. Do you happen to know if I can access a player's contribution, for example from a specific round with something like: under group, defining a function that includes the following: players_in_round = self.in_round(1).get_players() round_contributions = [p.contribution for p in players_in_round] highest_cont = max(self.round_contributions) for p in self.players_in_round: if p.round_contributions == highest_cont p.hi_contributor = 1 else: p.hi_contributor = 0 highest_contibutors = [p.id_in_group for p in players if p.hi_contributors == 1]
#4 by Daniel_Frey
I'm not sure, but I think your first line does not work: get_players() returns a list of all players in the group, and it cannot select a specific round (I think). Try this: all_players = self.get_players() round_contributions = [p.in_round(1).contribution for p in all_players] and leave the rest. Btw, are you using oTree Lite that you wrote self in your code? If yes, I'd suggest you upgrade to oTree 5 if possible, it's so much cleaner :) Best, Daniel
#5 by Daniel_Frey
Addition: The if-condition should be changed as well: for p in self.all_players: if p.in_round(1).contribution == highest_cont: p.hi_contributor = 1 else: p.hi_contributor = 0