Changeset 2891


Ignore:
Timestamp:
01/16/14 13:06:13 (11 years ago)
Author:
WataruKawasaki
Message:

New Development: No

JIRA Issue: Yes CAS-5870

Ready for Test: Yes

Interface Changes: No

What Interface Changed:

Test Programs:

Put in Release Notes:

Module(s): sd

Description: added functions for scantable to correctly treat the given restfreq.


File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/python/scantable.py

    r2890 r2891  
    379379        return restfreq * math.sqrt((1.0 - r) / (1.0 + r))
    380380
     381def get_restfreq_in_Hz(s_restfreq):
     382    value = 0.0
     383    unit = ""
     384    s = s_restfreq.replace(" ","")
     385
     386    for i in range(len(s))[::-1]:
     387        if s[i].isalpha():
     388            unit = s[i] + unit
     389        else:
     390            value = float(s[0:i+1])
     391            break
     392
     393    if (unit == "") or (unit.lower() == "hz"):
     394        return value
     395    elif (len(unit) == 3) and (unit[1:3].lower() == "hz"):
     396        unitprefix = unit[0]
     397        factor = 1.0
     398
     399        prefix_list = ["a", "f", "p", "n", "u", "m", ".", "k", "M", "G", "T", "P", "E"]
     400        factor_list = [1e-18, 1e-15, 1e-12, 1e-9, 1e-6, 1e-3, 1.0, 1e+3, 1e+6, 1e+9, 1e+12, 1e+15, 1e+18]
     401        factor = factor_list[prefix_list.index(unitprefix)]
     402        """
     403        if (unitprefix == 'a'):
     404            factor = 1.0e-18
     405        elif (unitprefix == 'f'):
     406            factor = 1.0e-15
     407        elif (unitprefix == 'p'):
     408            factor = 1.0e-12
     409        elif (unitprefix == 'n'):
     410            factor = 1.0e-9
     411        elif (unitprefix == 'u'):
     412            factor = 1.0e-6
     413        elif (unitprefix == 'm'):
     414            factor = 1.0e-3
     415        elif (unitprefix == 'k'):
     416            factor = 1.0e+3
     417        elif (unitprefix == 'M'):
     418            factor = 1.0e+6
     419        elif (unitprefix == 'G'):
     420            factor = 1.0e+9
     421        elif (unitprefix == 'T'):
     422            factor = 1.0e+12
     423        elif (unitprefix == 'P'):
     424            factor = 1.0e+15
     425        elif (unitprefix == 'E'):
     426            factor = 1.0e+18
     427        """
     428        return value*factor
     429    else:
     430        mesg = "wrong unit of restfreq."
     431        raise Exception, mesg
     432
     433def normalise_restfreq(in_restfreq):
     434    if isinstance(in_restfreq, float):
     435        return in_restfreq
     436    elif isinstance(in_restfreq, int) or isinstance(in_restfreq, long):
     437        return float(in_restfreq)
     438    elif isinstance(in_restfreq, str):
     439        return get_restfreq_in_Hz(in_restfreq)
     440    elif isinstance(in_restfreq, list) or isinstance(in_restfreq, numpy.ndarray):
     441        if isinstance(in_restfreq, numpy.ndarray):
     442            if len(in_restfreq.shape) > 1:
     443                mesg = "given in numpy.ndarray, in_restfreq must be 1-D."
     444                raise Exception, mesg
     445       
     446        res = []
     447        for i in xrange(len(in_restfreq)):
     448            elem = in_restfreq[i]
     449            if isinstance(elem, float):
     450                res.append(elem)
     451            elif isinstance(elem, int) or isinstance(elem, long):
     452                res.append(float(elem))
     453            elif isinstance(elem, str):
     454                res.append(get_restfreq_in_Hz(elem))
     455            elif isinstance(elem, dict):
     456                if isinstance(elem["value"], float):
     457                    res.append(elem)
     458                elif isinstance(elem["value"], int):
     459                    dictelem = {}
     460                    dictelem["name"]  = elem["name"]
     461                    dictelem["value"] = float(elem["value"])
     462                    res.append(dictelem)
     463                elif isinstance(elem["value"], str):
     464                    dictelem = {}
     465                    dictelem["name"]  = elem["name"]
     466                    dictelem["value"] = get_restfreq_in_Hz(elem["value"])
     467                    res.append(dictelem)
     468            else:
     469                mesg = "restfreq elements must be float, int, or string."
     470                raise Exception, mesg
     471        return res
     472    else:
     473        mesg = "wrong type of restfreq given."
     474        raise Exception, mesg
     475
     476def set_restfreq(s, restfreq):
     477    rfset = (restfreq != '') and (restfreq != [])
     478    if rfset:
     479        s.set_restfreqs(normalise_restfreq(restfreq))
    381480
    382481class scantable(Scantable):
     
    17661865        orig_doppler  = orig_coord[2]
    17671866       
    1768         if restfreq is None: restfreq = orig_restfreq_list
    1769         if frame    is None: frame    = orig_frame
    1770         if doppler  is None: doppler  = orig_doppler
    1771 
    1772         self.set_restfreqs(restfreq)
     1867        #if restfreq is None: restfreq = orig_restfreq_list
     1868        #self.set_restfreqs(restfreq)
     1869        if restfreq is not None:
     1870            set_restfreq(self, restfreq) #<----------------------
     1871
     1872        if frame is None: frame = orig_frame
    17731873        self.set_freqframe(frame)
     1874
     1875        if doppler is None: doppler = orig_doppler
    17741876        self.set_doppler(doppler)
    17751877       
     
    20422144       
    20432145        # restore original values
    2044         self.set_restfreqs(orig_restfreq_list)
     2146
     2147        if restfreq is not None:
     2148            #self.set_restfreqs(orig_restfreq_list)#<-- SHOULD BE set_restfreqs(normalise_restfreq(orig_restfreq))
     2149            set_restfreq(self, orig_restfreq_list)
    20452150        self.set_freqframe(orig_frame)
    20462151        self.set_doppler(orig_doppler)
Note: See TracChangeset for help on using the changeset viewer.