def __call__(self, domain, field): """ :param object domain: A Domain :param object field: Current field :return: Field after modification by Generator :rtype: Object """ self.field = field for b, bit in enumerate(self.bit_stream): if bit["m"] > 0: self.shape = Gaussian(**bit()) else: self.shape = Sech(**bit()) if domain.channels > 1: self.field[self.channel] += self.shape.generate(domain.t) else: self.field += self.shape.generate(domain.t) # Alternative: Only affect field of the current bit, # not the entire field: #~spb = domain.samples_per_bit #~bit_range = (b * spb, (b + 1) * spb) #~if domain.channels > 1: #~self.field[self.channel][bit_range[0]:bit_range[1]] += \ #~self.shape.generate(domain.t)[bit_range[0]:bit_range[1]] #~else: #~self.field[bit_range[0]:bit_range[1]] += \ #~self.shape.generate(domain.t)[bit_range[0]:bit_range[1]] return self.field
class Generator(object): """ :param string name: Name of this module :param object bit_stream: An array of Bit objects :param Uint channel: Channel to modify Generate a pulse with Gaussian or hyperbolic secant shape. Add this pulse to appropriate field, determined by channel. """ def __init__(self, name="generator", bit_stream=None, channel=0): self.name = name self.bit_stream = bit_stream self.channel = channel # Always make a single bit as default, if no bitstream is passed: if self.bit_stream is None: self.bit_stream = [Bit()] self.field = None self.shape = None def __call__(self, domain, field): """ :param object domain: A Domain :param object field: Current field :return: Field after modification by Generator :rtype: Object """ self.field = field for b, bit in enumerate(self.bit_stream): if bit["m"] > 0: self.shape = Gaussian(**bit()) else: self.shape = Sech(**bit()) if domain.channels > 1: self.field[self.channel] += self.shape.generate(domain.t) else: self.field += self.shape.generate(domain.t) # Alternative: Only affect field of the current bit, # not the entire field: #~spb = domain.samples_per_bit #~bit_range = (b * spb, (b + 1) * spb) #~if domain.channels > 1: #~self.field[self.channel][bit_range[0]:bit_range[1]] += \ #~self.shape.generate(domain.t)[bit_range[0]:bit_range[1]] #~else: #~self.field[bit_range[0]:bit_range[1]] += \ #~self.shape.generate(domain.t)[bit_range[0]:bit_range[1]] return self.field