Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:48:49

0001 #!/usr/bin/env python
0002 #
0003 # Copyright (c) 2019 Opticks Team. All Rights Reserved.
0004 #
0005 # This file is part of Opticks
0006 # (see https://bitbucket.org/simoncblyth/opticks).
0007 #
0008 # Licensed under the Apache License, Version 2.0 (the "License"); 
0009 # you may not use this file except in compliance with the License.  
0010 # You may obtain a copy of the License at
0011 #
0012 #   http://www.apache.org/licenses/LICENSE-2.0
0013 #
0014 # Unless required by applicable law or agreed to in writing, software 
0015 # distributed under the License is distributed on an "AS IS" BASIS, 
0016 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
0017 # See the License for the specific language governing permissions and 
0018 # limitations under the License.
0019 #
0020 
0021 
0022 import os, logging
0023 log = logging.getLogger(__name__)
0024 
0025 
0026 class OpticksQuery(object):
0027     """
0028     Analogue of okc/OpticksQuery.cc
0029     """
0030     RANGE_ = "range:"
0031 
0032     INDEX_ = "index:"
0033     DEPTH_ = "depth:"
0034 
0035     NONE = 0
0036     RANGE = 1
0037     INDEX = 2
0038 
0039     def __init__(self, query):
0040         elem = query.split(",")
0041 
0042         self.type_ = self.NONE 
0043         self.range_ = []
0044         self.index = 0
0045         self.index_depth = 0   # depth of the index
0046         self.depth = 0         # relative depth from the index
0047 
0048         for q in elem:
0049             self.parseQueryElement(q)
0050         pass
0051         self.query = query 
0052 
0053         if self.type_ == self.RANGE:
0054             self.expect = self.expected_range_count()
0055         else:
0056             self.expect = None
0057         pass
0058 
0059     def __repr__(self):
0060         return "OpticksQuery %s range %r index %s depth %s  " % (self.query, self.range_, self.index, self.depth)  
0061 
0062 
0063     def check_selected_count(self, count):
0064         if self.type_ != self.RANGE: return
0065         assert self.expect == count, ( "expect %s count %s " % (self.expect, count))
0066         log.info("count %s matches expectation " % count )
0067 
0068     def expected_range_count(self):
0069         """
0070         * slice style range selection 0:10 corresponds to 10 items from 0 to 9 inclusive 
0071         """
0072         expected_ = 0 
0073         for i in range(len(self.range_)/2):
0074             expected_ += self.range_[i*2+1] - self.range_[i*2+0] 
0075             pass
0076         return expected_
0077 
0078     def selected(self, name, index, depth, recursive_select_=False):
0079         """
0080         """
0081         selected_ = False
0082         if self.type_ == self.NONE:
0083              selected_ = True
0084         elif self.type_ == self.RANGE and len(self.range_) > 0:
0085             assert len(self.range_) % 2 == 0 
0086             for i in range(len(self.range_)/2):
0087                 if index >= self.range_[i*2+0] and index < self.range_[i*2+1]:
0088                     selected_ = True
0089                 pass
0090             pass
0091         elif self.type_ == self.INDEX and self.index > 0:
0092             if index == self.index:
0093                 self.index_depth = depth 
0094                 log.info("index found at depth %s " % self.index_depth ) # departs from OpticksQuery.cc
0095                 selected_ = True
0096                 recursive_select_ = True
0097             elif recursive_select_:
0098                 if self.index_depth > 0 and depth < self.index_depth + self.depth:
0099                     selected_ = True 
0100                 pass
0101             pass
0102         else:
0103             pass
0104         pass
0105         return selected_, recursive_select_
0106 
0107 
0108     def __call__(self, index):
0109         return self.selected("dummy", index, -1)
0110 
0111         
0112     def parseQueryElement(self, q):
0113         if q.startswith(self.RANGE_):
0114             self.type_ = self.RANGE
0115             elem = q[len(self.RANGE_):].split(":")
0116             assert len(elem) == 2 
0117             self.range_.append(int(elem[0]))
0118             self.range_.append(int(elem[1]))
0119         elif q.startswith(self.INDEX_):
0120             self.type_ = self.INDEX
0121             self.index = int(q[len(self.INDEX_):])
0122         elif q.startswith(self.DEPTH_):
0123             self.depth = int(q[len(self.DEPTH_):])
0124         else:
0125             pass
0126         pass
0127 
0128 
0129 
0130 def test_multirange():
0131     q_ = "range:3155:3156,range:4448:4449"
0132     q = OpticksQuery(q_)
0133     print(q)
0134     s = filter(lambda i:q(i)[0] == True, range(3000,5000))
0135     print(s)
0136     assert s == [3155, 4448]
0137     assert len(s) == 2, s  
0138 
0139 
0140 
0141 if __name__ == '__main__':
0142 
0143     logging.basicConfig(level=logging.INFO)
0144     #q_ = "range:10:21"
0145     #q_ = "index:4,depth:2"
0146 
0147     test_multirange() 
0148 
0149 
0150 
0151 
0152 
0153    
0154     
0155 
0156