1212
1313import numpy
1414
15- from data_models .memory_data_models import Visibility
15+ from data_models .memory_data_models import Visibility , BlockVisibility
1616
1717from ..calibration .operations import create_gaintable_from_blockvisibility , apply_gaintable , qa_gaintable
1818from ..calibration .calibration import solve_gaintable
@@ -65,21 +65,33 @@ def apply_calibration_function(vis, gaintables, calibration_context='T', control
6565
6666 if controls is None :
6767 controls = create_calibration_controls (** kwargs )
68-
69- isVis = isinstance (vis , Visibility )
70- if isVis :
71- avis = convert_visibility_to_blockvisibility (vis )
72- else :
73- avis = vis
74-
68+
69+ # Check to see if changes are required
70+ changes = False
7571 for c in calibration_context :
7672 if iteration >= controls [c ]['first_selfcal' ]:
77- avis = apply_gaintable (avis , gaintables [c ], inverse = True , timeslice = controls [c ]['timeslice' ])
73+ changes = True
74+
75+ if changes :
76+
77+ isVis = isinstance (vis , Visibility )
78+ if isVis :
79+ avis = convert_visibility_to_blockvisibility (vis )
80+ else :
81+ avis = vis
82+
83+ assert isinstance (avis , BlockVisibility ), avis
84+
85+ for c in calibration_context :
86+ if iteration >= controls [c ]['first_selfcal' ]:
87+ avis = apply_gaintable (avis , gaintables [c ], inverse = True , timeslice = controls [c ]['timeslice' ])
7888
79- if isVis :
80- return convert_blockvisibility_to_visibility (avis )
89+ if isVis :
90+ return convert_blockvisibility_to_visibility (avis )
91+ else :
92+ return avis
8193 else :
82- return avis
94+ return vis
8395
8496
8597def calibrate_function (vis , model_vis , calibration_context = 'T' , controls = None , iteration = 0 , tol = 1e-8 , ** kwargs ):
@@ -100,36 +112,50 @@ def calibrate_function(vis, model_vis, calibration_context='T', controls=None, i
100112 if controls is None :
101113 controls = create_calibration_controls (** kwargs )
102114
103- isVis = isinstance (vis , Visibility )
104- if isVis :
105- avis = convert_visibility_to_blockvisibility (vis )
106- else :
107- avis = vis
108-
109- isMVis = isinstance (model_vis , Visibility )
110- if isMVis :
111- amvis = convert_visibility_to_blockvisibility (model_vis )
112- else :
113- amvis = model_vis
114-
115+ # Check to see if changes are required
116+ changes = False
115117 for c in calibration_context :
116118 if iteration >= controls [c ]['first_selfcal' ]:
117- gaintables [c ] = \
118- create_gaintable_from_blockvisibility (avis , timeslice = controls [c ]['timeslice' ])
119- gaintables [c ] = solve_gaintable (avis , amvis ,
120- timeslice = controls [c ]['timeslice' ],
121- phase_only = controls [c ]['phase_only' ],
122- crosspol = controls [c ]['shape' ] == 'matrix' ,
123- tol = tol )
124- log .debug ('calibrate_function: Jones matrix %s, iteration %d' % (c , iteration ))
125- log .debug (qa_gaintable (gaintables [c ], context = 'Jones matrix %s, iteration %d' % (c , iteration )))
126- avis = apply_gaintable (avis , gaintables [c ], inverse = True , timeslice = controls [c ]['timeslice' ])
119+ changes = True
120+
121+ if changes :
122+
123+ isVis = isinstance (vis , Visibility )
124+ if isVis :
125+ avis = convert_visibility_to_blockvisibility (vis )
127126 else :
128- log .debug ('calibrate_function: Jones matrix %s not solved, iteration %d' % (c , iteration ))
129- if isVis :
130- return convert_blockvisibility_to_visibility (avis ), gaintables
127+ avis = vis
128+
129+ isMVis = isinstance (model_vis , Visibility )
130+ if isMVis :
131+ amvis = convert_visibility_to_blockvisibility (model_vis )
132+ else :
133+ amvis = model_vis
134+
135+ assert isinstance (avis , BlockVisibility ), avis
136+
137+ for c in calibration_context :
138+ if iteration >= controls [c ]['first_selfcal' ]:
139+ changed = True
140+ gaintables [c ] = \
141+ create_gaintable_from_blockvisibility (avis , timeslice = controls [c ]['timeslice' ])
142+ gaintables [c ] = solve_gaintable (avis , amvis ,
143+ timeslice = controls [c ]['timeslice' ],
144+ phase_only = controls [c ]['phase_only' ],
145+ crosspol = controls [c ]['shape' ] == 'matrix' ,
146+ tol = tol )
147+ log .debug ('calibrate_function: Jones matrix %s, iteration %d' % (c , iteration ))
148+ log .debug (qa_gaintable (gaintables [c ], context = 'Jones matrix %s, iteration %d' % (c , iteration )))
149+ avis = apply_gaintable (avis , gaintables [c ], inverse = True , timeslice = controls [c ]['timeslice' ])
150+ else :
151+ log .debug ('calibrate_function: Jones matrix %s not solved, iteration %d' % (c , iteration ))
152+
153+ if isVis :
154+ return convert_blockvisibility_to_visibility (avis ), gaintables
155+ else :
156+ return avis , gaintables
131157 else :
132- return avis , gaintables
158+ return vis , gaintables
133159
134160
135161def solve_calibrate_function (vis , model_vis , calibration_context = 'T' , controls = None , iteration = 0 , tol = 1e-6 , ** kwargs ):
@@ -149,29 +175,40 @@ def solve_calibrate_function(vis, model_vis, calibration_context='T', controls=N
149175
150176 if controls is None :
151177 controls = create_calibration_controls (** kwargs )
152-
153- isVis = isinstance (vis , Visibility )
154- if isVis :
155- avis = convert_visibility_to_blockvisibility (vis )
156- else :
157- avis = vis
158-
159- isMVis = isinstance (model_vis , Visibility )
160- if isMVis :
161- amvis = convert_visibility_to_blockvisibility (model_vis )
162- else :
163- amvis = model_vis
164-
178+
179+ # Check to see if changes are required
180+ changes = False
165181 for c in calibration_context :
166182 if iteration >= controls [c ]['first_selfcal' ]:
167- gaintables [c ] = \
168- create_gaintable_from_blockvisibility (avis , timeslice = controls [c ]['timeslice' ])
169- gaintables [c ] = solve_gaintable (avis , amvis ,
170- timeslice = controls [c ]['timeslice' ],
171- phase_only = controls [c ]['phase_only' ],
172- crosspol = controls [c ]['shape' ] == 'matrix' ,
173- tol = tol )
174- log .debug (qa_gaintable (gaintables [c ], context = 'Jones matrix %s, iteration %d' % (c , iteration )))
183+ changes = True
184+
185+ if changes :
186+
187+ isVis = isinstance (vis , Visibility )
188+ if isVis :
189+ avis = convert_visibility_to_blockvisibility (vis )
175190 else :
176- log .debug ('calibrate_function: Jones matrix %s not solved, iteration %d' % (c , iteration ))
191+ avis = vis
192+
193+ isMVis = isinstance (model_vis , Visibility )
194+ if isMVis :
195+ amvis = convert_visibility_to_blockvisibility (model_vis )
196+ else :
197+ amvis = model_vis
198+
199+ assert isinstance (avis , BlockVisibility ), avis
200+
201+ for c in calibration_context :
202+ if iteration >= controls [c ]['first_selfcal' ]:
203+ gaintables [c ] = \
204+ create_gaintable_from_blockvisibility (avis , timeslice = controls [c ]['timeslice' ])
205+ gaintables [c ] = solve_gaintable (avis , amvis ,
206+ timeslice = controls [c ]['timeslice' ],
207+ phase_only = controls [c ]['phase_only' ],
208+ crosspol = controls [c ]['shape' ] == 'matrix' ,
209+ tol = tol )
210+ log .debug (qa_gaintable (gaintables [c ], context = 'Jones matrix %s, iteration %d' % (c , iteration )))
211+ else :
212+ log .debug ('calibrate_function: Jones matrix %s not solved, iteration %d' % (c , iteration ))
213+
177214 return gaintables
0 commit comments