22
33"""
44
5- import numpy
6-
7- from typing import Union
85import copy
6+ import logging
7+ from typing import Union
98
109import astropy .constants as constants
10+ import numpy
1111from astropy .coordinates import SkyCoord
12+
1213from arl .data .data_models import BlockVisibility , Visibility , Configuration , QA
1314from arl .data .polarisation import correlate_polarisation , PolarisationFrame
14- from arl .util .coordinate_support import xyz_to_uvw , uvw_to_xyz , skycoord_to_lmn , simulate_point
1515from arl .imaging .params import get_frequency_map
16-
17- import logging
16+ from arl .util .coordinate_support import xyz_to_uvw , uvw_to_xyz , skycoord_to_lmn , simulate_point
1817
1918log = logging .getLogger (__name__ )
2019
@@ -26,7 +25,7 @@ def vis_summary(vis: Union[Visibility, BlockVisibility]):
2625 return "%d rows, %.3f GB" % (vis .nvis , vis .size ())
2726
2827
29- def append_visibility (vis : Union [Visibility , BlockVisibility ], othervis : Union [Visibility , BlockVisibility ])\
28+ def append_visibility (vis : Union [Visibility , BlockVisibility ], othervis : Union [Visibility , BlockVisibility ]) \
3029 -> Union [Visibility , BlockVisibility ]:
3130 """Append othervis to vis
3231
@@ -136,7 +135,7 @@ def create_blockvisibility(config: Configuration,
136135 frequency : numpy .array ,
137136 phasecentre : SkyCoord ,
138137 weight : float ,
139- polarisation_frame : PolarisationFrame = None ,
138+ polarisation_frame : PolarisationFrame = None ,
140139 integration_time = 1.0 ,
141140 channel_bandwidth = 1e6 ) -> BlockVisibility :
142141 """ Create a BlockVisibility from Configuration, hour angles, and direction of source
@@ -208,7 +207,7 @@ def create_visibility_from_rows(vis: Union[Visibility, BlockVisibility], rows: n
208207 """
209208
210209 if type (vis ) is Visibility :
211-
210+
212211 if makecopy :
213212 newvis = copy_visibility (vis )
214213 newvis .data = copy .deepcopy (vis .data [rows ])
@@ -217,7 +216,7 @@ def create_visibility_from_rows(vis: Union[Visibility, BlockVisibility], rows: n
217216 vis .data = copy .deepcopy (vis .data [rows ])
218217 return vis
219218 else :
220-
219+
221220 if makecopy :
222221 newvis = copy_visibility (vis )
223222 newvis .data = copy .deepcopy (vis .data [rows ])
@@ -290,7 +289,7 @@ def sum_visibility(vis: Visibility, direction: SkyCoord) -> numpy.array:
290289 # TODO: Convert to Visibility or remove?
291290
292291 svis = copy_visibility (vis )
293-
292+
294293 l , m , n = skycoord_to_lmn (direction , svis .phasecentre )
295294 phasor = numpy .conjugate (simulate_point (svis .uvw , l , m ))
296295
@@ -316,7 +315,7 @@ def sum_visibility(vis: Visibility, direction: SkyCoord) -> numpy.array:
316315 return flux , weight
317316
318317
319- def qa_visibility (vis :Union [Visibility , BlockVisibility ], context = None ) -> QA :
318+ def qa_visibility (vis : Union [Visibility , BlockVisibility ], context = None ) -> QA :
320319 """Assess the quality of Visibility
321320
322321 :param context:
@@ -349,7 +348,7 @@ def remove_continuum_blockvisibility(vis: BlockVisibility, degree=1, mask=None,
349348 assert numpy .sum (mask ) > 2 * degree , "Insufficient channels for fit"
350349
351350 nchan = len (vis .frequency )
352- x = (vis .frequency - vis .frequency [nchan // 2 ])/ (vis .frequency [0 ] - vis .frequency [nchan // 2 ])
351+ x = (vis .frequency - vis .frequency [nchan // 2 ]) / (vis .frequency [0 ] - vis .frequency [nchan // 2 ])
353352 for row in range (vis .nvis ):
354353 for ant2 in range (vis .nants ):
355354 for ant1 in range (vis .nants ):
@@ -410,3 +409,33 @@ def divide_visibility(vis: BlockVisibility, modelvis: BlockVisibility):
410409 weight = xwt )
411410 return pointsource_vis
412411
412+
413+ def integrate_visibility_by_channel (vis : BlockVisibility , ** kwargs ) -> BlockVisibility :
414+ """ Integrate visibility across channels, returning new visibility
415+
416+ :param vis:
417+ :param kwargs:
418+ :return: BlockVisibility
419+ """
420+
421+ vis_shape = list (vis .vis .shape )
422+ ntimes , nants , _ , nchan , npol = vis_shape
423+ vis_shape [- 2 ] = 1
424+ newvis = BlockVisibility (data = None ,
425+ frequency = numpy .ones ([1 ]) * numpy .average (vis .frequency ),
426+ channel_bandwidth = numpy .ones ([1 ]) * numpy .sum (vis .channel_bandwidth ),
427+ phasecentre = vis .phasecentre ,
428+ configuration = vis .configuration ,
429+ uvw = vis .uvw ,
430+ time = vis .time ,
431+ vis = numpy .zeros (vis_shape , dtype = 'complex' ),
432+ weight = numpy .ones (vis_shape , dtype = 'float' ),
433+ integration_time = vis .integration_time ,
434+ polarisation_frame = vis .polarisation_frame )
435+
436+ newvis .data ['vis' ][..., 0 , :] = numpy .sum (vis .data ['vis' ] * vis .data ['weight' ], axis = - 2 )
437+ newvis .data ['weight' ][..., 0 , :] = numpy .sum (vis .data ['weight' ], axis = - 2 )
438+ mask = newvis .data ['weight' ] > 0.0
439+ newvis .data ['vis' ][mask ] = newvis .data ['vis' ][mask ] / newvis .data ['weight' ][mask ]
440+
441+ return newvis
0 commit comments