Module ctsimu.scenario.source
A CTSimU X-ray source: position, orientation, size, and other parameters.
Classes
class Source
-
CTSimU X-ray source.
The part's name can be set upon initialization.
Parameters
name
:str
- Name for the part.
Expand source code
class Source(Part): """CTSimU X-ray source.""" def __init__(self, _root=None): Part.__init__(self, name="source", _root=_root) # Extra geometry parameters: self.new_subgroup("geometry") self.geometry.set(key="type", value="cone", native_unit="string", valid_values=[None, "cone", "parallel"], simple=True) self.geometry.new_subgroup("beam_divergence") self.geometry.beam_divergence.set(key="u", value=0, native_unit="deg") self.geometry.beam_divergence.set(key="v", value=0, native_unit="deg") # X-ray source parameters self.set(key="model", value=None, native_unit="string", simple=True) self.set(key="manufacturer", value=None, native_unit="string", simple=True) self.set(key="voltage", value=None, native_unit="kV") self.set(key="current", value=None, native_unit="mA") # Target self.new_subgroup("target") self.target.set(key="material_id", value=None, native_unit="string", simple=True) self.target.set(key="type", value="reflection", native_unit="string", simple=True, valid_values=[None, "reflection", "transmission"]) self.target.set(key="thickness", value=None, native_unit="mm") self.target.new_subgroup("angle") self.target.angle.set(key="incidence", value=None, native_unit="deg") self.target.angle.set(key="emission", value=None, native_unit="deg") # Spot self.new_subgroup("spot") self.spot.new_subgroup("size") self.spot.size.set(key="u", value=0, native_unit="mm") self.spot.size.set(key="v", value=0, native_unit="mm") self.spot.size.set(key="w", value=0, native_unit="mm") self.spot.new_subgroup("sigma") self.spot.sigma.set(key="u", value=0, native_unit="mm") self.spot.sigma.set(key="v", value=0, native_unit="mm") self.spot.sigma.set(key="w", value=0, native_unit="mm") self.spot.new_subgroup("intensity_map") self.spot.intensity_map.set(key="file", value=None, native_unit="string") self.spot.intensity_map.set(key="dim_x", value=None, simple=True) self.spot.intensity_map.set(key="dim_y", value=None, simple=True) self.spot.intensity_map.set(key="dim_z", value=None, simple=True) self.spot.intensity_map.set(key="type", value="uint16", native_unit="string", simple=True) self.spot.intensity_map.set(key="endian", value="little", native_unit="string", simple=True) self.spot.intensity_map.set(key="headersize", value=0, simple=True) # Spectrum self.new_subgroup("spectrum") self.spectrum.set(key="monochromatic", value=False, native_unit="bool", simple=True) self.spectrum.set(key="file", value=None, native_unit="string") # Window self.new_subgroup("window", array=True) self.window.set(key="material_id", value=None, native_unit="string", simple=True) self.window.set(key="thickness", value=None, native_unit="mm") # Filters self.new_subgroup("filters", array=True) self.filters.set(key="material_id", value=None, native_unit="string", simple=True) self.filters.set(key="thickness", value=None, native_unit="mm") def check(self): # Check if the target type is valid: if not (self.target.get("type") in valid_xray_target_types): raise ValueError(f"Not a valid X-ray source target type: \'{self.target.get('type')}\'. Should be any of {valid_xray_target_types}.") return False return True def set_from_json(self, json_scenario:dict): """Import the X-ray source definition and geometry from the JSON object. The JSON object should contain the complete content of the scenario definition file (at least the geometry and detector sections). Parameters ---------- json_scenario : dict A complete CTSimU scenario object, as imported from a JSON structure. """ self.reset() # Extract the X-ray source's geometry: geo = json_extract(json_scenario, ["geometry", "source"]) self.set_geometry(json_geometry_object=geo, proper_cs="local") self.geometry.set_from_json(geo) # Source properties: sourceprops = json_extract(json_scenario, ["source"]) Group.set_from_json(self, sourceprops) def json_dict(self) -> dict: """Create a CTSimU JSON dictionary for this source object and its subgroups. Returns ------- json_dict : dict """ jd = Group.json_dict(self) # Remove the geometry section, it was only used to store # the type and beam_divergence. It is not part of the # actual 'source' definition in a CTSimU scenario, but of # the source geometry, which is handled differently by the toolbox. del jd["geometry"] return jd def geometry_dict(self) -> dict: """Create a dictionary of the source geometry for a CTSimU scenario file. Returns ------- source_geometry_dict : dict Dictionary with the geometry of this part. """ jd = self.geometry.json_dict() jd.update(Part.geometry_dict(self)) return jd
Ancestors
Methods
def check(self)
def geometry_dict(self) ‑> dict
-
Create a dictionary of the source geometry for a CTSimU scenario file.
Returns
source_geometry_dict
:dict
- Dictionary with the geometry of this part.
def json_dict(self) ‑> dict
-
Create a CTSimU JSON dictionary for this source object and its subgroups.
Returns
json_dict
:dict
def set_from_json(self, json_scenario: dict)
-
Import the X-ray source definition and geometry from the JSON object. The JSON object should contain the complete content of the scenario definition file (at least the geometry and detector sections).
Parameters
json_scenario
:dict
- A complete CTSimU scenario object, as imported from a JSON structure.
Inherited members