|
5 | 5 |
|
6 | 6 | from basie import utils, frame |
7 | 7 | from basie.valid_angles import VAngle |
| 8 | +from basie.errors import * |
8 | 9 |
|
9 | 10 | from scanmode import ScanMode |
10 | 11 | from ..frame import Coord |
@@ -175,10 +176,69 @@ def _do_scan(self, _target, _receiver, _frequency): |
175 | 176 |
|
176 | 177 | class RasterMapScan(MapScan): |
177 | 178 | def __init__(self, frame, start_point, scan_axis, |
178 | | - length_x, length_y, spacing, duration): |
| 179 | + length_x, length_y, spacing, duration, offset=0): |
179 | 180 | MapScan.__init__(self, frame, start_point, scan_axis, |
180 | 181 | length_x, length_y, spacing) |
181 | 182 | self.duration = duration |
| 183 | + self.offset_interleave = offset |
| 184 | + |
| 185 | + def _get_spacing(self, receiver, frequency): |
| 186 | + self.beamsize = VAngle(receiver.get_beamsize(max(frequency))) |
| 187 | + if receiver.is_multifeed() and receiver.has_derotator: |
| 188 | + #we can exploit multifeed derotator optimization |
| 189 | + logger.info("applying multifeed derotator optimization for map generation") |
| 190 | + if not isinstance(self.spacing, VAngle): |
| 191 | + approx_spacing = self.beamsize / self.spacing |
| 192 | + scans_per_interleave = ceil(receiver.interleave / approx_spacing) |
| 193 | + if not scans_per_interleave == self.spacing: |
| 194 | + #logger.warning("Rounding to {0} scans per interleave".format(scans_per_interleave)) |
| 195 | + pass |
| 196 | + self.spacing = receiver.interleave / scans_per_interleave |
| 197 | + logger.info("Spacing subscans by {0}".format(self.spacing)) |
| 198 | + else: |
| 199 | + if (self.spacing > (receiver.interleave / 2)): |
| 200 | + logger.warning("Spacing is too high, map will be undersampled") |
| 201 | + scans_per_interleave = floor(receiver.interleave / self.spacing) |
| 202 | + #this is necessary for tsys and offsets |
| 203 | + self.beamsize = receiver.feed_extent * 2 |
| 204 | + if scans_per_interleave == 0: |
| 205 | + #logger.warning("Spacing is too high for this receiver") |
| 206 | + raise ScanError("Spacing is too high for this receiver") |
| 207 | + #scans_per_interleave = 1 |
| 208 | + #self.spacing = 0 |
| 209 | + major_spacing = receiver.feed_extent * 2 |
| 210 | + self.dimension_x = 0 |
| 211 | + self.offset_x = [] |
| 212 | + self.dimension_y = 0 |
| 213 | + self.offset_y = [] |
| 214 | + if self.scan_axis == "LON": |
| 215 | + _offset_x = (-1 * (self.length_x / 2)) - receiver.feed_extent |
| 216 | + while _offset_x <= (self.length_x / 2 + receiver.feed_extent): |
| 217 | + self.offset_x.append(_offset_x) |
| 218 | + _offset_x = _offset_x + self.spacing |
| 219 | + _offset_y = (-1 * (self.length_y / 2)) + receiver.feed_extent |
| 220 | + while _offset_y <= (self.length_y / 2 + receiver.feed_extent): |
| 221 | + for i in range(scans_per_interleave): |
| 222 | + self.offset_y.append(_offset_y) |
| 223 | + _offset_y = _offset_y + self.spacing |
| 224 | + #self.offset_y.append(_offset_y + i * self.spacing) |
| 225 | + _offset_y = _offset_y + major_spacing |
| 226 | + else: #self.scan_axis == "LAT" |
| 227 | + _offset_x = (-1 * (self.length_x / 2)) + receiver.feed_extent |
| 228 | + while _offset_x <= (self.length_x / 2 + receiver.feed_extent): |
| 229 | + for i in range(scans_per_interleave): |
| 230 | + self.offset_x.append(_offset_x) |
| 231 | + _offset_x = _offset_x + self.spacing |
| 232 | + #self.offset_x.append(_offset_x + i * self.spacing) |
| 233 | + _offset_x = _offset_x + major_spacing |
| 234 | + _offset_y = (-1 * (self.length_y / 2)) - receiver.feed_extent |
| 235 | + while _offset_y <= (self.length_y / 2 + receiver.feed_extent): |
| 236 | + self.offset_y.append(_offset_y) |
| 237 | + _offset_y = _offset_y + self.spacing |
| 238 | + self.dimension_x = len(self.offset_x) |
| 239 | + self.dimension_y = len(self.offset_y) |
| 240 | + else: |
| 241 | + super(RasterMapScan, self)._get_spacing() |
182 | 242 |
|
183 | 243 | def _get_offsets(self): |
184 | 244 | """ |
@@ -231,13 +291,21 @@ def _do_scan(self, _target, _receiver, _frequency): |
231 | 291 | )) |
232 | 292 | self._offsets = self._get_offsets() |
233 | 293 | _subscans = [] |
234 | | - for offset_lon, offset_lat in self._offsets: |
| 294 | + for i, (offset_lon, offset_lat) in enumerate(self._offsets): |
235 | 295 | logger.debug("OFFSETS: %f %f" % (offset_lon.deg, offset_lat.deg)) |
236 | 296 | _offset = Coord(self.frame, offset_lon, offset_lat) |
237 | 297 | _subscans.append(subscan.get_sid_tsys(_target, |
238 | 298 | _offset, |
239 | 299 | self.extremes, |
240 | 300 | self.duration, |
241 | 301 | self.beamsize)) |
| 302 | + if not self.offset_interleave == 0: |
| 303 | + if i % self.offset_interleave == 0: |
| 304 | + _subscans.append(subscan.get_off_tsys(_target, |
| 305 | + _offset, |
| 306 | + self.extremes, |
| 307 | + self.duration, |
| 308 | + self.beamsize)) |
242 | 309 | return _subscans |
243 | 310 |
|
| 311 | + |
0 commit comments