def test006(self): """Basic Test 006: fitting with double line profiles (spw='3', nfit=[2])""" tid = '006' for infile in self.infiles: infile_negative = self.outroot+tid+'.negative.ms' self._generateMSWithNegativeProfiles(infile, infile_negative) datacolumn = 'float_data' spw = '3' nfit = [2] fitfunc = infile.split('.')[0] print "testing " + fitfunc + " profile..." result = tsdfit(infile=infile_negative, datacolumn=datacolumn, spw=spw, nfit=nfit, fitfunc=fitfunc) shutil.rmtree(infile_negative) npol = 2 nrow = 1 answer = copy.deepcopy(self.answer3) self._generateAnswerForNegativeProfiles(answer) for key in result.keys(): self.assertEqual(len(result[key]), nrow*npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], sum(nfit), msg="%s has wrong value."%(key)) else: self.assertEqual(len(result[key][i]), sum(nfit), msg="%s element has wrong length."%(key)) for j in range(len(result[key][i])): thres = 3.0 if (key == "fwhm") and (i == 1) and (j == 0): thres = 18.0 result_lower = result[key][i][j][0] - thres * result[key][i][j][1] result_upper = result[key][i][j][0] + thres * result[key][i][j][1] #print infile="+infile+" --- "+"lower("+str(result_lower)+") - answer("+str(answer[key][i][j])+") - upper("+str(result_upper) +")" self.assertTrue(((result_lower <= answer[key][i][j]) and (answer[key][i][j] <= result_upper)), msg="row%s, comp%s result inconsistent with answer"%(i, j))
def test003(self): """Basic Test 003: fitting with double Gaussian (spw='3', nfit=[2])""" tid = '003' infile = self.infile outfile = self.outroot+tid+'.ms' datacolumn = 'float_data' spw = '3' nfit = [2] result = tsdfit(infile=infile, datacolumn=datacolumn, spw=spw, nfit=nfit) npol = 2 nrow = 1 answer = {'cent': [[2000.0, 6000.0], [3900.0, 4100.0]], 'peak': [[10.0, 10.0], [10.0, 5.0]], 'fwhm': [[100.0, 100.0], [20.0, 100.0]] } for key in result.keys(): self.assertEqual(len(result[key]), nrow*npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], sum(nfit), msg="%s has wrong value."%(key)) else: self.assertEqual(len(result[key][i]), sum(nfit), msg="%s element has wrong length."%(key)) for j in range(len(result[key][i])): result_lower = result[key][i][j][0] - 3.0 * result[key][i][j][1] result_upper = result[key][i][j][0] + 3.0 * result[key][i][j][1] #print "lower("+str(result_lower)+") - answer("+str(answer[key][i][j])+") - upper("+str(result_upper) +")" self.assertTrue(((result_lower <= answer[key][i][j]) and (answer[key][i][j] <= result_upper)), msg="row%s, comp%s result inconsistent with answer"%(i, j))
def test003(self): """Basic Test 003: fitting with double lines (spw='3', nfit=[2])""" tid = '003' for infile in self.infiles: datacolumn = 'float_data' spw = '3' nfit = [2] fitfunc = infile.split('.')[0] print "testing " + fitfunc + " profile..." result = tsdfit(infile=infile, datacolumn=datacolumn, spw=spw, nfit=nfit, fitfunc=fitfunc) npol = 2 nrow = 1 answer = self.answer3 for key in result.keys(): self.assertEqual(len(result[key]), nrow*npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], sum(nfit), msg="%s has wrong value."%(key)) else: self.assertEqual(len(result[key][i]), sum(nfit), msg="%s element has wrong length."%(key)) for j in range(len(result[key][i])): result_lower = result[key][i][j][0] - 3.0 * result[key][i][j][1] result_upper = result[key][i][j][0] + 3.0 * result[key][i][j][1] #print "infile="+infile+" --- "+"lower("+str(result_lower)+") - answer("+str(answer[key][i][j])+") - upper("+str(result_upper) +")" self.assertTrue(((result_lower <= answer[key][i][j]) and (answer[key][i][j] <= result_upper)), msg="row%s, comp%s result inconsistent with answer"%(i, j))
def test001(self): """Basic Test 001: fitting with single Gaussian (spw='0,1,2', nfit=[1])""" tid = '001' infile = self.infile outfile = self.outroot + tid + '.ms' datacolumn = 'float_data' spw = '0,1,2' nfit = [1] result = tsdfit(infile=infile, datacolumn=datacolumn, spw=spw, nfit=nfit) npol = 2 nrow = len(spw.split(',')) answer = { 'cent': [[4000.0], [5000.0], [3000.0], [2000.0], [4500.0], [5500.0]], 'peak': [[10.0], [10.0], [10.0], [10.0], [10.0], [10.0]], 'fwhm': [[500.0], [100.0], [20.0], [4.0], [100.0], [20.0]] } for key in result.keys(): self.assertEqual(len(result[key]), nrow * npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], nfit[0], msg="%s has wrong value." % (key)) else: self.assertEqual(len(result[key][i]), nfit[0], msg="%s element has wrong length." % (key)) for j in range(len(result[key][i])): result_lower = result[key][i][j][ 0] - 3.0 * result[key][i][j][1] result_upper = result[key][i][j][ 0] + 3.0 * result[key][i][j][1] #print "lower("+str(result_lower)+") - answer("+str(answer[key][i][j])+") - upper("+str(result_upper) +")" self.assertTrue( ((result_lower <= answer[key][i][j]) and (answer[key][i][j] <= result_upper)), msg="row%s, comp%s result inconsistent with answer" % (i, j))
def test002(self): """Basic Test 002: fitting with double fitrange (spw='3', nfit=[1,1])""" tid = '002' infile = self.infile outfile = self.outroot + tid + '.ms' datacolumn = 'float_data' spw = '3:0~4000;4001~8191' nfit = [1, 1] result = tsdfit(infile=infile, datacolumn=datacolumn, spw=spw, nfit=nfit) npol = 2 nrow = 1 answer = { 'cent': [[2000.0, 6000.0], [3900.0, 4100.0]], 'peak': [[10.0, 10.0], [10.0, 5.0]], 'fwhm': [[100.0, 100.0], [20.0, 100.0]] } for key in result.keys(): self.assertEqual(len(result[key]), nrow * npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], sum(nfit), msg="%s has wrong value." % (key)) else: self.assertEqual(len(result[key][i]), sum(nfit), msg="%s element has wrong length." % (key)) for j in range(len(result[key][i])): result_lower = result[key][i][j][ 0] - 3.0 * result[key][i][j][1] result_upper = result[key][i][j][ 0] + 3.0 * result[key][i][j][1] #print "lower("+str(result_lower)+") - answer("+str(answer[key][i][j])+") - upper("+str(result_upper) +")" self.assertTrue( ((result_lower <= answer[key][i][j]) and (answer[key][i][j] <= result_upper)), msg="row%s, comp%s result inconsistent with answer" % (i, j))
def test000(self): """Basic Test 000: default values for all parameters (nfit=[0] : no fitting)""" tid = '000' for infile in self.infiles: datacolumn = 'float_data' result = tsdfit(infile=infile, datacolumn=datacolumn) npol = 2 with tbmanager(infile) as tb: nrow = tb.nrows() for key in result.keys(): self.assertEqual(len(result[key]), nrow*npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], 0, msg="%s has wrong value."%(key)) else: self.assertEqual(result[key][i], [], msg="%s has wrong value."%(key))
def run_test(self, is_center, reference=None, **kwarg): param = dict(**self.common_param) param.update(kwarg) fit_val = tsdfit(**param) #print("Return:",fit_val) if reference is None: reference = self.get_reference_from_base(is_center) #print("Reference:",reference) for irow in range(len(fit_val['nfit'])): # test the number of detected lines self.assertEqual(fit_val['nfit'][irow], reference['nfit'][irow], "The number of lines in row %d differ: %d (expected: %d)" % (irow, fit_val['nfit'][irow], reference['nfit'][irow])) nline = fit_val['nfit'][irow] for key in fit_val.keys(): if key=='nfit': continue for iline in range(nline): test = fit_val[key][irow][iline] ref = reference[key][irow][iline][0] self.assertTrue(numpy.allclose(test, ref, rtol=1.e2), "%s in row %d line %d differs" % (key, irow, iline))
def test000(self): """Basic Test 000: default values for all parameters (nfit=[0] : no fitting)""" tid = '000' infile = self.infile outfile = self.outroot + tid + '.ms' datacolumn = 'float_data' result = tsdfit(infile=infile, datacolumn=datacolumn) npol = 2 with tbmanager(infile) as tb: nrow = tb.nrows() for key in result.keys(): self.assertEqual(len(result[key]), nrow * npol, msg="The result data has wrong data length") for i in range(len(result[key])): if (key == "nfit"): self.assertEqual(result[key][i], 0, msg="%s has wrong value." % (key)) else: self.assertEqual(result[key][i], [], msg="%s has wrong value." % (key))
def run_test(self, sel_param, datacolumn): inparams = self._get_selection_string(sel_param) inparams.update(self.common_param) fit_val = tsdfit(datacolumn=datacolumn, **inparams) self._test_result(fit_val, sel_param, datacolumn)