def test_probably_not_a_transient(self): """ No source at 250MHz, but we detect a source at 50MHz. Not necessarily a transient. Should trivially ignore 250MHz data when looking at a new 50MHz source. """ img_params = self.img_params img0 = img_params[0] # This time around, we just manually exclude the steady src from # the first image detections. steady_low_freq_src = MockSource( example_extractedsource_tuple(ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl'] ), lightcurve=defaultdict(lambda :self.always_detectable_flux) ) # Insert first image, no sources. tkp.db.Image(data=img_params[0],dataset=self.dataset) # Now set up second image. img1 = tkp.db.Image(data=img_params[1],dataset=self.dataset) xtr = steady_low_freq_src.simulate_extraction(img1, extraction_type='blind') insert_extracted_sources(img1._id, [xtr], 'blind') associate_extracted_sources(img1._id, deRuiter_r, self.new_source_sigma_margin) transients = get_newsources_for_dataset(self.dataset.id) # Should have no marked transients self.assertEqual(len(transients), 0)
def test_probably_not_a_transient(self): """ No source at 250MHz, but we detect a source at 50MHz. Not necessarily a transient. Should trivially ignore 250MHz data when looking at a new 50MHz source. """ img_params = self.img_params img0 = img_params[0] # This time around, we just manually exclude the steady src from # the first image detections. steady_low_freq_src = MockSource( example_extractedsource_tuple(ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl']), lightcurve=defaultdict(lambda: self.always_detectable_flux)) # Insert first image, no sources. tkp.db.Image(data=img_params[0], dataset=self.dataset) # Now set up second image. img1 = tkp.db.Image(data=img_params[1], dataset=self.dataset) xtr = steady_low_freq_src.simulate_extraction(img1, extraction_type='blind') insert_extracted_sources(img1._id, [xtr], 'blind') associate_extracted_sources(img1._id, deRuiter_r, self.new_source_sigma_margin) transients = get_newsources_for_dataset(self.dataset.id) # Should have no marked transients self.assertEqual(len(transients), 0)
def test_marginal_transient(self): """ ( flux1 > (rms_min0*(det0 + margin) ) but ( flux1 < (rms_max0*(det0 + margin) ) --> Possible transient If it was in a region of rms_min, we would (almost certainly) have seen it in the first image. So new source --> Possible transient. But if it was in a region of rms_max, then perhaps we would have missed it. In which case, new source --> Just seeing deeper. Note that if we are tiling overlapping images, then the first time a field is processed with image-centre at the edge of the old field, we may get a bunch of unhelpful 'possible transients'. Furthermore, this will pick up fluctuating sources near the image-margins even with a fixed field of view. But without a more complex store of image-rms-per-position, we cannot do better. Hopefully we can use a 'distance from centre' feature to separate out the good and bad candidates in this case. """ img_params = self.img_params #Must pick flux value carefully to fire correct logic branch: marginal_transient_flux = self.reliably_detected_at_image_centre_flux marginal_transient = MockSource( example_extractedsource_tuple(ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl']), lightcurve={img_params[1]['taustart_ts'] : marginal_transient_flux} ) #First, check that we've set up the test correctly: rms_min0 = img_params[0]['rms_min'] rms_max0 = img_params[0]['rms_max'] det0 = img_params[0]['detection_thresh'] self.assertTrue(marginal_transient_flux < rms_max0*(det0 + self.new_source_sigma_margin ) ) self.assertTrue(marginal_transient_flux > rms_min0*(det0 + self.new_source_sigma_margin ) ) for pars in self.img_params: img = tkp.db.Image(data=pars,dataset=self.dataset) xtr = marginal_transient.simulate_extraction(img, extraction_type='blind') if xtr is not None: img.insert_extracted_sources([xtr],'blind') img.associate_extracted_sources(deRuiter_r, self.new_source_sigma_margin) newsources = get_newsources_for_dataset(self.dataset.id) #Should have one 'possible' transient self.assertEqual(len(newsources),1) self.assertTrue( newsources[0]['low_thresh_sigma'] > self.new_source_sigma_margin) self.assertTrue( newsources[0]['high_thresh_sigma'] < self.new_source_sigma_margin)
def test_probably_not_a_transient(self): """ ( flux1 < (rms_min0*(det0 + margin) ) --> Probably not a transient NB even if avg_source_flux == rms_min0*det0 + epsilon we might not detect it in the first image, due to noise fluctuations. So we provide the user-tunable marginal_detection_thresh, to ignore these 'noise' transients. """ img_params = self.img_params img0 = img_params[0] marginal_steady_src_flux = self.barely_detectable_flux # This time around, we just manually exclude the steady src from # the first image detections. marginal_steady_src = MockSource( example_extractedsource_tuple(ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl'] ), lightcurve=defaultdict(lambda :marginal_steady_src_flux) ) # First, check that we've set up the test correctly rms_min0 = img_params[0]['rms_min'] det0 = img_params[0]['detection_thresh'] self.assertTrue(marginal_steady_src_flux < rms_min0 * (det0 + self.new_source_sigma_margin)) # Insert first image, no sources. tkp.db.Image(data=img_params[0], dataset=self.dataset) # Now set up second image. img1 = tkp.db.Image(data=img_params[1], dataset=self.dataset) xtr = marginal_steady_src.simulate_extraction(img1, extraction_type='blind') insert_extracted_sources(img1._id, [xtr], 'blind') associate_extracted_sources(img1._id, deRuiter_r, self.new_source_sigma_margin) newsources = get_newsources_for_dataset(self.dataset.id) # Should have no flagged new sources self.assertEqual(len(newsources), 0)
def test_probably_not_a_transient(self): """ ( flux1 < (rms_min0*(det0 + margin) ) --> Probably not a transient NB even if avg_source_flux == rms_min0*det0 + epsilon we might not detect it in the first image, due to noise fluctuations. So we provide the user-tunable marginal_detection_thresh, to ignore these 'noise' transients. """ img_params = self.img_params img0 = img_params[0] marginal_steady_src_flux = self.barely_detectable_flux # This time around, we just manually exclude the steady src from # the first image detections. marginal_steady_src = MockSource( example_extractedsource_tuple(ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl'] ), lightcurve=defaultdict(lambda :marginal_steady_src_flux) ) #First, check that we've set up the test correctly: rms_min0 = img_params[0]['rms_min'] det0 = img_params[0]['detection_thresh'] self.assertTrue(marginal_steady_src_flux < rms_min0*(det0 + self.new_source_sigma_margin ) ) #Insert first image, no sources. tkp.db.Image(data=img_params[0],dataset=self.dataset) #Now set up second image. img1 = tkp.db.Image(data=img_params[1],dataset=self.dataset) xtr = marginal_steady_src.simulate_extraction(img1, extraction_type='blind') img1.insert_extracted_sources([xtr],'blind') img1.associate_extracted_sources(deRuiter_r, self.new_source_sigma_margin) newsources = get_newsources_for_dataset(self.dataset.id) #Should have no flagged new sources self.assertEqual(len(newsources),0)
def test_certain_transient(self): """ flux1 > (rms_max0*(det0+margin) --> Definite transient Nice and bright, must be new - mark it definite transient. """ img_params = self.img_params bright_transient = MockSource(example_extractedsource_tuple( ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl']), lightcurve={ img_params[1]['taustart_ts']: self.always_detectable_flux }) #First, check that we've set up the test correctly: rms_max0 = img_params[0]['rms_max'] det0 = img_params[0]['detection_thresh'] self.assertTrue(bright_transient.lightcurve.values()[0] > rms_max0 * (det0 + self.new_source_sigma_margin)) for pars in self.img_params: img = tkp.db.Image(data=pars, dataset=self.dataset) xtr = bright_transient.simulate_extraction(img, extraction_type='blind') if xtr is not None: insert_extracted_sources(img._id, [xtr], 'blind') associate_extracted_sources(img._id, deRuiter_r, self.new_source_sigma_margin) newsources = get_newsources_for_dataset(self.dataset.id) #Should have one 'definite' transient self.assertEqual(len(newsources), 1) self.assertTrue( newsources[0]['low_thresh_sigma'] > self.new_source_sigma_margin) self.assertTrue( newsources[0]['high_thresh_sigma'] > self.new_source_sigma_margin) self.assertTrue(newsources[0]['low_thresh_sigma'] > newsources[0] ['high_thresh_sigma'])
def test_certain_transient(self): """ flux1 > (rms_max0*(det0+margin) --> Definite transient Nice and bright, must be new - mark it definite transient. """ img_params = self.img_params bright_transient = MockSource( example_extractedsource_tuple(ra=img_params[0]['centre_ra'], dec=img_params[0]['centre_decl']), lightcurve={img_params[1]['taustart_ts']: self.always_detectable_flux} ) #First, check that we've set up the test correctly: rms_max0 = img_params[0]['rms_max'] det0 = img_params[0]['detection_thresh'] self.assertTrue(bright_transient.lightcurve.values()[0] > rms_max0*(det0 + self.new_source_sigma_margin ) ) for pars in self.img_params: img = tkp.db.Image(data=pars,dataset=self.dataset) xtr = bright_transient.simulate_extraction(img, extraction_type='blind') if xtr is not None: insert_extracted_sources(img._id, [xtr], 'blind') associate_extracted_sources(img._id, deRuiter_r, self.new_source_sigma_margin) newsources = get_newsources_for_dataset(self.dataset.id) #Should have one 'definite' transient self.assertEqual(len(newsources),1) self.assertTrue( newsources[0]['low_thresh_sigma'] > self.new_source_sigma_margin) self.assertTrue( newsources[0]['high_thresh_sigma'] > self.new_source_sigma_margin) self.assertTrue( newsources[0]['low_thresh_sigma'] > newsources[0]['high_thresh_sigma'])