Source code for admit.util.Line

""" .. _Line-api:

    **Line** --- Spectral line metadata.
    ------------------------------------

    This module defines the Line class for LINE entries in BDPs.
"""
# system imports
import xml.etree.cElementTree as et

# ADMIT imports
import bdp_types as bt
from UtilBase import UtilBase


[docs]class Line(UtilBase): """ Class for holding information on a specific spectral line. Parameters ---------- keyval : dict Dictionary of keyword:value pairs. Attributes ---------- name : str Name of the molecule/atom. Default: "". uid : str Unique identifier for the transition. Default: "". formula : str The chemical formula. Default: "". transition : str The transition/quantum number information. Default: "". energies : 2 element list List of the lower and upper state energies of the transition. Default: [0.0, 0.0]. energyunits : str Units of the upper/lower state energy. Default: K. linestrength : float The line strength of the transition. Default: 0.0. lsunits : str The units of the line strength. Default: "Debye^2". frequency : float The frequency of the transition. Default: 0.0. funits : str The units of the frequency. Default: "GHz". blend : int If this molecule is blended with others. Value of 0 means no blending any other value gives the index of the blend. Default: 0 (no blending). """ def __init__(self, **keyval): self.name = "" self.uid = "" self.formula = "" self.transition = "" self.energies = [0.0, 0.0] self.energyunits = "K" self.linestrength = 0.0 self.lsunits = "Debye^2" self.frequency = 0.0 self.funits = "GHz" self.blend = 0 UtilBase.__init__(self, **keyval)
[docs] def setupperenergy(self, value): """ Method to set the upper state energy. Parameters ---------- value : float The value to set the upper state energy to. Returns ------- None """ if isinstance(value, float) : self.energies[1] = value elif isinstance(value, int) : self.energies[1] = float(value) else : raise Exception("Energy must be a number")
[docs] def setlowerenergy(self, value): """ Method to set the lower state energy. Parameters ---------- value : float The value to set the lower state energy to. Returns ------- None """ if isinstance(value, float) : self.energies[0] = value elif isinstance(value, int) : self.energies[0] = float(value) else : raise Exception("Energy must be a number")
[docs] def getlowerenergy(self) : """ Method to get the lower state energy. Parameters ---------- None Returns ------- Float of the lower state energy. """ return self.energies[0]
[docs] def getupperenergy(self): """ Method to get the upper state energy. Parameters ---------- None Returns ------- Float of the upper state energy. """ return self.energies[1]
[docs] def setkey(self, name="", value=""): """ set keys, two styles are possible: 1. name = {key:val} e.g. **setkey({"a":1})** 2. name = "key", value = val e.g. **setkey("a", 1)** This method checks the type of the keyword value, as it must remain the same. Also new keywords cannot be added. Parameters ---------- name : dictionary or string Dictionary of keyword value pais to set or a string with the name of a single key value : any The value to change the keyword to Returns ------- None """ if isinstance(name, dict): for k, v in name.iteritems(): if hasattr(self, k): if type(v) == type(getattr(self, k)): if k == "energies" and not isinstance(v, list) and len(v) != 2: raise Exception("Energies must be a list in the format [lower, upper], use setupperenergy or setlowerenergy to set them individually.") setattr(self, k, v) else: raise Exception("Cannot change data type for %s, expected %s but got %s" % (k, str(type(getattr(self, k))), str(type(v)))) else: raise Exception("Invalid key given to Line class: %s" % (k)) elif not name == "": if hasattr(self, name): if type(value) == type(getattr(self, name)): if name == "energies" and not isinstance(value, list) and len(value) != 2: raise Exception("Energies must be a list in the format [lower, upper], use setupperenergy or setlowerenergy to set them individually.") setattr(self, name, value) else: raise Exception("Cannot change data type for %s, expected %s but got %s" % (name, str(type(getattr(self, name))), str(type(value)))) else: raise Exception("Invalid key given to Line class: %s" % (name)) else: raise Exception("Invalid name parameter given, it must be a string or a dictionary of keys:values.")
[docs] def isequal(self, line): """ Experimental method to compare 2 line classes Parameters ---------- line : Line The class to compare this one to. Returns ------- Boolean whether or not the two classes contain the same data. """ try: for i in self.__dict__: if cmp(getattr(self, i), getattr(line, i)) != 0: return False except: return False return True