14 LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
15 NUMBER_LETTERS = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'
18 def __init__(self, setting):
19 self.id = setting.value('id')
20 self.title = setting.value('title')
21 self.code = setting.value('code')
22 self.created = setting.value('created')
23 self.modified = setting.value('modified')
24 self.prob_method = setting.value('prob_method')
25 self.base_prob = setting.value('base_prob')
26 self.dist_method = setting.value('dist_method')
27 self.identifier_type = setting.value('identifier_type')
28 self.identifier_order = setting.value('identifier_order')
29 self.identifier_length = setting.value('identifier_length')
30 self.recycle_ids = setting.value('recycle_ids')
31 self.new_subject_random = setting.value('new_subject_random')
32 self.arms_weight = setting.value('arms_weight')
34 def get_max_sample_size(self):
36 if self.identifier_type == ALPHA:
38 elif self.identifier_type == MIX:
40 ss = math.pow(base, self.identifier_length)
41 return ss, self.format_unit(ss)
43 def format_unit(self, size):
46 power_labels = {0: '', 1: ' K', 2: ' M', 3: ' G', 4: ' T', 5: ' P'}
51 return '{}{}'.format(size, power_labels[n])
53 def format_subject_identifier(self, value):
54 length = int(self.identifier_length)
55 if self.identifier_type == NUMERIC:
56 return str(value).zfill(length)
57 base = [10, 26, 36][self.identifier_type]
58 z = ['0', 'A', '0'][self.identifier_type]
59 lst = number_to_base(value, base)
60 w = ['', LETTERS, NUMBER_LETTERS][self.identifier_type]
61 lst = ''.join(list(map(lambda x: w[x], lst)))
62 lst = lst.zfill(length)
63 lst = lst.replace('0', z)
67 def number_to_base(n, b):
72 digits.append(int(n % b))