Skip to content

Commit f671101

Browse files
committed
Merge pull request #13 from discos/v0.6.3
V0.6.3
2 parents ff5d6aa + f7e7abe commit f671101

21 files changed

Lines changed: 313 additions & 158 deletions

README.md

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,3 @@ schedule.
176176
and modified from user template in step 1.
177177
if run with -f overrides eventual existing files.
178178
179-
180-
## BUILD DOCUMENTATION
181-
182-
You can generate a local copy of the developer documentation using epydoc via
183-
184-
```
185-
$make doc
186-
```
187-
188-
You will find the doc under doc/html/
189-

RELEASENOTES.md

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,32 @@
11
# RELEASE NOTES
22

3+
## v0.6.3
4+
5+
Release notes:
6+
- [x] Angles now rounded to the 4th decimal point.
7+
- [x] **nop** instruction removed from roach backend configuration.
8+
- [x] added explicit **ftrack** parameter in configuration file.
9+
- [x] added **offset interleave** parameter in raster map scans.
10+
- [x] Fixes algorithm for Raster Maps scans using multifeed receiver.
11+
12+
**Note on ftrack**: in order to use ftrack procedures the user now must specify
13+
```python
14+
restFrequency = something_different_from_zero
15+
ftrack = True
16+
```
17+
in the configuration file. Note that this will activate ftrack procedures even
18+
when the target velocity is null. On the contrary, setting a *restFrequency*
19+
value and a target *velocity* will not automatically trigger the *ftrack*
20+
procedure if not explicitly specified by the *ftrack* parameter in the
21+
configuration file.
22+
23+
**Note on raster maps**: Raster maps now include a new parameter called
24+
**offset_interleave**. If **offset_interleave** is differrent from zero this
25+
will tell basie to add one subscan outside the map after **offset_interleave**
26+
subscans inside the map. By default the offset position is taken 5 beamsizes
27+
outside the map perimeter for single feed receivers, while it is take 5 receiver
28+
extents for multifeed receivers.
29+
330
## v0.6.2
431

532
Release notes:

requirements.txt

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
BTrees==4.1.4
2-
argparse==1.2.1
1+
BTrees>=4.1.4
2+
argparse>=1.2.1
33
numpy>=1.6.1
44
astropy>=1.0.1
5-
configobj==4.7.2
5+
configobj
66
validate
7-
persistent==4.1.1
8-
pickleshare==0.5
9-
transaction==1.4.4
10-
zc.lockfile==1.1.0
11-
zdaemon==4.1.0
12-
ZConfig==3.0.4
13-
ZODB==4.2.0
14-
zodbpickle==0.6.0
15-
zope.interface==4.1.2
7+
persistent>=4.1.1
8+
pickleshare>=0.5
9+
transaction>=1.4.4
10+
zc.lockfile>=1.1.0
11+
zdaemon>=4.1.0
12+
ZConfig>=3.0.4
13+
ZODB>=4.2.0
14+
zodbpickle>=0.6.0
15+
zope.interface>=4.1.2

setup.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,19 +4,16 @@
44

55
setup(
66
name = "basie",
7-
version = "0.6.2",
7+
version = "0.7.0-beta",
88
description = "schedule creator for italian radiotelescopes",
99
author = "Marco Bartolini, Simona Righini",
1010
author_email = "bartolini@ira.inaf.it",
1111
maintainer = "Marco Bartolini",
12-
mainteiner_email =" bartolini@ira.inaf.it",
1312
license = "License :: OSI Approved :: BSD License",
1413
url = "http://github.com/flyingfrog81/basie/",
1514
packages = ["basie", "basie.scanmode"],
1615
package_dir = {"basie" : "src", "basie.scanmode" : "src/scanmode"},
1716
package_data = {"basie" : ["schemas/*.ini",
1817
"user_templates/*.txt"]},
1918
scripts = ["scripts/basie"],
20-
install_requires = ["configobj", "validate", "astropy>=1.0", "zodbpickle",
21-
"ZODB", "BTrees"],
2219
)

