def __init__(self, name, distribution_shape=None, components=None): Node.__init__(self, name) if components is None: assert distribution_shape is not None, "You have to either provied a list of components, or a " \ "distribution shape" components = [SpectralComponent("main", distribution_shape)] Source.__init__(self, components, PARTICLE_SOURCE) # Add a node called 'spectrum' spectrum_node = Node('spectrum') spectrum_node._add_children(self._components.values()) self._add_child(spectrum_node) self.__call__ = self.get_flux # Set the units # Now sets the units of the parameters for the energy domain current_units = get_units() # energy as x and particle flux as y x_unit = current_units.energy y_unit = 1 / current_units.energy # Now set the units of the components for component in self._components.values(): component.shape.set_units(x_unit, y_unit)
def __init__(self, name, shape, polarization=None): # Check that we can call the shape (i.e., it is a function) assert hasattr( shape, '__call__' ), "The shape must be callable (i.e., behave like a function)" self._spectral_shape = shape # Store the polarization if polarization is None: self._polarization = Polarization() else: self._polarization = polarization # Add shape and polarization as children Node.__init__(self, name) try: self._add_children([self._spectral_shape, self._polarization]) except TypeError: raise TypeError( "Couldn't instance the spectral component. Please verify that you are using an " "*instance* of a function, and not a class. For example, you need to use " "'%s()', and not '%s'." % (shape.__name__, shape.__name__))
def __init__(self, name, shape, polarization=None): # Check that we can call the shape (i.e., it is a function) assert hasattr(shape, '__call__'), "The shape must be callable (i.e., behave like a function)" self._spectral_shape = shape # Store the polarization if polarization is None: self._polarization = Polarization() else: self._polarization = polarization # Add shape and polarization as children Node.__init__(self, name) try: self._add_children([self._spectral_shape, self._polarization]) except TypeError: raise TypeError("Couldn't instance the spectral component. Please verify that you are using an " "*instance* of a function, and not a class. For example, you need to use " "'%s()', and not '%s'." % (shape.__name__, shape.__name__))
def __init__(self, ra=None, dec=None, l=None, b=None, equinox='J2000'): """ :param ra: Right Ascension in degrees :param dec: Declination in degrees :param l: Galactic latitude in degrees :param b: Galactic longitude in degrees :param equinox: string :return: """ self._equinox = equinox # Create the node Node.__init__(self, 'position') # Check that we have the right pairs of coordinates if ra is not None and dec is not None: # This goes against duck typing, but it is needed to provide a means of initiating this class # with either Parameter instances or just floats # Try to transform it to float, if it works than we transform it to a parameter ra = self._get_parameter_from_input(ra, 0, 360, 'ra','Right Ascension') dec = self._get_parameter_from_input(dec, -90, 90, 'dec','Declination') self._coord_type = 'equatorial' self._add_child(ra) self._add_child(dec) elif l is not None and b is not None: # This goes against duck typing, but it is needed to provide a means of initiating this class # with either Parameter instances or just floats # Try to transform it to float, if it works than we transform it to a parameter l = self._get_parameter_from_input(l, 0, 360, 'l','Galactic longitude') b = self._get_parameter_from_input(b, -90, 90, 'b','Galactic latitude') self._coord_type = 'galactic' self._add_child(l) self._add_child(b) else: raise WrongCoordinatePair("You have to specify either (ra, dec) or (l, b).")
def __init__(self): Node.__init__(self,'polarization')
def __init__(self): Node.__init__(self, 'polarization')
def __init__(self, source_name, ra=None, dec=None, spectral_shape=None, l=None, b=None, components=None, sky_position=None): # Check that we have all the required information # (the '^' operator acts as XOR on booleans) # Check that we have one and only one specification of the position assert ((ra is not None and dec is not None) ^ (l is not None and b is not None) ^ (sky_position is not None)), "You have to provide one and only one specification for the position" # Gather the position if not isinstance(sky_position, SkyDirection): if (ra is not None) and (dec is not None): # Check that ra and dec are actually numbers try: ra = float(ra) dec = float(dec) except (TypeError, ValueError): raise AssertionError("RA and Dec must be numbers. If you are confused by this message, you " "are likely using the constructor in the wrong way. Check the documentation.") sky_position = SkyDirection(ra=ra, dec=dec) else: sky_position = SkyDirection(l=l, b=b) self._sky_position = sky_position # Fix the position by default self._sky_position.fix() # Now gather the component(s) # We need either a single component, or a list of components, but not both # (that's the ^ symbol) assert (spectral_shape is not None) ^ (components is not None), "You have to provide either a single " \ "component, or a list of components " \ "(but not both)." # If the user specified only one component, make a list of one element with a default name ("main") if spectral_shape is not None: components = [SpectralComponent("main", spectral_shape)] Source.__init__(self, components, POINT_SOURCE) # A source is also a Node in the tree Node.__init__(self, source_name) # Add the position as a child node, with an explicit name self._add_child(self._sky_position) # Add a node called 'spectrum' spectrum_node = Node('spectrum') spectrum_node._add_children(self._components.values()) self._add_child(spectrum_node) # Now set the units # Now sets the units of the parameters for the energy domain current_units = get_units() # Components in this case have energy as x and differential flux as y x_unit = current_units.energy y_unit = (current_units.energy * current_units.area * current_units.time) ** (-1) # Now set the units of the components for component in self._components.values(): component.shape.set_units(x_unit, y_unit)
def __init__(self, source_name, ra=None, dec=None, spectral_shape=None, l=None, b=None, components=None, sky_position=None): # Check that we have all the required information # (the '^' operator acts as XOR on booleans) # Check that we have one and only one specification of the position assert ( (ra is not None and dec is not None) ^ (l is not None and b is not None) ^ (sky_position is not None) ), "You have to provide one and only one specification for the position" # Gather the position if not isinstance(sky_position, SkyDirection): if (ra is not None) and (dec is not None): # Check that ra and dec are actually numbers try: ra = float(ra) dec = float(dec) except (TypeError, ValueError): raise AssertionError( "RA and Dec must be numbers. If you are confused by this message, you " "are likely using the constructor in the wrong way. Check the documentation." ) sky_position = SkyDirection(ra=ra, dec=dec) else: sky_position = SkyDirection(l=l, b=b) self._sky_position = sky_position # Fix the position by default self._sky_position.fix() # Now gather the component(s) # We need either a single component, or a list of components, but not both # (that's the ^ symbol) assert (spectral_shape is not None) ^ (components is not None), "You have to provide either a single " \ "component, or a list of components " \ "(but not both)." # If the user specified only one component, make a list of one element with a default name ("main") if spectral_shape is not None: components = [SpectralComponent("main", spectral_shape)] Source.__init__(self, components, POINT_SOURCE) # A source is also a Node in the tree Node.__init__(self, source_name) # Add the position as a child node, with an explicit name self._add_child(self._sky_position) # Add a node called 'spectrum' spectrum_node = Node('spectrum') spectrum_node._add_children(self._components.values()) self._add_child(spectrum_node) # Now set the units # Now sets the units of the parameters for the energy domain current_units = get_units() # Components in this case have energy as x and differential flux as y x_unit = current_units.energy y_unit = (current_units.energy * current_units.area * current_units.time)**(-1) # Now set the units of the components for component in self._components.values(): component.shape.set_units(x_unit, y_unit)
def __init__(self, source_name, spatial_shape, spectral_shape=None, components=None): # Check that we have all the required information # and set the units current_u = get_units() if spatial_shape.n_dim == 2: # Now gather the component(s) # We need either a single component, or a list of components, but not both # (that's the ^ symbol) assert (spectral_shape is not None) ^ (components is not None), "You have to provide either a single " \ "component, or a list of components " \ "(but not both)." # If the user specified only one component, make a list of one element with a default name ("main") if spectral_shape is not None: components = [SpectralComponent("main", spectral_shape)] # Components in this case have energy as x and differential flux as y diff_flux_units = (current_u.energy * current_u.area * current_u.time) ** (-1) # Now set the units of the components for component in components: component.shape.set_units(current_u.energy, diff_flux_units) # Set the units of the brightness spatial_shape.set_units(current_u.angle, current_u.angle, current_u.angle**(-2)) elif spatial_shape.n_dim == 3: # If there is no spectral component then assume that the input is a template, which will provide the # spectrum by itself. We just use a renormalization (a bias) if spectral_shape is None and components is None: # This is a template. Add a component which is just a renormalization spectral_shape = Constant() components = [SpectralComponent("main", spectral_shape)] # set the units diff_flux_units = (current_u.energy * current_u.area * current_u.time * current_u.angle**2) ** (-1) spatial_shape.set_units(current_u.angle, current_u.angle, current_u.energy, diff_flux_units) else: # the spectral shape has been given, so this is a case where the spatial template gives an # energy-dependent shape and the spectral components give the spectrum assert (spectral_shape is not None) ^ (components is not None), "You can provide either a single " \ "component, or a list of components " \ "(but not both)." if spectral_shape is not None: components = [SpectralComponent("main", spectral_shape)] # Assign units diff_flux_units = (current_u.energy * current_u.area * current_u.time) ** (-1) # Now set the units of the components for component in components: component.shape.set_units(current_u.energy, diff_flux_units) # Set the unit of the spatial template spatial_shape.set_units(current_u.angle, current_u.angle, current_u.energy, current_u.angle**(-2)) else: raise RuntimeError("The spatial shape must have either 2 or 3 dimensions.") # Here we have a list of components Source.__init__(self, components, EXTENDED_SOURCE) # A source is also a Node in the tree Node.__init__(self, source_name) # Add the spatial shape as a child node, with an explicit name self._spatial_shape = spatial_shape self._add_child(self._spatial_shape) # Add the same node also with the name of the function #self._add_child(self._shape, self._shape.__name__) # Add a node called 'spectrum' spectrum_node = Node('spectrum') spectrum_node._add_children(self._components.values()) self._add_child(spectrum_node)
def __init__(self, name, value, min_value=None, max_value=None, desc=None, unit=u.dimensionless_unscaled): # Make this a node Node.__init__(self, name) # Callbacks are executed any time the value for the parameter changes (i.e., its value changes) # We start from a empty list of callbacks. self._callbacks = [] # Assign to members # Store the units as an astropy.units.Unit instance self._unit = u.Unit(unit) # Let's store the init value # If the value is a Quantity, deal with that if isinstance(value, u.Quantity): # If the user did not specify an ad-hoc unit, use the unit # of the Quantity if self._unit == u.dimensionless_unscaled: self._unit = value.unit # Convert the value to the provided unit (if necessary) self._value = value.to(self._unit).value else: self._value = value # Set minimum if provided, otherwise use default # (use the property so the checks that are there are performed also on construction) self._min_value = None # this will be overwritten immediately in the next line self.min_value = min_value # Set maximum if provided, otherwise use default self._max_value = None # this will be overwritten immediately in the next line self.max_value = max_value # Store description self._desc = desc # Make the description the documentation as well self.__doc__ = desc # Now perform a very lazy check that we can perform math operations on value, minimum and maximum # (i.e., they are numbers) if not _behaves_like_a_number(self._value): raise TypeError("The provided initial value is not a number") if self._min_value is not None: if not _behaves_like_a_number(self._min_value): raise TypeError("The provided minimum value is not a number") if self._max_value is not None: if not _behaves_like_a_number(self._max_value): raise TypeError("The provided maximum value is not a number")
def __init__(self, source_name, spatial_shape, spectral_shape=None, components=None): # Check that we have all the required information # and set the units current_u = get_units() if spatial_shape.n_dim == 2: # Now gather the component(s) # We need either a single component, or a list of components, but not both # (that's the ^ symbol) assert (spectral_shape is not None) ^ (components is not None), "You have to provide either a single " \ "component, or a list of components " \ "(but not both)." # If the user specified only one component, make a list of one element with a default name ("main") if spectral_shape is not None: components = [SpectralComponent("main", spectral_shape)] # Components in this case have energy as x and differential flux as y diff_flux_units = (current_u.energy * current_u.area * current_u.time)**(-1) # Now set the units of the components for component in components: component.shape.set_units(current_u.energy, diff_flux_units) # Set the units of the brightness spatial_shape.set_units(current_u.angle, current_u.angle, current_u.angle**(-2)) elif spatial_shape.n_dim == 3: # If there is no spectral component then assume that the input is a template, which will provide the # spectrum by itself. We just use a renormalization (a bias) if spectral_shape is None and components is None: # This is a template. Add a component which is just a renormalization spectral_shape = Constant() components = [SpectralComponent("main", spectral_shape)] # set the units diff_flux_units = (current_u.energy * current_u.area * current_u.time * current_u.angle**2)**(-1) spatial_shape.set_units(current_u.angle, current_u.angle, current_u.energy, diff_flux_units) else: # the spectral shape has been given, so this is a case where the spatial template gives an # energy-dependent shape and the spectral components give the spectrum assert (spectral_shape is not None) ^ (components is not None), "You can provide either a single " \ "component, or a list of components " \ "(but not both)." if spectral_shape is not None: components = [SpectralComponent("main", spectral_shape)] # Assign units diff_flux_units = (current_u.energy * current_u.area * current_u.time)**(-1) # Now set the units of the components for component in components: component.shape.set_units(current_u.energy, diff_flux_units) # Set the unit of the spatial template spatial_shape.set_units(current_u.angle, current_u.angle, current_u.energy, current_u.angle**(-2)) else: raise RuntimeError( "The spatial shape must have either 2 or 3 dimensions.") # Here we have a list of components Source.__init__(self, components, EXTENDED_SOURCE) # A source is also a Node in the tree Node.__init__(self, source_name) # Add the spatial shape as a child node, with an explicit name self._spatial_shape = spatial_shape self._add_child(self._spatial_shape) # Add the same node also with the name of the function #self._add_child(self._shape, self._shape.__name__) # Add a node called 'spectrum' spectrum_node = Node('spectrum') spectrum_node._add_children(self._components.values()) self._add_child(spectrum_node)