3 from AthenaCommon.Logging
import logging
4 log = logging.getLogger(__name__)
7 The prescaling uses a pseudo-random binary sequence generator of 24 bit width (31 bit internal)
9 - Prescales are defined by a cutoff (C).
10 - Each time a random number (R) is generated.
11 - C, R are between 0 and 2**24-1
13 - The trigger item is accepted if R>=C. The prescale (PS) corresponding to a cutoff C is PS = (2**24-1)/(2**24-C)
16 In this scheme only number that are powers of 2 can be represented
17 exactly. Effective prescales are typically non-integer. Integer
18 numbers can~t be represented exactly but have an error which grows with the
22 maxPrescaleCut = 0xFFFFFF
26 C = 2**24-(2**24-1)/PS
29 PS = 2 --> C = 8388609
30 PS = 10 --> C = 15099495
31 PS = 1000 --> C = 16760439
32 PS = 10000 --> C = 16775539
33 PS = 2**24-1 --> C = 2**24-1
37 raise RuntimeError(
"L1 Prescale value of 0 is not allowed")
39 sign = -1
if prescale<0
else 1
40 prescale = abs(prescale)
41 cut=sign * ( 0x1000000 - (0xFFFFFF/prescale) )
43 if prescale > 0xFFFFFF:
44 cut=sign * (0x1000000-1)
50 PS = (2**24-1)/(2**24-C)
53 C = 2**24-1 --> PS = 2**24-1
57 raise RuntimeError(
"L1 Prescale cut of 0 is not allowed, use cut=1 for a prescale value of 1")
59 sign = -1
if cut<0
else 1
61 return (sign * 0xFFFFFF) / ( 0x1000000 - cut )