src/__init__.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@
178178
179179
You will find the doc under doc/html/
180180
181-
@version: 0.6.2
181+
@version: 0.6.3
182182
@status: stable
183183
@authors: Marco Bartolini, Simona Righini
184184
@organization: INAF -IRA
@@ -187,7 +187,7 @@
187187
@contact: bartolini@ira.inaf.it
188188
"""
189189

190-
VERSION = "0.6.2"
190+
VERSION = "0.6.3"
191191
NURAGHE_TAG = "nuraghe-0.6"
192192
ESCS_TAG = "escs-0.6"
193193

@@ -234,6 +234,7 @@ def cmd_line():
234234

235235
#imports are here as logging has already been configured
236236
import schedule, rich_validator, utils, target_parser, receiver
237+
from radiotelescopes import radiotelescopes
237238

238239
try:
239240
if ns.get_templates:
@@ -255,10 +256,24 @@ def cmd_line():
255256
dst_directory = os.path.abspath(ns.directory)
256257
conf = rich_validator.validate_configuration(configuration_file)
257258
#setting target file in the same directory as schedule file
258-
conf['targetsFile'] = os.path.join(src_directory, conf['targetsFile'])
259-
parsed_targets = target_parser.parse_file(conf['targetsFile'])
259+
targetsFile = os.path.join(src_directory, conf.pop('targetsFile'))
260+
parsed_targets = target_parser.parse_file(targetsFile)
260261
logger.debug("parsed targets: %s" % (parsed_targets,))
261-
_schedule = schedule.Schedule(**conf)
262+
#prepare Schedule contructor arguments
263+
schedule_params = conf
264+
radiotelescope = radiotelescopes[conf["radiotelescope"]]
265+
try:
266+
receiver = radiotelescope.receivers[conf["receiver"]]
267+
except:
268+
raise ScheduleError("radiotelescope does not have specified receiver")
269+
schedule_params.radiotelescope = radiotelescope
270+
schedule_params.receiver = receiver
271+
backends = schedule_params.pop("backends")
272+
scantypes = schedule_params.pop("scantypes")
273+
logger.debug(schedule_params)
274+
_schedule = schedule.Schedule(**schedule_params)
275+
_schedule.backends = backends
276+
_schedule.scantypes = scantypes
262277
for _target, _scanmode, _backend, _ in parsed_targets:
263278
_schedule.add_scan(_target, _scanmode, _backend)
264279
_schedule.set_base_dir(dst_directory)

src/receiver.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,8 +110,8 @@ def get_beamsize(self, freq=None):
110110
if not freq:
111111
logger.warning("RECEIVER %s using default beamsize at min frequency" %
112112
(self.name,))
113-
freq = self.fmin.value
114-
if((not self.fmin <= freq <= self.fmax) and (freq > 0)):
113+
freq = self.fmin
114+
if((not self.fmin <= freq <= self.fmax) and (freq > 0 * u.MHz)):
115115
logger.warning("RECEIVER %s beamsize at frequency %f out of range" %
116116
(self.name, freq.value,))
117117
logger.debug("Getting beamsize\nfreq: %s\nt0: %s\nt1: %s" % \

src/rich_validator.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,8 +158,9 @@ def check_raster_map(value):
158158
except:
159159
logger.debug("RASTER map specify scans per beam")
160160
spacing = v.is_float(value[6], min=1)
161+
offset = v.is_integer(value[7], min=0)
161162
return RasterMapScan(_frame, start_point, scan_axis, length_x, length_y,
162-
spacing, duration)
163+
spacing, duration, offset)
163164

164165
def check_nodding_sequence(value):
165166
if not isinstance(value, list):

src/scan.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,16 +19,16 @@ def __init__(self,
1919
receiver,
2020
frequency,
2121
backend,
22-
repetitions,
23-
tsys,
22+
schedule_repetitions = 1,
23+
schedule_tsys = 0,
2424
):
2525
self.target = target
2626
self.scanmode = scanmode
2727
self.receiver = receiver
2828
self.backend = backend
2929
self.frequency = frequency
30-
self.repetitions = repetitions
31-
self.tsys = tsys
30+
self.repetitions = target.repetitions or schedule_repetitions
31+
self.tsys = target.tsys or schedule_tsys
3232
if self.target.offset_coord.is_null():
3333
try:
3434
self.target.offset_coord.frame = scanmode.frame
@@ -47,19 +47,20 @@ def subscans(self):
4747
base_subscans = self.scanmode._do_scan(self.target,
4848
self.receiver,
4949
self.frequency)
50+
counter = 0
5051
for rep in xrange(self.repetitions):
5152
for sn, ss in enumerate(base_subscans):
52-
logger.debug("REP: %d SUBSCAN: %d" % (rep, sn))
53-
subscan_number = rep * self.scanmode.unit_subscans + sn
54-
logger.debug("subscan_number %d" % (subscan_number,))
53+
#logger.debug("REP: %d SUBSCAN: %d" % (rep, sn))
54+
#subscan_number = rep * self.scanmode.unit_subscans + sn
5555
yield_tsys = False
5656
#should we add a TSYS subscan?
57-
if subscan_number == 0 and self.tsys >= 0:
57+
if rep == 0 and sn == 0 and self.tsys >= 0:
5858
yield_tsys = True
59-
elif self.tsys > 0 and not(subscan_number % self.tsys):
59+
elif self.tsys > 0 and not(counter % self.tsys):
6060
yield_tsys = True
6161
if yield_tsys:
6262
subscans.append(copy.deepcopy(ss[1]))
6363
subscans.append(copy.deepcopy(ss[0]))
64+
counter += 1
6465
return subscans
6566

src/scanmode/maps.py

Lines changed: 70 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
from basie import utils, frame
77
from basie.valid_angles import VAngle
8+
from basie.errors import *
89

910
from scanmode import ScanMode
1011
from ..frame import Coord
@@ -175,10 +176,69 @@ def _do_scan(self, _target, _receiver, _frequency):
175176

176177
class RasterMapScan(MapScan):
177178
def __init__(self, frame, start_point, scan_axis,
178-
length_x, length_y, spacing, duration):
179+
length_x, length_y, spacing, duration, offset=0):
179180
MapScan.__init__(self, frame, start_point, scan_axis,
180181
length_x, length_y, spacing)
181182
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()
182242

183243
def _get_offsets(self):
184244
"""
@@ -231,13 +291,21 @@ def _do_scan(self, _target, _receiver, _frequency):
231291
))
232292
self._offsets = self._get_offsets()
233293
_subscans = []
234-
for offset_lon, offset_lat in self._offsets:
294+
for i, (offset_lon, offset_lat) in enumerate(self._offsets):
235295
logger.debug("OFFSETS: %f %f" % (offset_lon.deg, offset_lat.deg))
236296
_offset = Coord(self.frame, offset_lon, offset_lat)
237297
_subscans.append(subscan.get_sid_tsys(_target,
238298
_offset,
239299
self.extremes,
240300
self.duration,
241301
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))
242309
return _subscans
243310

311+

src/scanmode/nodding.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ def _do_scan(self, _target, _receiver, _frequency):
2424
offset_b = _receiver.feed_offsets[self.feed_b]
2525
_subscans = []
2626
for element in self.sequence:
27+
if element[1] == "a":
28+
offset = offset_a
29+
else:
30+
offset = offset_b
31+
ss = subscan.get_sidereal(_target,
32+
offset,
33+
self.duration,
34+
is_cal=element[2])
35+
st = subscan.get_tsys(_target,
36+
offset)
2737
for repetitions in range(element[0]):
28-
if element[1] == "a":
29-
offset = offset_a
30-
else:
31-
offset = offset_b
32-
ss = subscan.get_sidereal(_target,
33-
offset,
34-
self.duration,
35-
is_cal=element[2])
36-
st = subscan.get_tsys(_target,
37-
offset)
3838
_subscans.append((ss, st))
3939
return _subscans

0 commit comments

Comments
 (0)