示例#1
0
 def test_isTransformable_oneScan(self):
     obj = _polarvolume.new()
     scan1 = _polarscan.new()
     scan1.elangle = 0.1
     obj.addScan(scan1)
     result = obj.isTransformable()
     self.assertEqual(True, result)
示例#2
0
def makePvolFromFiles(filenames):
    pvol = _polarvolume.new()

    for fstr in filenames:
        rb, param = readRBScanParameter(fstr)
        scan = makeScanFromRB(rb)
        scan.addParameter(param)
        pvol.addScan(scan)

    pvol.sortByElevations(1)

    scan = pvol.getScan(0)
    pvol.date, pvol.time = scan.date, scan.time
    pvol.longitude = float(rb['sensorinfo']['lon']) * dr
    pvol.latitude = float(rb['sensorinfo']['lat']) * dr
    pvol.height = float(rb['sensorinfo']['alt'])

    try:
        nod = NAME2SOURCE[rb['sensorinfo']['@name']]
    except KeyError:
        nod = None
    if nod:
        source = odim_source.SOURCE[nod]
        pvol.source = source.encode(UTF8)

    return pvol
示例#3
0
    def test_getScanWithMaxDistance(self):
        obj = _polarvolume.new()
        s1 = _polarscan.new()
        s1.rscale = 500.0
        s1.elangle = 0.5 * math.pi / 180.0
        s1.longitude = 60.0 * math.pi / 180.0
        s1.latitude = 14.0 * math.pi / 180.0
        s1.height = 100.0
        s1.addAttribute("how/value", "s1")
        p1 = _polarscanparam.new()
        p1.quantity = "DBZH"
        p1.setData(numpy.zeros((100, 120), numpy.uint8))
        s1.addParameter(p1)

        s2 = _polarscan.new()
        s2.rscale = 1000.0
        s2.elangle = 0.5 * math.pi / 180.0
        s2.longitude = 60.0 * math.pi / 180.0
        s2.latitude = 14.0 * math.pi / 180.0
        s2.height = 100.0
        s2.addAttribute("how/value", "s2")
        p2 = _polarscanparam.new()
        p2.quantity = "DBZH"
        p2.setData(numpy.zeros((100, 120), numpy.uint8))
        s2.addParameter(p2)

        obj.addScan(s1)
        obj.addScan(s2)

        result = obj.getScanWithMaxDistance()
        self.assertEqual("s2", result.getAttribute("how/value"))
def generateVolume(files, args):
    if len(files) <= 0:
        raise AttributeError("Volume must consist of at least 1 scan")

    firstscan = False
    volume = _polarvolume.new()
    volume.date = args['date']
    volume.time = args['time']

    #'longitude', 'latitude', 'height', 'time', 'date', 'source'

    for fname in files:
        scan = None
        if ravebdb != None:
            scan = ravebdb.get_rave_object(fname)
        else:
            scan = _raveio.open(fname).object
        if firstscan == False:
            firstscan = True
            volume.longitude = scan.longitude
            volume.latitude = scan.latitude
            volume.height = scan.height
            volume.beamwidth = scan.beamwidth
        volume.addScan(scan)

    volume.source = scan.source  # Recycle the last input, it won't necessarily be correct ...
    odim_source.CheckSource(volume)  # ... so check it!
    return volume
示例#5
0
 def test_addScan_with_elangleInScan(self):
     vol = _polarvolume.new()
     vol.beamwidth = 2.0 * math.pi / 180.0
     scan = _polarscan.new()
     scan.beamwidth = 3.0 * math.pi / 180.0
     vol.addScan(scan)
     self.assertAlmostEqual(3.0 * math.pi / 180.0, scan.beamwidth, 4)
示例#6
0
 def test_source(self):
     obj = _polarvolume.new()
     self.assertEqual(None, obj.source)
     obj.source = "ABC:10, ABD:1"
     self.assertEqual("ABC:10, ABD:1", obj.source)
     obj.source = None
     self.assertEqual(None, obj.source)
示例#7
0
 def test_date(self):
     obj = _polarvolume.new()
     self.assertEqual(None, obj.date)
     obj.date = "20050101"
     self.assertEqual("20050101", obj.date)
     obj.date = None
     self.assertEqual(None, obj.date)
