Opened 13 years ago
Closed 13 years ago
#251 closed defect (fixed)
scantable.scale causes selection to fail
Reported by: | Malte Marquarding | Owned by: | Kana Sugimoto |
---|---|---|---|
Priority: | high | Milestone: | Unified development |
Component: | python | Version: | 2.0 |
Severity: | blocker | Keywords: | |
Cc: | Kana Sugimoto |
Description
The radio school tutorial script MMB_MX_Tutorial.py fails as follows
Traceback (most recent call last): File "MMB_MX_Tutorial.py", line 27, in <module> data.set_selection(beams=beam, pols=pol) File "/usr/local/lib/python2.6/dist-packages/asap-3.1.0_trunk-py2.6.egg/asap/scantable.py", line 581, in set_selection self._setselection(selection) RuntimeError: Selection contains no data. Not applying it.
Change History (5)
comment:1 by , 13 years ago
Owner: | changed from | to
---|
comment:2 by , 13 years ago
Status: | new → assigned |
---|
Could someone point out the script and data which raises the error, or let me know the way to reproduce it?
comment:3 by , 13 years ago
the error has been fixed. However, I have changed code for scantable with non-scalar operands whcih casa has introduced. I don't have regression tests for this in standard asap (yet).
comment:5 by , 13 years ago
Resolution: | → fixed |
---|---|
Status: | assigned → closed |
I tested array operations by scantable.scale and fixed a bug.
The bug comes from a "feature" of the selector.add function, i.e., the reference to one of the selector is returned when the other one is empty selection.
For instance,
scan = scantable('myscan.asap') basesel = scan.get_selection() # basesel is empty because no selection has been applied. sel = selector() + basesel
The last operation returns a reference to basesel (since selector() is an empty selection) and, hence, basesel is modified when sel is modified. This causes an unexpected behavior when you try to restore the initial selection to scan by
sel.set_rows([0,2,4]) # basesel is also modified since sel is reference to basesel scan.set_selection(sel) # rows 0, 2, and 4 are selected scan.set_selection(basesel) # won't discard selections by row number
Although you can force returning a new selector instance by adding basesel frist, i.e.,
sel = basesel + selector()
it's misleading. I believe selector.add() should always retrun a new selector instance.
This is due to a
self.copy
call in the arguments tostmath._unaryop
.I have no idea why it got put there as this completely bypasses the
insitu
and selection behaviour.Changed in r2320.
Kana can you verify specifically the arrayop.