Changeset 1446 for branches/alma/python/scantable.py
- Timestamp:
- 11/12/08 17:04:01 (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/alma/python/scantable.py
r1401 r1446 300 300 self._setselection(selection) 301 301 302 def get_row(self, row=0, insitu=None): 303 """ 304 Select a row in the scantable. 305 Return a scantable with single row. 306 Parameters: 307 row: row no of integration, default is 0. 308 insitu: if False a new scantable is returned. 309 Otherwise, the scaling is done in-situ 310 The default is taken from .asaprc (False) 311 """ 312 if insitu is None: insitu = rcParams['insitu'] 313 if not insitu: 314 workscan = self.copy() 315 else: 316 workscan = self 317 # Select a row 318 sel=selector() 319 sel.set_scans([workscan.getscan(row)]) 320 sel.set_cycles([workscan.getcycle(row)]) 321 sel.set_beams([workscan.getbeam(row)]) 322 sel.set_ifs([workscan.getif(row)]) 323 sel.set_polarisations([workscan.getpol(row)]) 324 sel.set_name(workscan._getsourcename(row)) 325 workscan.set_selection(sel) 326 if not workscan.nrow() == 1: 327 msg = "Cloud not identify single row. %d rows selected."%(workscan.nrow()) 328 raise RuntimeError(msg) 329 del sel 330 if insitu: 331 self._assign(workscan) 332 else: 333 return workscan 334 302 335 def stats(self, stat='stddev', mask=None): 303 336 """ … … 528 561 return self._get_column(self._getdirectionvec, row) 529 562 530 531 563 def set_unit(self, unit='channel'): 532 564 """ … … 768 800 return msk 769 801 770 def get_restfreqs(self): 802 def get_masklist(self, mask=None, row=0): 803 """ 804 Compute and return a list of mask windows, [min, max]. 805 Parameters: 806 mask: channel mask, created with create_mask. 807 row: calcutate the masklist using the specified row 808 for unit conversions, default is row=0 809 only necessary if frequency varies over rows. 810 Returns: 811 [min, max], [min2, max2], ... 812 Pairs of start/end points (inclusive)specifying 813 the masked regions 814 """ 815 if not (isinstance(mask,list) or isinstance(mask, tuple)): 816 raise TypeError("The mask should be list or tuple.") 817 if len(mask) < 2: 818 raise TypeError("The mask elements should be > 1") 819 if self.nchan() != len(mask): 820 msg = "Number of channels in scantable != number of mask elements" 821 raise TypeError(msg) 822 data = self._getabcissa(row) 823 u = self._getcoordinfo()[0] 824 if rcParams['verbose']: 825 if u == "": u = "channel" 826 msg = "The current mask window unit is %s" % u 827 i = self._check_ifs() 828 if not i: 829 msg += "\nThis mask is only valid for IF=%d" % (self.getif(i)) 830 asaplog.push(msg) 831 masklist=[] 832 ist, ien = None, None 833 ist, ien=self.get_mask_indices(mask) 834 if ist is not None and ien is not None: 835 for i in xrange(len(ist)): 836 range=[data[ist[i]],data[ien[i]]] 837 range.sort() 838 masklist.append([range[0],range[1]]) 839 return masklist 840 841 def get_mask_indices(self, mask=None): 842 """ 843 Compute and Return lists of mask start indices and mask end indices. 844 Parameters: 845 mask: channel mask, created with create_mask. 846 Returns: 847 List of mask start indices and that of mask end indices, 848 i.e., [istart1,istart2,....], [iend1,iend2,....]. 849 """ 850 if not (isinstance(mask,list) or isinstance(mask, tuple)): 851 raise TypeError("The mask should be list or tuple.") 852 if len(mask) < 2: 853 raise TypeError("The mask elements should be > 1") 854 istart=[] 855 iend=[] 856 if mask[0]: istart.append(0) 857 for i in range(len(mask)-1): 858 if not mask[i] and mask[i+1]: 859 istart.append(i+1) 860 elif mask[i] and not mask[i+1]: 861 iend.append(i) 862 if mask[len(mask)-1]: iend.append(len(mask)-1) 863 if len(istart) != len(iend): 864 raise RuntimeError("Numbers of mask start != mask end.") 865 for i in range(len(istart)): 866 if istart[i] > iend[i]: 867 raise RuntimeError("Mask start index > mask end index") 868 break 869 return istart,iend 870 871 # def get_restfreqs(self): 872 # """ 873 # Get the restfrequency(s) stored in this scantable. 874 # The return value(s) are always of unit 'Hz' 875 # Parameters: 876 # none 877 # Returns: 878 # a list of doubles 879 # """ 880 # return list(self._getrestfreqs()) 881 882 def get_restfreqs(self, ids=None): 771 883 """ 772 884 Get the restfrequency(s) stored in this scantable. 773 885 The return value(s) are always of unit 'Hz' 774 886 Parameters: 775 none 887 ids: (optional) a list of MOLECULE_ID for that restfrequency(s) to 888 be retrieved 776 889 Returns: 777 a list of doubles 778 """ 779 return list(self._getrestfreqs()) 780 890 dictionary containing ids and a list of doubles for each id 891 """ 892 if ids is None: 893 rfreqs={} 894 idlist = self.getmolnos() 895 for i in idlist: 896 rfreqs[i]=list(self._getrestfreqs(i)) 897 return rfreqs 898 else: 899 if type(ids)==list or type(ids)==tuple: 900 rfreqs={} 901 for i in ids: 902 rfreqs[i]=list(self._getrestfreqs(i)) 903 return rfreqs 904 else: 905 return list(self._getrestfreqs(ids)) 906 #return list(self._getrestfreqs(ids)) 781 907 782 908 def set_restfreqs(self, freqs=None, unit='Hz'): 783 909 """ 910 ********NEED TO BE UPDATED begin************ 784 911 Set or replace the restfrequency specified and 785 912 If the 'freqs' argument holds a scalar, … … 793 920 E.g. 'freqs=[1e9, 2e9]' would mean IF 0 gets restfreq 1e9 and 794 921 IF 1 gets restfreq 2e9. 922 ********NEED TO BE UPDATED end************ 795 923 You can also specify the frequencies via a linecatalog/ 796 924 … … 800 928 801 929 Example: 802 # set the given restfrequency for the whole table930 # set the given restfrequency for the all currently selected IFs 803 931 scan.set_restfreqs(freqs=1.4e9) 804 # If thee number of IFs in the data is >= 2 IF0 gets the first 805 # value IF1 the second... 806 scan.set_restfreqs(freqs=[1.4e9, 1.67e9]) 932 # set multiple restfrequencies to all the selected data 933 scan.set_restfreqs(freqs=[1.4e9, 1.41e9, 1.42e9]) 934 # If the number of IFs in the data is >= 2 the IF0 gets the first 935 # value IF1 the second... NOTE that freqs needs to be 936 # specified in list of list (e.g. [[],[],...] ). 937 scan.set_restfreqs(freqs=[[1.4e9],[1.67e9]]) 807 938 #set the given restfrequency for the whole table (by name) 808 939 scan.set_restfreqs(freqs="OH1667") … … 824 955 # simple value 825 956 if isinstance(freqs, int) or isinstance(freqs, float): 826 self._setrestfreqs(freqs, "",unit) 957 # TT mod 958 #self._setrestfreqs(freqs, "",unit) 959 self._setrestfreqs([freqs], [""],unit) 827 960 # list of values 828 961 elif isinstance(freqs, list) or isinstance(freqs, tuple): 829 962 # list values are scalars 830 963 if isinstance(freqs[-1], int) or isinstance(freqs[-1], float): 964 self._setrestfreqs(freqs, [""],unit) 965 # list values are tuples, (value, name) 966 elif isinstance(freqs[-1], dict): 967 #sel = selector() 968 #savesel = self._getselection() 969 #iflist = self.getifnos() 970 #for i in xrange(len(freqs)): 971 # sel.set_ifs(iflist[i]) 972 # self._setselection(sel) 973 # self._setrestfreqs(freqs[i], "",unit) 974 #self._setselection(savesel) 975 self._setrestfreqs(freqs["value"], 976 freqs["name"], "MHz") 977 elif isinstance(freqs[-1], list) or isinstance(freqs[-1], tuple): 831 978 sel = selector() 832 979 savesel = self._getselection() 833 980 iflist = self.getifnos() 834 for i in xrange(len(freqs)): 835 sel.set_ifs(iflist[i]) 836 self._setselection(sel) 837 self._setrestfreqs(freqs[i], "",unit) 838 self._setselection(savesel) 839 # list values are tuples, (value, name) 840 elif isinstance(freqs[-1], dict): 841 sel = selector() 842 savesel = self._getselection() 843 iflist = self.getifnos() 981 if len(freqs)>len(iflist): 982 raise ValueError("number of elements in list of list exeeds the current IF selections") 844 983 for i in xrange(len(freqs)): 845 984 sel.set_ifs(iflist[i]) … … 852 991 sel = selector() 853 992 savesel = self._getselection() 854 iflist = self.getifnos()855 993 for i in xrange(freqs.nrow()): 856 994 sel.set_ifs(iflist[i]) … … 1254 1392 f = fitter() 1255 1393 f.set_scan(self, mask) 1256 #f.set_function(poly=order)1257 1394 if uselin: 1258 1395 f.set_function(lpoly=order) … … 1260 1397 f.set_function(poly=order) 1261 1398 s = f.auto_fit(insitu, plot=plot) 1399 # Save parameters of baseline fits as a class attribute. 1400 # NOTICE: It does not reflect changes in scantable! 1401 self.blpars = f.blpars 1262 1402 s._add_history("poly_baseline", varlist) 1263 1403 print_log() … … 1355 1495 1356 1496 rows = range(workscan.nrow()) 1497 # Save parameters of baseline fits & masklists as a class attribute. 1498 # NOTICE: It does not reflect changes in scantable! 1499 if len(rows) > 0: 1500 self.blpars=[] 1501 self.masklists=[] 1357 1502 asaplog.push("Processing:") 1358 1503 for r in rows: … … 1371 1516 # setup line finder 1372 1517 fl.find_lines(r, mask, curedge) 1518 outmask=fl.get_mask() 1373 1519 f.set_scan(workscan, fl.get_mask()) 1374 1520 f.x = workscan._getabcissa(r) … … 1376 1522 f.data = None 1377 1523 f.fit() 1378 x = f.get_parameters() 1524 1525 # Show mask list 1526 masklist=workscan.get_masklist(fl.get_mask(),row=r) 1527 msg = "mask range: "+str(masklist) 1528 asaplog.push(msg, False) 1529 1530 fpar = f.get_parameters() 1379 1531 if plot: 1380 1532 f.plot(residual=True) 1381 1533 x = raw_input("Accept fit ( [y]/n ): ") 1382 1534 if x.upper() == 'N': 1535 self.blpars.append(None) 1536 self.masklists.append(None) 1383 1537 continue 1384 1538 workscan._setspectrum(f.fitter.getresidual(), r) 1539 self.blpars.append(fpar) 1540 self.masklists.append(masklist) 1385 1541 if plot: 1386 1542 f._p.unmap() … … 1773 1929 if unit is not None: 1774 1930 self.set_fluxunit(unit) 1775 self.set_freqframe(rcParams['scantable.freqframe'])1776 1931 #self.set_freqframe(rcParams['scantable.freqframe']) 1932
Note: See TracChangeset
for help on using the changeset viewer.