示例#8
0
    def test_getMaxDistance(self):
        s1 = _polarscan.new()
        s1.longitude = 60.0 * math.pi / 180.0
        s1.latitude = 12.0 * math.pi / 180.0
        s1.height = 0.0
        s1.rscale = 1000.0
        s1.elangle = (math.pi / 180.0) * 0.5
        param = _polarscanparam.new()
        param.quantity = "DBZH"
        data = numpy.zeros((10, 10), numpy.int8)
        param.setData(data)
        s1.addParameter(param)

        s2 = _polarscan.new()
        s2.longitude = 60.0 * math.pi / 180.0
        s2.latitude = 12.0 * math.pi / 180.0
        s2.height = 0.0
        s2.rscale = 1000.0
        s2.elangle = (math.pi / 180.0) * 1.5
        param = _polarscanparam.new()
        param.quantity = "DBZH"
        data = numpy.zeros((10, 10), numpy.int8)
        param.setData(data)
        s2.addParameter(param)

        vol = _polarvolume.new()
        vol.addScan(s1)
        vol.addScan(s2)

        self.assertAlmostEqual(10999.45, vol.getMaxDistance(), 2)
示例#9
0
 def test_time(self):
     obj = _polarvolume.new()
     self.assertEqual(None, obj.time)
     obj.time = "200500"
     self.assertEqual("200500", obj.time)
     obj.time = None
     self.assertEqual(None, obj.time)
示例#10
0
def compileVolumeFromScans(scans, adjustTime=True):
    if len(scans) <= 0:
        raise AttributeError("Volume must consist of at least 1 scan")

    firstscan=False  
    volume = _polarvolume.new()

    #'longitude', 'latitude', 'height', 'time', 'date', 'source', 'beamwidth', 'beamwH', beamwV'
    #rave-py3/modules/pypolarscan.c:1712 beamwidth - DEPRECATED, Use beamwH!

    for scan in scans:
        if firstscan == False:
            firstscan = True
            volume.longitude = scan.longitude
            volume.latitude = scan.latitude
            volume.height = scan.height
            volume.beamwidth = scan.beamwidth
            if(hasattr(scan,'beamH')): volume.beamwH = scan.beamwH
            if(hasattr(scan,'beamV')): volume.beamwV = scan.beamwV
        volume.addScan(scan)

    volume.source = scan.source  # Recycle the last input, it won't necessarily be correct ...
    odim_source.CheckSource(volume)    # ... so check it!
 
    # Adjust to closest nomimal time
    if adjustTime:
        if volume.isAscendingScans():
            volume.date, volume.time  = roundDT(volume.date, volume.time)
        else:
            lowest = volume.getScanClosestToElevation(-90.0, 0)
            volume.date, volume.time  = roundDT(lowest.enddate, lowest.endtime)
    return volume
示例#11
0
    def test_clone(self):
        vol = _polarvolume.new()
        vol.longitude = 1.0
        vol.latitude = 2.0
        vol.height = 3.0
        vol.time = "200000"
        vol.date = "20110101"
        vol.source = "CMT:123"
        vol.beamwidth = 4.0
        scan1 = _polarscan.new()
        scan1.elangle = 2.0
        vol.addScan(scan1)

        cpy = vol.clone()

        # Modify the source volume before we test the clone to verify that they aren't bound to each other
        vol.longitude = 4.0
        vol.latitude = 3.0
        vol.height = 2.0
        vol.time = "210000"
        vol.date = "20120101"
        vol.source = "CMT:124"
        vol.beamwidth = 1.0
        vol.getScan(0).elangle = 3.0

        self.assertAlmostEqual(1.0, cpy.longitude, 4)
        self.assertAlmostEqual(2.0, cpy.latitude, 4)
        self.assertAlmostEqual(3.0, cpy.height, 4)
        self.assertEqual("200000", cpy.time)
        self.assertEqual("20110101", cpy.date)
        self.assertAlmostEqual(4.0, cpy.beamwidth, 4)
        self.assertEqual(1, cpy.getNumberOfScans())
        self.assertAlmostEqual(2.0, cpy.getScan(0).elangle, 4)
示例#12
0
 def test_getNumberOfScans(self):
     obj = _polarvolume.new()
     self.assertEqual(0, obj.getNumberOfScans())
     obj.addScan(_polarscan.new())
     self.assertEqual(1, obj.getNumberOfScans())
     obj.addScan(_polarscan.new())
     self.assertEqual(2, obj.getNumberOfScans())
示例#13
0
def to_pvol(self, el):
    import _ctop
    dest = _polarvolume.new()
    scan1 = _polarscan.new()
    scan1.elangle = el
    _ctop.transform(self, dest)
    return dest
示例#14
0
 def test_addScan_dateTime(self):
     obj = _polarvolume.new()
     obj.date = "20100101"
     obj.time = "100000"
     scan = _polarscan.new()
     obj.addScan(scan)
     self.assertEqual("20100101", scan.date)
     self.assertEqual("100000", scan.time)
示例#15
0
    def test_getDistance(self):
        obj = _polarvolume.new()
        obj.longitude = 14.0 * math.pi / 180.0
        obj.latitude = 60.0 * math.pi / 180.0

        result = obj.getDistance(
            (14.0 * math.pi / 180.0, 61.0 * math.pi / 180.0))
        self.assertAlmostEqual(111040.1, result, 1)
