import pipeline.infrastructure as infrastructure
LOG = infrastructure.get_logger(__name__)
[docs]class MSReductionGroupMember(object):
def __init__(self, ms, antenna_id, spw_id, field_id=None):
self.ms = ms
self.antenna_id = antenna_id
self.spw_id = spw_id
self.field_id = -1 if field_id is None else field_id
self.iteration = 0
self.linelist = []
self.channelmap_range = []
@property
def npol(self):
return 1
@property
def spw(self):
return self.ms.spectral_windows[self.spw_id]
@property
def antenna(self):
return self.ms.antennas[self.antenna_id]
@property
def antenna_name(self):
return self.antenna.name
@property
def field(self):
return self.ms.fields[self.field_id]
@property
def field_name(self):
return self.field.name
[docs] def iter_countup(self):
self.iteration += 1
[docs] def iter_reset(self):
self.iteration = 0
[docs] def add_linelist(self, linelist, pols=None, channelmap_range=None):
self.linelist = linelist
if channelmap_range is not None:
self.channelmap_range = channelmap_range
else:
self.channelmap_range = linelist
def __repr__(self):
return 'MSReductionGroupMember(ms=\'%s\', antenna=%s, spw=%s, field_id=%s)' % (self.ms.basename, self.antenna_id, self.spw_id, self.field_id)
def __eq__(self, other):
#LOG.debug('MSReductionGroupMember.__eq__')
return other.ms.name == self.ms.name and other.antenna_id == self.antenna_id and other.spw_id == self.spw_id and other.field_id == self.field_id
def __ne__(self, other):
return other.ms.name != self.ms.name or other.antenna_id != self.antenna_id or other.spw_id != self.spw_id or other.field_id != self.field_id
[docs]class MSReductionGroupDesc(list):
def __init__(self, spw_name=None, min_frequency=None, max_frequency=None, nchan=None, field=None):
self.spw_name = spw_name
self.max_frequency = max_frequency
self.min_frequency = min_frequency
self.nchan = nchan
self.field = field
@property
def frequency_range(self):
return [self.min_frequency, self.max_frequency]
@property
def field_name(self):
return self.field.name.strip('"')
[docs] def merge(self, other):
assert self == other
for member in other:
LOG.trace('ms.name=\"%s\" antenna=%s spw=%s, field_id=%s' %
(member.ms.name, member.antenna_id, member.spw_id, member.field_id))
if not member in self:
LOG.debug('Adding (%s, %s, %s, %s)' %
(member.ms.name, member.antenna_id, member.spw_id, member.field_id))
self.append(member)
[docs] def add_member(self, ms, antenna_id, spw_id, field_id=None):
new_member = MSReductionGroupMember(ms, antenna_id, spw_id, field_id)
if new_member not in self:
self.append(new_member)
[docs] def get_iteration(self, ms, antenna_id, spw_id, field_id=None):
member = self[self._search_member(ms, antenna_id, spw_id, field_id)]
return member.iteration
[docs] def iter_countup(self, ms, antenna_id, spw_id, field_id=None):
member = self[self._search_member(ms, antenna_id, spw_id, field_id)]
member.iter_countup()
[docs] def add_linelist(self, linelist, ms, antenna_id, spw_id, field_id=None, channelmap_range=None):
member = self[self._search_member(ms, antenna_id, spw_id, field_id)]
member.add_linelist(linelist, channelmap_range=channelmap_range)
def _search_member(self, ms, antenna_id, spw_id, field_id=None):
for indx in range(len(self)):
member = self[indx]
if member.ms.name == ms.name and member.antenna_id == antenna_id and member.spw_id == spw_id and member.field_id == field_id:
return indx
break
def __eq__(self, other):
#LOG.debug('MSReductionGroupDesc.__eq__')
if (not isinstance(self.spw_name, str)) or len(self.spw_name) == 0:
return self.max_frequency == other.max_frequency \
and self.min_frequency == other.min_frequency \
and self.nchan == other.nchan \
and self.field_name == other.field_name
else:
return self.spw_name == other.spw_name \
and self.field_name == other.field_name
def __ne__(self, other):
if (not isinstance(self.spw_name, str)) or len(self.spw_name) == 0:
return self.max_frequency != other.max_frequency \
or self.min_frequency != other.min_frequency \
or self.nchan != other.nchan \
or self.field_name != other.field_name
else:
return self.spw_name != other.spw_name \
or self.field_name != other.field_name
def __repr__(self):
if (not isinstance(self.spw_name, str)) or len(self.spw_name) == 0:
return 'MSReductionGroupDesc(frequency_range=%s, nchan=%s, field=\'%s\', member=%s)' % (self.frequency_range, self.nchan, self.field_name, self[:])
else:
return 'MSReductionGroupDesc(spw_name=%s, frequency_range=%s, nchan=%s, field=\'%s\', member=%s)' % (self.spw_name, self.frequency_range, self.nchan, self.field_name, self[:])