import logging import random import csv import heapq import benchmarks.common as utils class SequenceGenerator: """nb_gm_002 generator Generates skewed random sequence of stimuli for the n-back task, based on Ralph (2014). Each sequence contains specific fraction of matched trials (targets). """ def __init__( self, choices: list, n=2 ): self.n, self.choices = n, choices self.seq = [] self.trials = None def generate(self, trials, targets, lures1, lures2, debug=False) -> list: self.trials = trials distractors = trials - targets - lures1 - lures2 - self.n pool = ['T'] * targets + ['1'] * lures1 + ['2'] * lures2 + ['-'] * distractors random.shuffle(pool) pool = ['-'] * self.n + pool if debug: print(f"MASK : {''.join(pool)}") self.seq.clear() for i in range(len(pool)): t = pool[i] if t == 'T': self.seq += self.seq[i-self.n] elif t == '1': self.seq += self.seq[i-self.n - 1] elif t == '2': self.seq += self.seq[i-self.n + 1] else: # distractors d = [c for c in self.choices if c not in self.seq[-self.n - 1:-self.n + 1]] if i > self.n else self.choices self.seq += random.choices(d) if debug: print(f"RESULT: {''.join(self.seq)}", '(t,l)=', utils.count_targets_and_lures(self.seq, self.n)) return self.seq if __name__ == '__main__': gen = SequenceGenerator(['A', 'B', 'C', 'D', 'E', 'F'], 2) s =gen.generate(24, 8, 4, 0, debug=True) with open("seqs.txt") as fh: for line in fh: print(line)