Skip to content

Commit 470e19b

Browse files
committed
Add exit criteria and return grains vector
1 parent 3b0dd89 commit 470e19b

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

lofarimaging/lofarimaging.py

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ def compute_calibrated_model(vis, model_vis, maxiter=30):
183183
maxiter: max iterations (default 30)
184184
Returns:
185185
calibrated: model visibilities, shape [n_st, n_st]
186+
gains: the antenna grains, shape [n_st]
186187
residual: amplitude difference between model and actual visibilities, float
187188
"""
188189

@@ -199,11 +200,11 @@ def gains_difference(gain_phase, vis, model_vis):
199200

200201
result = scipy.optimize.minimize(gains_difference, gain_phase, args=(vis, model_vis), options={'maxiter': maxiter})
201202
gain_phase = result.x
202-
gains_mat = np.diag(np.exp(1.j * gain_phase))
203-
203+
gains = np.exp(1.j * gain_phase)
204+
gains_mat = np.diag(gains)
204205
calibrated = np.conj(gains_mat) @ model_vis @ gains_mat
205206

206-
return calibrated, gains_difference(gain_phase, vis, model_vis)
207+
return calibrated, gains, gains_difference(gain_phase, vis, model_vis)
207208

208209

209210
def compute_pointing_matrix(sources_positions, baselines, frequency):
@@ -274,27 +275,36 @@ def estimate_model_visibilities(sources_positions, visibilities, baselines, freq
274275
return model
275276

276277

277-
def self_cal(visibilities, expected_sources, baselines, frequency, iterations=10):
278+
def self_cal(visibilities, expected_sources, baselines, frequency, max_iterations=10, tollerance=1.e-4):
278279
"""
279280
Compute the gain phase comparing the model and the actual visibilities returning
280281
the model with the gain phase correction applied.
281282
282-
TODO introduce a valid stop condition and make the iteration parameters a max_iter parameter
283283
284284
Args:
285285
visibilities: visibilities, shape [n_st, n_st]
286286
expected_sources: lmn coords of the sources, shape [n_dir, 3]
287287
baselines: baselines matrix in m, shape [n_st, n_st, 3]
288288
frequency: frequency
289-
iterations: number of iterations to perform
289+
max_iterations: maximum number of iterations to perform
290290
Returns:
291291
model: the model visibilities with the applied gains, shape [n_st, n_st]
292+
gains: the antenna gains, shape [n_st]
293+
292294
"""
293295
model = estimate_model_visibilities(expected_sources, visibilities, baselines, frequency)
294-
for i in range(iterations):
295-
model, residual = compute_calibrated_model(visibilities, model, maxiter=50)
296-
logging.debug('residual after iteration %d: %s', i, residual)
297-
return model
296+
model, gains, residual = compute_calibrated_model(visibilities, model, maxiter=50)
297+
for i in range(1, max_iterations):
298+
model, gains, next_residual = compute_calibrated_model(visibilities, model, maxiter=50)
299+
print(i, residual, next_residual)
300+
if next_residual == 0:
301+
break
302+
elif abs(1 - (residual / next_residual)) >= tollerance:
303+
residual = next_residual
304+
else:
305+
break
306+
307+
return model, gains
298308

299309

300310
def simulate_sky_source(lmn_coord: np.array, baselines: np.array, freq: float):

test/test_single_station.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def test_compute_calibrated_model():
1313
vis = numpy.diag(numpy.ones((10)))
1414
model_vis = numpy.diag(numpy.ones(10))
1515
# ----TEST
16-
calibrated, residual = compute_calibrated_model(vis, model_vis)
16+
calibrated, gains, residual = compute_calibrated_model(vis, model_vis)
1717
assert_almost_equal(calibrated, vis)
1818
assert residual < 1.e-5
1919

@@ -65,13 +65,13 @@ def test_estimate_model_visibilities():
6565
assert_almost_equal(visibilities, model_visibilities)
6666

6767

68-
def test_self_cal():
68+
def test_self_cal_zero_residual():
6969
# ----TEST DATA
7070
source_position = numpy.zeros((1, 3))
7171
visibilities = numpy.ones((2, 2))
7272
baselines = numpy.zeros((2, 2, 3))
7373
baselines[0, 1, :] = [1, 0, 0]
7474
baselines[1, 0, :] = [1, 0, 0]
7575
# ----TEST
76-
calibrated_model = self_cal(visibilities, source_position, baselines, 1)
76+
calibrated_model, _ = self_cal(visibilities, source_position, baselines, 1)
7777
assert_almost_equal(calibrated_model, visibilities)

0 commit comments

Comments
 (0)