Changeset 513 for trunk/python/scantable.py
- Timestamp:
- 02/28/05 15:28:33 (19 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/python/scantable.py
r497 r513 66 66 if average: 67 67 from asap._asap import average as _av 68 tmp = tuple([tbl])69 68 print 'Auto averaging integrations...' 70 tbl2 = _av( tmp,(),True,'none')69 tbl2 = _av((tbl,),(),True,'none') 71 70 sdtable.__init__(self,tbl2) 72 del r,tbl71 del tbl2 73 72 else: 74 73 sdtable.__init__(self,tbl) 74 del r,tbl 75 75 self._add_history("scantable", varlist) 76 76 … … 138 138 source name) in a new scantable. 139 139 Parameters: 140 scanid: a scanno or a source name 141 Example: 142 scan.get_scan('323p459') 143 # gets all scans containing the source '323p459' 140 scanid: a (list of) scanno or a source name, unix-style 141 patterns are accepted for source name matching, e.g. 142 '*_R' gets all 'ref scans 143 Example: 144 # get all scans containing the source '323p459' 145 newscan = scan.get_scan('323p459') 146 # get all 'off' scans 147 refscans = scan.get_scan('*_R') 148 # get a susbset of scans by scanno (as listed in scan.summary()) 149 newscan = scan.get_scan([0,2,7,10]) 144 150 """ 145 151 if scanid is None: … … 481 487 return an inverted mask, i.e. the regions 482 488 specified are EXCLUDED 489 row: create the mask using the specified row for 490 unit conversions, default is row=0 491 only necessary if frequency varies over rows. 483 492 Example: 484 493 scan.set_unit('channel') … … 495 504 496 505 """ 497 varlist = vars() 506 row = 0 507 if kwargs.has_key("row"): 508 row = kwargs.get("row") 509 data = self._getabcissa(row) 498 510 u = self._getcoordinfo()[0] 499 511 if self._vb: … … 501 513 print "The current mask window unit is", u 502 514 n = self.nchan() 503 data = self._getabcissa()504 515 msk = zeros(n) 505 516 for window in args: … … 513 524 if kwargs.get('invert'): 514 525 from numarray import logical_not 515 msk = logical_not(msk) 516 self._add_history("create_mask", varlist) 526 msk = logical_not(msk) 517 527 return msk 518 528 … … 730 740 return 731 741 742 # 743 # Maths business 744 # 745 746 def average_time(self, mask=None, scanav=True, weight=None): 747 """ 748 Return the (time) average of a scan, or apply it 'insitu'. 749 Note: 750 in channels only 751 The cursor of the output scan is set to 0. 752 Parameters: 753 one scan or comma separated scans 754 mask: an optional mask (only used for 'var' and 'tsys' 755 weighting) 756 scanav: True (default) averages each scan separately 757 False averages all scans together, 758 weight: Weighting scheme. 'none' (default), 'var' (variance 759 weighted), 'tsys' 760 761 Example: 762 # time average the scantable without using a mask 763 newscan = scan.average_time() 764 """ 765 varlist = vars() 766 if weight is None: weight = 'none' 767 if mask is None: mask = () 768 from asap._asap import average as _av 769 s = scantable(_av((self,), mask, scanav, weight)) 770 s._add_history("average_time",varlist) 771 return s 772 773 def convert_flux(self, jyperk=None, eta=None, d=None, insitu=None, 774 allaxes=None): 775 """ 776 Return a scan where all spectra are converted to either 777 Jansky or Kelvin depending upon the flux units of the scan table. 778 By default the function tries to look the values up internally. 779 If it can't find them (or if you want to over-ride), you must 780 specify EITHER jyperk OR eta (and D which it will try to look up 781 also if you don't set it). jyperk takes precedence if you set both. 782 Parameters: 783 jyperk: the Jy / K conversion factor 784 eta: the aperture efficiency 785 d: the geomtric diameter (metres) 786 insitu: if False a new scantable is returned. 787 Otherwise, the scaling is done in-situ 788 The default is taken from .asaprc (False) 789 allaxes: if True apply to all spectra. Otherwise 790 apply only to the selected (beam/pol/if)spectra only 791 The default is taken from .asaprc (True if none) 792 """ 793 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 794 if insitu is None: insitu = rcParams['insitu'] 795 varlist = vars() 796 if jyperk is None: jyperk = -1.0 797 if d is None: d = -1.0 798 if eta is None: eta = -1.0 799 if not insitu: 800 from asap._asap import convertflux as _convert 801 s = scantable(_convert(self, d, eta, jyperk, allaxes)) 802 s._add_history("convert_flux", varlist) 803 return s 804 else: 805 from asap._asap import convertflux_insitu as _convert 806 _convert(self, d, eta, jyperk, allaxes) 807 self._add_history("convert_flux", varlist) 808 return 809 810 def gain_el(self, poly=None, filename="", method="linear", 811 insitu=None, allaxes=None): 812 """ 813 Return a scan after applying a gain-elevation correction. 814 The correction can be made via either a polynomial or a 815 table-based interpolation (and extrapolation if necessary). 816 You specify polynomial coefficients, an ascii table or neither. 817 If you specify neither, then a polynomial correction will be made 818 with built in coefficients known for certain telescopes (an error 819 will occur if the instrument is not known). 820 The data and Tsys are *divided* by the scaling factors. 821 Parameters: 822 poly: Polynomial coefficients (default None) to compute a 823 gain-elevation correction as a function of 824 elevation (in degrees). 825 filename: The name of an ascii file holding correction factors. 826 The first row of the ascii file must give the column 827 names and these MUST include columns 828 "ELEVATION" (degrees) and "FACTOR" (multiply data 829 by this) somewhere. 830 The second row must give the data type of the 831 column. Use 'R' for Real and 'I' for Integer. 832 An example file would be 833 (actual factors are arbitrary) : 834 835 TIME ELEVATION FACTOR 836 R R R 837 0.1 0 0.8 838 0.2 20 0.85 839 0.3 40 0.9 840 0.4 60 0.85 841 0.5 80 0.8 842 0.6 90 0.75 843 method: Interpolation method when correcting from a table. 844 Values are "nearest", "linear" (default), "cubic" 845 and "spline" 846 insitu: if False a new scantable is returned. 847 Otherwise, the scaling is done in-situ 848 The default is taken from .asaprc (False) 849 allaxes: If True apply to all spectra. Otherwise 850 apply only to the selected (beam/pol/if) spectra only 851 The default is taken from .asaprc (True if none) 852 """ 853 854 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 855 if insitu is None: insitu = rcParams['insitu'] 856 varlist = vars() 857 if poly is None: 858 poly = () 859 from os.path import expandvars 860 filename = expandvars(filename) 861 if not insitu: 862 from asap._asap import gainel as _gainEl 863 s = scantable(_gainEl(self, poly, filename, method, allaxes)) 864 s._add_history("gain_el", varlist) 865 return s 866 else: 867 from asap._asap import gainel_insitu as _gainEl 868 _gainEl(self, poly, filename, method, allaxes) 869 self._add_history("gain_el", varlist) 870 return 871 872 def freq_align(self, reftime=None, method='cubic', perif=False, 873 insitu=None): 874 """ 875 Return a scan where all rows have been aligned in frequency/velocity. 876 The alignment frequency frame (e.g. LSRK) is that set by function 877 set_freqframe. 878 Parameters: 879 reftime: reference time to align at. By default, the time of 880 the first row of data is used. 881 method: Interpolation method for regridding the spectra. 882 Choose from "nearest", "linear", "cubic" (default) 883 and "spline" 884 perif: Generate aligners per freqID (no doppler tracking) or 885 per IF (scan-based doppler tracking) 886 insitu: if False a new scantable is returned. 887 Otherwise, the scaling is done in-situ 888 The default is taken from .asaprc (False) 889 """ 890 if insitu is None: insitu = rcParams['insitu'] 891 varlist = vars() 892 if reftime is None: reftime = '' 893 perfreqid = not perif 894 if not insitu: 895 from asap._asap import freq_align as _align 896 s = scantable(_align(self, reftime, method, perfreqid)) 897 s._add_history("freq_align", varlist) 898 return s 899 else: 900 from asap._asap import freq_align_insitu as _align 901 _align(self, reftime, method, perfreqid) 902 self._add_history("freq_align", varlist) 903 return 904 905 def opacity(self, tau, insitu=None, allaxes=None): 906 """ 907 Apply an opacity correction. The data 908 and Tsys are multiplied by the correction factor. 909 Parameters: 910 tau: Opacity from which the correction factor is 911 exp(tau*ZD) 912 where ZD is the zenith-distance 913 insitu: if False a new scantable is returned. 914 Otherwise, the scaling is done in-situ 915 The default is taken from .asaprc (False) 916 allaxes: if True apply to all spectra. Otherwise 917 apply only to the selected (beam/pol/if)spectra only 918 The default is taken from .asaprc (True if none) 919 """ 920 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 921 if insitu is None: insitu = rcParams['insitu'] 922 varlist = vars() 923 if not insitu: 924 from asap._asap import opacity as _opacity 925 s = scantable(_opacity(self, tau, allaxes)) 926 s._add_history("opacity", varlist) 927 return s 928 else: 929 from asap._asap import opacity_insitu as _opacity 930 _opacity(self, tau, allaxes) 931 self._add_history("opacity", varlist) 932 return 933 934 def bin(self, width=5, insitu=None): 935 """ 936 Return a scan where all spectra have been binned up. 937 width: The bin width (default=5) in pixels 938 insitu: if False a new scantable is returned. 939 Otherwise, the scaling is done in-situ 940 The default is taken from .asaprc (False) 941 """ 942 if insitu is None: insitu = rcParams['insitu'] 943 varlist = vars() 944 if not insitu: 945 from asap._asap import bin as _bin 946 s = scantable(_bin(self, width)) 947 s._add_history("bin",varlist) 948 return s 949 else: 950 from asap._asap import bin_insitu as _bin 951 _bin(self, width) 952 self._add_history("bin",varlist) 953 return 954 955 956 def resample(self, width=5, method='cubic', insitu=None): 957 """ 958 Return a scan where all spectra have been binned up 959 width: The bin width (default=5) in pixels 960 method: Interpolation method when correcting from a table. 961 Values are "nearest", "linear", "cubic" (default) 962 and "spline" 963 insitu: if False a new scantable is returned. 964 Otherwise, the scaling is done in-situ 965 The default is taken from .asaprc (False) 966 """ 967 if insitu is None: insitu = rcParams['insitu'] 968 varlist = vars() 969 if not insitu: 970 from asap._asap import resample as _resample 971 s = scantable(_resample(self, method, width)) 972 s._add_history("resample",varlist) 973 return s 974 else: 975 from asap._asap import resample_insitu as _resample 976 _resample(self, method, width) 977 self._add_history("resample",varlist) 978 return 979 980 def average_pol(self, mask=None, weight='none', insitu=None): 981 """ 982 Average the Polarisations together. 983 The polarisation cursor of the output scan is set to 0 984 Parameters: 985 scan: The scantable 986 mask: An optional mask defining the region, where the 987 averaging will be applied. The output will have all 988 specified points masked. 989 weight: Weighting scheme. 'none' (default), or 990 'var' (variance weighted) 991 insitu: if False a new scantable is returned. 992 Otherwise, the scaling is done in-situ 993 The default is taken from .asaprc (False) 994 Example: 995 polav = average_pols(myscan) 996 """ 997 if insitu is None: insitu = rcParams['insitu'] 998 varlist = vars() 999 1000 if mask is None: 1001 mask = () 1002 if not insitu: 1003 from asap._asap import averagepol as _avpol 1004 s = scantable(_avpol(self, mask, weight)) 1005 s._add_history("average_pol",varlist) 1006 return s 1007 else: 1008 from asap._asap import averagepol_insitu as _avpol 1009 _avpol(self, mask, weight) 1010 self._add_history("average_pol",varlist) 1011 return 1012 1013 def smooth(self, kernel="hanning", width=5.0, insitu=None, allaxes=None): 1014 """ 1015 Smooth the spectrum by the specified kernel (conserving flux). 1016 Parameters: 1017 scan: The input scan 1018 kernel: The type of smoothing kernel. Select from 1019 'hanning' (default), 'gaussian' and 'boxcar'. 1020 The first three characters are sufficient. 1021 width: The width of the kernel in pixels. For hanning this is 1022 ignored otherwise it defauls to 5 pixels. 1023 For 'gaussian' it is the Full Width Half 1024 Maximum. For 'boxcar' it is the full width. 1025 insitu: if False a new scantable is returned. 1026 Otherwise, the scaling is done in-situ 1027 The default is taken from .asaprc (False) 1028 allaxes: If True (default) apply to all spectra. Otherwise 1029 apply only to the selected (beam/pol/if)spectra only 1030 The default is taken from .asaprc (True if none) 1031 Example: 1032 none 1033 """ 1034 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 1035 if insitu is None: insitu = rcParams['insitu'] 1036 varlist = vars() 1037 if not insitu: 1038 from asap._asap import smooth as _smooth 1039 s = scantable(_smooth(self,kernel,width,allaxes)) 1040 s._add_history("smooth", varlist) 1041 return s 1042 else: 1043 from asap._asap import smooth_insitu as _smooth 1044 _smooth(self,kernel,width,allaxes) 1045 self._add_history("smooth", varlist) 1046 return 1047 1048 def poly_baseline(self, mask=None, order=0, insitu=None): 1049 """ 1050 Return a scan which has been baselined (all rows) by a polynomial. 1051 Parameters: 1052 scan: a scantable 1053 mask: an optional mask 1054 order: the order of the polynomial (default is 0) 1055 insitu: if False a new scantable is returned. 1056 Otherwise, the scaling is done in-situ 1057 The default is taken from .asaprc (False) 1058 Example: 1059 # return a scan baselined by a third order polynomial, 1060 # not using a mask 1061 bscan = scan.poly_baseline(order=3) 1062 """ 1063 if insitu is None: insitu = rcParams['insitu'] 1064 varlist = vars() 1065 if mask is None: 1066 from numarray import ones 1067 mask = list(ones(scan.nchan())) 1068 from asap.asapfitter import fitter 1069 f = fitter() 1070 f._verbose(True) 1071 f.set_scan(self, mask) 1072 f.set_function(poly=order) 1073 sf = f.auto_fit(insitu) 1074 if insitu: 1075 self._add_history("poly_baseline", varlist) 1076 return 1077 else: 1078 sf._add_history("poly_baseline", varlist) 1079 return sf 1080 1081 def auto_poly_baseline(self, mask=None, edge=(0,0), order=0, 1082 threshold=3,insitu=None): 1083 """ 1084 Return a scan which has been baselined (all rows) by a polynomial. 1085 Spectral lines are detected first using linefinder and masked out 1086 to avoid them affecting the baseline solution. 1087 1088 Parameters: 1089 scan: a scantable 1090 mask: an optional mask retreived from scantable 1091 edge: an optional number of channel to drop at 1092 the edge of spectrum. If only one value is 1093 specified, the same number will be dropped from 1094 both sides of the spectrum. Default is to keep 1095 all channels 1096 order: the order of the polynomial (default is 0) 1097 threshold: the threshold used by line finder. It is better to 1098 keep it large as only strong lines affect the 1099 baseline solution. 1100 insitu: if False a new scantable is returned. 1101 Otherwise, the scaling is done in-situ 1102 The default is taken from .asaprc (False) 1103 1104 Example: 1105 sc2=auto_poly_baseline(order=7) 1106 """ 1107 if insitu is None: insitu = rcParams['insitu'] 1108 varlist = vars() 1109 from asap.asapfitter import fitter 1110 from asap.asaplinefind import linefinder 1111 from asap import _is_sequence_or_number as _is_valid 1112 1113 if not _is_valid(edge, int): 1114 print "Parameter 'edge' as to be an integer or a pair of integers" 1115 return 1116 1117 # setup fitter 1118 f = fitter() 1119 f._verbose(True) 1120 f.set_function(poly=order) 1121 1122 # setup line finder 1123 fl=linefinder() 1124 fl.set_options(threshold=threshold) 1125 1126 if not insitu: 1127 workscan=self.copy() 1128 else: 1129 workscan=self 1130 1131 vb=workscan._vb 1132 # remember the verbose parameter and selection 1133 workscan._vb=False 1134 sel=workscan.get_cursor() 1135 rows=range(workscan.nrow()) 1136 for i in range(workscan.nbeam()): 1137 workscan.setbeam(i) 1138 for j in range(workscan.nif()): 1139 workscan.setif(j) 1140 for k in range(workscan.npol()): 1141 workscan.setpol(k) 1142 if f._vb: 1143 print "Processing:" 1144 print 'Beam[%d], IF[%d], Pol[%d]' % (i,j,k) 1145 for iRow in rows: 1146 fl.set_scan(workscan,mask,edge) 1147 fl.find_lines(iRow) 1148 f.set_scan(workscan, fl.get_mask()) 1149 f.x=workscan._getabcissa(iRow) 1150 f.y=workscan._getspectrum(iRow) 1151 f.data=None 1152 f.fit() 1153 x=f.get_parameters() 1154 workscan._setspectrum(f.fitter.getresidual(),iRow) 1155 workscan.set_cursor(sel[0],sel[1],sel[2]) 1156 workscan._vb = vb 1157 if not insitu: 1158 return workscan 1159 1160 def rotate_linpolphase(self, angle, allaxes=None): 1161 """ 1162 Rotate the phase of the complex polarization O=Q+iU correlation. 1163 This is always done in situ in the raw data. So if you call this 1164 function more than once then each call rotates the phase further. 1165 Parameters: 1166 angle: The angle (degrees) to rotate (add) by. 1167 allaxes: If True apply to all spectra. Otherwise 1168 apply only to the selected (beam/pol/if)spectra only. 1169 The default is taken from .asaprc (True if none) 1170 Examples: 1171 scan.rotate_linpolphase(2.3) 1172 """ 1173 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 1174 varlist = vars() 1175 from asap._asap import _rotate_linpolphase as _rotate 1176 _rotate(self, angle, allaxes) 1177 self._add_history("rotate_linpolphase", varlist) 1178 return 1179 1180 1181 def rotate_xyphase(self, angle, allaxes=None): 1182 """ 1183 Rotate the phase of the XY correlation. This is always done in situ 1184 in the data. So if you call this function more than once 1185 then each call rotates the phase further. 1186 Parameters: 1187 angle: The angle (degrees) to rotate (add) by. 1188 allaxes: If True apply to all spectra. Otherwise 1189 apply only to the selected (beam/pol/if)spectra only. 1190 The default is taken from .asaprc (True if none) 1191 Examples: 1192 scan.rotate_xyphase(2.3) 1193 """ 1194 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 1195 varlist = vars() 1196 from asap._asap import rotate_xyphase as _rotate_xyphase 1197 _rotate_xyphase(self, angle, allaxes) 1198 self._add_history("rotate_xyphase", varlist) 1199 return 1200 1201 1202 def add(self, offset, insitu=None, allaxes=None): 1203 """ 1204 Return a scan where all spectra have the offset added 1205 Parameters: 1206 offset: the offset 1207 insitu: if False a new scantable is returned. 1208 Otherwise, the scaling is done in-situ 1209 The default is taken from .asaprc (False) 1210 allaxes: if True apply to all spectra. Otherwise 1211 apply only to the selected (beam/pol/if)spectra only 1212 The default is taken from .asaprc (True if none) 1213 """ 1214 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 1215 if insitu is None: insitu = rcParams['insitu'] 1216 varlist = vars() 1217 if not insitu: 1218 from asap._asap import add as _add 1219 s = scantable(_add(self, offset, allaxes)) 1220 s._add_history("add",varlist) 1221 return s 1222 else: 1223 from asap._asap import add_insitu as _add 1224 _add(self, offset, allaxes) 1225 self._add_history("add",varlist) 1226 return 1227 1228 def scale(self, factor, insitu=None, allaxes=None, tsys=True): 1229 """ 1230 Return a scan where all spectra are scaled by the give 'factor' 1231 Parameters: 1232 factor: the scaling factor 1233 insitu: if False a new scantable is returned. 1234 Otherwise, the scaling is done in-situ 1235 The default is taken from .asaprc (False) 1236 allaxes: if True apply to all spectra. Otherwise 1237 apply only to the selected (beam/pol/if)spectra only. 1238 The default is taken from .asaprc (True if none) 1239 tsys: if True (default) then apply the operation to Tsys 1240 as well as the data 1241 """ 1242 if allaxes is None: allaxes = rcParams['scantable.allaxes'] 1243 if insitu is None: insitu = rcParams['insitu'] 1244 varlist = vars() 1245 if not insitu: 1246 from asap._asap import scale as _scale 1247 s = scantable(_scale(self, factor, allaxes, tsys)) 1248 s._add_history("scale",varlist) 1249 return s 1250 else: 1251 from asap._asap import scale_insitu as _scale 1252 _scale(self, factor, allaxes, tsys) 1253 self._add_history("scale",varlist) 1254 return 1255 1256 1257 def quotient(self, other, isreference=True, preserve=True): 1258 """ 1259 Return the quotient of a 'source' (signal) scan and a 'reference' scan. 1260 The reference can have just one row, even if the signal has many. 1261 Otherwise they must have the same number of rows. 1262 The cursor of the output scan is set to 0 1263 Parameters: 1264 source: the 'other' scan 1265 isreference: if the 'other' scan is the reference (default) 1266 or source 1267 preserve: you can preserve (default) the continuum or 1268 remove it. The equations used are 1269 preserve - Output = Tref * (sig/ref) - Tref 1270 remove - Output = Tref * (sig/ref) - Tsig 1271 Example: 1272 # src is a scantable for an 'on' scan, ref for an 'off' scantable 1273 q1 = src.quotient(ref) 1274 q2 = ref.quotient(src, isreference=False) 1275 # gives the same result 1276 """ 1277 from asap._asap import quotient as _quot 1278 if isreference: 1279 return scantable(_quot(self, other, preserve)) 1280 else: 1281 return scantable(_quot(other, self, preserve)) 1282 1283 def __add__(self, other): 1284 varlist = vars() 1285 s = None 1286 if isinstance(other, scantable): 1287 from asap._asap import b_operate as _bop 1288 s = scantable(_bop(self, other, 'add', True)) 1289 elif isinstance(other, float): 1290 from asap._asap import add as _add 1291 s = scantable(_add(self, other, True)) 1292 else: 1293 print "Other input is not a scantable or float value" 1294 return 1295 s._add_history("operator +", varlist) 1296 return s 1297 1298 1299 def __sub__(self, other): 1300 """ 1301 implicit on all axes and on Tsys 1302 """ 1303 varlist = vars() 1304 s = None 1305 if isinstance(other, scantable): 1306 from asap._asap import b_operate as _bop 1307 s = scantable(_bop(self, other, 'sub', True)) 1308 elif isinstance(other, float): 1309 from asap._asap import add as _add 1310 s = scantable(_add(self, -other, True)) 1311 else: 1312 print "Other input is not a scantable or float value" 1313 return 1314 s._add_history("operator -", varlist) 1315 return s 1316 1317 def __mul__(self, other): 1318 """ 1319 implicit on all axes and on Tsys 1320 """ 1321 varlist = vars() 1322 s = None 1323 if isinstance(other, scantable): 1324 from asap._asap import b_operate as _bop 1325 s = scantable(_bop(self, other, 'mul', True)) 1326 elif isinstance(other, float): 1327 if other == 0.0: 1328 print "Multiplying by zero is not recommended." 1329 return 1330 from asap._asap import scale as _sca 1331 s = scantable(_sca(self, other, True)) 1332 else: 1333 print "Other input is not a scantable or float value" 1334 return 1335 s._add_history("operator *", varlist) 1336 return s 1337 1338 1339 def __div__(self, other): 1340 """ 1341 implicit on all axes and on Tsys 1342 """ 1343 varlist = vars() 1344 s = None 1345 if isinstance(other, scantable): 1346 from asap._asap import b_operate as _bop 1347 s = scantable(_bop(self, other, 'div', True)) 1348 elif isinstance(other, float): 1349 if other == 0.0: 1350 print "Dividing by zero is not recommended" 1351 return 1352 from asap._asap import scale as _sca 1353 s = scantable(_sca(self, 1.0/other, True)) 1354 else: 1355 print "Other input is not a scantable or float value" 1356 return 1357 s._add_history("operator /", varlist) 1358 return s 1359 732 1360 def _add_history(self, funcname, parameters): 733 1361 # create date … … 746 1374 hist += 'scantable' 747 1375 elif k2 == 'mask': 748 hist += str(self._zip_mask(v2)) 1376 if isinstance(v2,list) or isinstance(v2,tuple): 1377 hist += str(self._zip_mask(v2)) 1378 else: 1379 hist += str(v2) 749 1380 else: 750 hist += str(v2) 1381 hist += str(v2) 751 1382 else: 752 1383 hist += k … … 755 1386 hist += 'scantable' 756 1387 elif k == 'mask': 757 hist += str(self._zip_mask(v)) 1388 if isinstance(v,list) or isinstance(v,tuple): 1389 hist += str(self._zip_mask(v)) 1390 else: 1391 hist += str(v) 758 1392 else: 759 1393 hist += str(v) … … 774 1408 j = len(mask) 775 1409 segments.append([i,j]) 776 i = j 1410 i = j 777 1411 return segments
Note: See TracChangeset
for help on using the changeset viewer.