oTree Forum >

KeyError: 'treatment' for assigning treatments to participants

#1 by manond

Dear all,

I am trying to assign treatments ('Control', 'LP', 'CMC') to my participants but it keeps on returning " KeyError: 'treatment' " when running my code. Could you help me ? Many thanks.

Here is my code:

 ----------------------------------------------------------------------------
 
class Player(BasePlayer):
   ...
   
    # Assignation treatement
    treatment = models.CharField(initial='', null=False)

    def creating_session(self, subsession):
        # List of possible treatments
        treatments = ['Control', 'LP', 'CMC']
        pressures = itertools.cycle(treatments)

        # Assign treatments to players
        if subsession.round_number == 1:
            for player in self.subsession.get_players():
                participant = player.participant
                print(participant)
                participant.treatment = random.choice(treatments)
                print(participant.treatment)

                # Check if treatments are balanced
                participant.treatment = next(pressures)
                print('Set treatment to', participant.treatment)
 
 ----------------------------------------------------------------------------
 
 class CountingA(Page):
    form_model = 'player'
    form_fields = ['answerA']
    timeout_seconds = 10

    @staticmethod
    def vars_for_template(player):

        # Generate a random list of letters
        letters_listA = [random.choice('ABCDEFGHIJKLMNOPQRSTUVWXYZ') for _ in range(30)]
        player.letters_listA = ' '.join(letters_listA)  # Convert the list to a string

        # Choose a random letter from the list as the target letter
        target_letterA = random.choice(letters_listA)

        # Count the occurrences of the target letter in the list
        nb_target_letterA = letters_listA.count(target_letterA)

        # Store the target letter and correct count in the model
        player.target_letterA = target_letterA
        player.nb_target_letterA = nb_target_letterA

        return {
            'letters_listA': player.letters_listA,
            'target_letterA': player.target_letterA,
        }

    # set up payoffs based on treatments
    @staticmethod
    def before_next_page(player, timeout_happened):
        participant = player.participant
        # Record whether the participant's count is correct
        player.is_correctA = (player.nb_target_letterA == player.answerA)
        if participant.treatment == 'LP':
            if player.is_correctA == 1:
                player.total_scoreA += 1
                player.taskA_payoff = Constants.taskA_correct_payoffLP
            else:
                player.taskA_payoff = Constants.taskA_wrong_payoffLP
        else:
            if player.is_correctA == 1:
                player.total_scoreA += 1
                player.taskA_payoff = Constants.taskA_correct_payoffC
            else:
                player.taskA_payoff = Constants.taskA_wrong_payoffC
 
 ----------------------------------------------------------------------------

#2 by Daniel_Frey

I see a few problems here:

    - What is models.CharField? Did you define that yourself? Or do you actually want a StringField?
    - Be careful with player.treatment & player.participant.treatment, those are not the same.
    
Where does your code generate the error? At the creating_session() function or later on the page?

#3 by Daniel_Frey

and furthermore, is creating_session() inside your Player class? This should be a function inside Subsession (for oTree 3) or in no class at all (for oTree 5)

Write a reply

Set forum username