示例#16
0
    def test_getHeightField(self):
        polnav = _polarnav.new()
        polnav.lat0 = 60.0 * math.pi / 180.0
        polnav.lon0 = 12.0 * math.pi / 180.0
        polnav.alt0 = 0.0

        expected = []
        rarr = []
        for i in range(10):
            rarr.append(polnav.reToDh(100.0 * i, (math.pi / 180.0) * 0.5)[1])
        rarr.append(-99999.0)
        rarr.append(-99999.0)

        expected.append(rarr)
        rarr = []
        for i in range(12):
            rarr.append(polnav.reToDh(100.0 * i, (math.pi / 180.0) * 1.0)[1])
        expected.append(rarr)

        s1 = _polarscan.new()
        s1.longitude = polnav.lon0  # We want same settings as the polar navigator so that we can test result
        s1.latitude = polnav.lat0
        s1.height = polnav.alt0
        s1.rscale = 100.0
        s1.elangle = (math.pi / 180.0) * 0.5

        p1 = _polarscanparam.new()
        p1.quantity = "DBZH"
        data = numpy.zeros((5, 10), numpy.int8)
        p1.setData(data)

        s1.addParameter(p1)

        s2 = _polarscan.new()
        s2.longitude = polnav.lon0  # We want same settings as the polar navigator so that we can test result
        s2.latitude = polnav.lat0
        s2.height = polnav.alt0
        s2.rscale = 100.0
        s2.elangle = (math.pi / 180.0) * 1.0

        p2 = _polarscanparam.new()
        p2.quantity = "DBZH"
        data = numpy.zeros((5, 12), numpy.int8)
        p2.setData(data)

        s2.addParameter(p2)

        obj = _polarvolume.new()
        obj.addScan(s1)
        obj.addScan(s2)

        f = obj.getHeightField()
        self.assertEqual(12, f.xsize)
        self.assertEqual(2, f.ysize)

        for j in range(2):
            for i in range(12):
                self.assertAlmostEqual(expected[j][i], f.getValue(i, j)[1], 2)
示例#17
0
 def test_time_badValues(self):
     obj = _polarvolume.new()
     values = ["10101", "1010101", "1010ab", "1010x0", "abcdef", 123456]
     for val in values:
         try:
             obj.time = val
             self.fail("Expected ValueError")
         except ValueError:
             pass
示例#18
0
 def test_attribute_visibility(self):
     attrs = [
         'longitude', 'latitude', 'height', 'time', 'date', 'source',
         'paramname'
     ]
     obj = _polarvolume.new()
     alist = dir(obj)
     for a in attrs:
         self.assertEqual(True, a in alist)
示例#19
0
 def test_height_typeError(self):
     obj = _polarvolume.new()
     self.assertAlmostEqual(0.0, obj.height, 4)
     try:
         obj.height = 10
         self.fail("Excepted TypeError")
     except TypeError:
         pass
     self.assertAlmostEqual(0.0, obj.height, 4)
示例#20
0
 def test_latitude_typeError(self):
     obj = _polarvolume.new()
     self.assertAlmostEqual(0.0, obj.latitude, 4)
     try:
         obj.latitude = 10
         self.fail("Excepted TypeError")
     except TypeError:
         pass
     self.assertAlmostEqual(0.0, obj.latitude, 4)
示例#21
0
 def test_date_badValues(self):
     obj = _polarvolume.new()
     values = ["200910101", "2001010", "200a1010", 20091010]
     for val in values:
         try:
             obj.time = val
             self.fail("Expected ValueError")
         except ValueError:
             pass
示例#22
0
 def test_isTransformable_descending(self):
     obj = _polarvolume.new()
     scan1 = _polarscan.new()
     scan1.elangle = 0.1
     scan2 = _polarscan.new()
     scan2.elangle = 0.01
     obj.addScan(scan1)
     obj.addScan(scan2)
     result = obj.isTransformable()
     self.assertEqual(False, result)
示例#23
0
 def test_paramname(self):
     obj = _polarvolume.new()
     self.assertEqual("DBZH", obj.paramname)
     obj.paramname = "MMM"
     self.assertEqual("MMM", obj.paramname)
     try:
         obj.paramname = None
         self.fail("Expected ValueError")
     except ValueError:
         self.assertEqual("MMM", obj.paramname)
示例#24
0
    def test_addScan_refcountIncreaseOnScan(self):
        obj = _polarvolume.new()
        ids = []
        for i in range(50):
            scan = _polarscan.new()
            ids.append(repr(scan))
            obj.addScan(scan)

        for i in range(obj.getNumberOfScans()):
            scan = obj.getScan(i)
            if repr(scan) != repr(obj.getScan(i)):
                self.fail("Failed to verify scan consistency")
