source: trunk/python/selector.py @ 1576

Last change on this file since 1576 was 1576, checked in by Malte Marquarding, 15 years ago

Ticket #169: allow direct settings of selections

File size: 7.1 KB
Line 
1from asap._asap import selector as _selector
2from asap import unique, _to_list
3
4class selector(_selector):
5    """
6    A selection object to be applied to scantables to restrict the
7    scantables to specific rows.
8    """
9    fields = ["pols", "ifs", "beams", "scans", "cycles", "name", "query"]
10
11    def __init__(self, *args, **kw):
12        if len(args) == 1:
13            if isinstance(args[0], self.__class__) \
14               or isinstance(args[0], _selector):
15                _selector.__init__(self, args[0])
16            else:
17                raise TypeError("Argument can only be a selector object")
18        else:
19            _selector.__init__(self)
20            for k,v  in kw.items():
21                if k in self.fields:
22                    func = getattr(self, "set_%s" % k)
23                    func(v)
24
25    def reset(self):
26        """
27        Unset all selections.
28        """
29        self._reset()
30
31    def is_empty(self):
32        """
33        Has anything been set?
34        """
35        return self._empty()
36
37    def set_polarisations(self, pols=[]):
38        """
39        Set the polarisations to be selected in the scantable.
40        Parameters:
41             pols:     a list of integers of 0-3, or strings, e.g ["I","Q"].
42                       Default [] is no selection
43        Example:
44             sel = selector()
45             # These are equivalent if data is 'linear'
46             sel.set_polarisations(["XX","Re(XY)"])
47             sel.set_polarisations([0,2])
48             # reset the polarisation selection
49             sel.set_polarisations()
50
51        """
52        vec = _to_list(pols, str) or _to_list(pols, int)
53        if isinstance(vec, list): # is an empty and/or valid vector
54            if len(vec) and isinstance(vec[-1],str):
55                self._setpolstrings(vec)
56                return
57            self._setpols(vec)
58        else:
59            raise TypeError('Unknown pol type. Please use [0,1...] or ["XX","YY"...]')
60
61    # for the americans
62    set_polarizations = set_polarisations
63    # for the lazy
64    set_pols = set_polarisations
65
66    def set_ifs(self, ifs=[]):
67        """
68        Set a sequence of IF numbers (0-based).
69        Parameters:
70            ifs:    a list of integers. Default [] is to unset the selection.
71        """
72        vec = _to_list(ifs, int)
73        if isinstance(vec,list):
74            self._setifs(vec)
75        else:
76            raise TypeError('Unknown IFno type. Use lists of integers.')
77
78    def set_scans(self, scans=[]):
79        """
80        Set a sequence of Scan numbers (0-based).
81        Parameters:
82            scans:    a list of integers. Default [] is to unset the selection.
83        """
84        vec = _to_list(scans, int)
85        if isinstance(vec,list):
86            self._setscans(vec)
87        else:
88            raise TypeError('Unknown Scan number type. Use lists of integers.')
89
90    def set_beams(self, beams=[]):
91        """
92        Set a sequence of Beam numbers (0-based).
93        Parameters:
94            beams:    a list of integers. Default [] is to unset the selection.
95        """
96        vec = _to_list(beams, int)
97        if isinstance(vec,list):
98            self._setbeams(vec)
99        else:
100            raise TypeError('Unknown Beam number type. Use lists of integers.')
101
102    def set_cycles(self, cycles=[]):
103        """
104        Set a sequence of IF numbers (0-based).
105        Parameters:
106            cycless:    a list of integers. Default [] is to unset the selection.
107        """
108        vec = _to_list(cycles, int)
109        if isinstance(vec,list):
110            self._setcycles(vec)
111        else:
112            raise TypeError('Unknown Cycle number type. Use lists of integers.')
113
114
115    def set_name(self, name):
116        """
117        Set a selection based on a name. This can be a unix pattern , e.g. "*_R"
118        Parameters:
119            name:    a string containing a source name or pattern
120        Examples:
121            # select all reference scans which start with "Orion"
122            selection.set_name("Orion*_R")
123        """
124        if isinstance(name, str):
125            self._setname(name)
126        else:
127            raise TypeError('name must be a string')
128
129    def set_tsys(self, tsysmin=0.0, tsysmax=None):
130        """
131        Select by Tsys range.
132        Parameters:
133            tsysmin:     the lower threshold. Default 0.0
134            tsysmax:     the upper threshold. Default None.
135        Examples:
136            # select all spectra with Tsys <= 500.0
137            selection.set_tsys(tsysmax=500.0)
138
139        """
140        taql =  "SELECT FROM $1 WHERE TSYS[0] >= %f" % (tsysmin)
141        if isinstance(tsysmax, float):
142            taql = taql + " AND TSYS[0] <= %f" % ( tsysmax)
143        self._settaql(taql)
144
145    def set_query(self, query):
146        """
147        Select by Column query. Power users only!
148        Example:
149            # select all off scans with integration times over 60 seconds.
150            selection.set_query("SRCTYPE == 1 AND INTERVAL > 60.0")
151        """
152        taql = "SELECT FROM $1 WHERE " + query
153        self._settaql(taql)
154
155    def set_order(self, order):
156        """
157        Set the order the scantable should be sorted by.
158        Parameters:
159            order:    The list of column names to sort by in order
160        """
161        self._setorder(order)
162
163    def get_scans(self):
164        return list(self._getscans())
165    def get_cycles(self):
166        return list(self._getcycles())
167    def get_beams(self):
168        return list(self._getbeams())
169    def get_ifs(self):
170        return list(self._getifs())
171    def get_pols(self):
172        return list(self._getpols())
173    def get_poltypes(self):
174        return list(self._getpoltypes())
175    def get_order(self):
176        return list(self._getorder())
177    def get_query(self):
178        prefix = "SELECT FROM $1 WHERE "
179        return self._gettaql().replace(prefix, "")
180
181    def get_name(self):
182        print "NYI"
183        s = self._gettaql()
184        return
185    def __str__(self):
186        out = ""
187        d = {"SCANNO": self.get_scans(),
188             "CYCLENO": self.get_cycles(),
189             "BEAMNO": self.get_beams(),
190             "IFNO": self.get_ifs(),
191             "Pol Type": self.get_poltypes(),
192             "POLNO": self.get_pols(),
193             "QUERY": self.get_query(),
194             "Sort Order": self.get_order()
195             }
196        for k,v in d.iteritems():
197            if v:
198                out += "%s: %s\n" % (k, v)
199        if len(out):
200            return out[:-1]
201        else:
202            return out
203    def __add__(self, other):
204        """
205        Merge two selections.
206        """
207        union = selector()
208        gets = [[self._getscans(), other._getscans(), union._setscans],
209                [self._getcycles(), other._getcycles(),union._setcycles],
210                [self._getbeams(), other._getbeams(), union._setbeams],
211                [self._getifs(), other._getifs(), union._setifs],
212                [self._getpols(), other._getpols(), union._setpols]]
213        for v in gets:
214            vec = list(v[0]+v[1])
215            vec.sort()
216            v[2](unique(vec))
217        q = other.get_query()
218        qs = self.get_query()
219        if len(q) and len(qs):
220            union.set_query(qs +" AND " + q)
221        else:
222            if len(q):
223                union.set_query(q)
224            elif len(qs):
225                union.set_query(qs)
226        return union
Note: See TracBrowser for help on using the repository browser.