示例#25
0
    def test_is_polar_malfunc_pv3(self):
        pv = _polarvolume.new()
        ps1 = _polarscan.new()
        ps1.addAttribute("how/malfunc", 'False')
        ps1.elangle = 1.0
        ps2 = _polarscan.new()
        ps1.addAttribute("how/malfunc", 'True')
        ps2.elangle = 2.0
        pv.addScan(ps1)
        pv.addScan(ps2)

        self.assertEqual(True, rave_util.is_polar_malfunc(pv))
示例#26
0
    def test_use_azimuthal_nav_information_2(self):
        obj = _polarvolume.new()
        scan1 = _polarscan.new()
        scan2 = _polarscan.new()

        obj.addScan(scan1)
        obj.addScan(scan2)

        scan1.use_azimuthal_nav_information = False
        self.assertEqual(True, obj.use_azimuthal_nav_information)
        self.assertEqual(False, scan1.use_azimuthal_nav_information)
        self.assertEqual(True, scan2.use_azimuthal_nav_information)
示例#27
0
    def test_getNearest(self):
        obj = _polarvolume.new()
        obj.longitude = 12.0 * math.pi / 180.0
        obj.latitude = 60.0 * math.pi / 180.0
        obj.height = 0.0
        scan1 = _polarscan.new()
        scan1.elangle = 0.1 * math.pi / 180.0
        scan1.rstart = 0.0
        scan1.rscale = 5000.0
        param = _polarscanparam.new()
        param.nodata = 10.0
        param.undetect = 11.0
        param.quantity = "DBZH"
        data = numpy.zeros((100, 120), numpy.uint8)
        param.setData(data)
        scan1.addParameter(param)

        scan2 = _polarscan.new()
        scan2.elangle = 1.0 * math.pi / 180.0
        scan2.rstart = 0.0
        scan2.rscale = 5000.0
        param = _polarscanparam.new()
        param.nodata = 10.0
        param.undetect = 11.0
        param.quantity = "DBZH"
        data = numpy.ones((100, 120), numpy.uint8)
        param.setData(data)
        scan2.addParameter(param)

        obj.addScan(scan1)
        obj.addScan(scan2)

        # Allow outside ranges
        t, v = obj.getNearest(
            (12.0 * math.pi / 180.0, 60.45 * math.pi / 180.0), 1000.0, 0)
        self.assertEqual(_rave.RaveValueType_DATA, t)
        self.assertAlmostEqual(1.0, v, 4)

        t, v = obj.getNearest(
            (12.0 * math.pi / 180.0, 62.00 * math.pi / 180.0), 1000.0, 0)
        self.assertEqual(_rave.RaveValueType_DATA, t)
        self.assertAlmostEqual(0.0, v, 4)

        # Only allow inside ranges
        t, v = obj.getNearest(
            (12.0 * math.pi / 180.0, 60.45 * math.pi / 180.0), 1000.0, 1)
        self.assertEqual(_rave.RaveValueType_DATA, t)
        self.assertAlmostEqual(1.0, v, 4)

        t, v = obj.getNearest(
            (12.0 * math.pi / 180.0, 62.00 * math.pi / 180.0), 1000.0, 1)
        self.assertEqual(_rave.RaveValueType_NODATA, t)
示例#28
0
    def test_getScan(self):
        obj = _polarvolume.new()
        scan1 = _polarscan.new()
        scan2 = _polarscan.new()

        obj.addScan(scan1)
        obj.addScan(scan2)

        scanresult1 = obj.getScan(0)
        scanresult2 = obj.getScan(1)

        self.assertTrue(scan1 == scanresult1)
        self.assertTrue(scan2 == scanresult2)
示例#29
0
    def test_erroneous_member(self):
        obj = _polarvolume.new()
        try:
            obj.thisshouldnotexist = 10
            self.fail("Expected AttributeError")
        except AttributeError:
            pass

        try:
            v = obj.thisshouldnotexist
            self.fail("Expected AttributeError")
        except AttributeError:
            pass
示例#30
0
    def test_remove_malfunc_from_volume2(self):
        pv = _polarvolume.new()
        pv.addAttribute("how/malfunc", 'True')
        ps1 = _polarscan.new()
        ps1.addAttribute("how/malfunc", 'False')
        ps1.elangle = 1.0
        ps2 = _polarscan.new()
        ps2.elangle = 2.0
        ps2.addAttribute("how/malfunc", 'False')
        pv.addScan(ps1)
        pv.addScan(ps2)

        result = rave_util.remove_malfunc_from_volume(pv)
        self.assertTrue(result == None)