コード例 #1
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_zrA(self):
     gra = _gra.new()
     self.assertAlmostEqual(200.0, gra.zrA, 4)
     gra.zrA = 10
     self.assertAlmostEqual(10.0, gra.zrA, 4)
     gra.zrA = 11.1
     self.assertAlmostEqual(11.1, gra.zrA, 4)
コード例 #2
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_upperThreshold(self):
     gra = _gra.new()
     self.assertAlmostEqual(2.0, gra.upperThreshold, 4)
     gra.upperThreshold = 10
     self.assertAlmostEqual(10.0, gra.upperThreshold, 4)
     gra.upperThreshold = 11.1
     self.assertAlmostEqual(11.1, gra.upperThreshold, 4)
コード例 #3
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_lowerThreshold(self):
     gra = _gra.new()
     self.assertAlmostEqual(-0.25, gra.lowerThreshold, 4)
     gra.lowerThreshold = 10
     self.assertAlmostEqual(10.0, gra.lowerThreshold, 4)
     gra.lowerThreshold = 11.1
     self.assertAlmostEqual(11.1, gra.lowerThreshold, 4)
コード例 #4
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
    def test_apply(self):
        distance = _ravefield.new()
        distance.setData(numpy.zeros((2, 2), numpy.float64))
        distance.setValue(0, 0, 0.1)
        distance.setValue(0, 1, 0.2)
        distance.setValue(1, 0, 0.3)
        distance.setValue(1, 1, 0.4)
        distance.addAttribute("what/gain", 10000.0)
        distance.addAttribute("what/offset", 0.0)

        param = _cartesianparam.new()
        param.setData(numpy.zeros((2, 2), numpy.float64))
        param.setValue((0, 0), 1)
        param.setValue((0, 1), 2)
        param.setValue((1, 0), 3)
        param.setValue((1, 1), 4)
        param.quantity = "ACRR"
        param.gain = 10.0
        param.offset = 2.0

        gra = _gra.new()
        gra.A = 1.0
        gra.B = 2.0
        gra.C = 3.0

        result = gra.apply(distance, param)
        self.assertAlmostEqual(47.77, result.getConvertedValue((0, 0))[1], 2)
        self.assertAlmostEqual(1102.61, result.getConvertedValue((0, 1))[1], 2)
        self.assertAlmostEqual(3200.0, result.getConvertedValue((1, 0))[1], 4)
        self.assertAlmostEqual(4200.0, result.getConvertedValue((1, 1))[1], 4)
コード例 #5
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_C(self):
     gra = _gra.new()
     self.assertAlmostEqual(0.0, gra.C, 4)
     gra.C = 10
     self.assertAlmostEqual(10.0, gra.C, 4)
     gra.C = 11.1
     self.assertAlmostEqual(11.1, gra.C, 4)
コード例 #6
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_zrb(self):
     gra = _gra.new()
     self.assertAlmostEqual(1.6, gra.zrb, 4)
     gra.zrb = 10
     self.assertAlmostEqual(10.0, gra.zrb, 4)
     gra.zrb = 11.1
     self.assertAlmostEqual(11.1, gra.zrb, 4)
コード例 #7
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_attribute_visibility(self):
     attrs = [
         'A', 'B', 'C', 'upperThreshold', 'lowerThreshold', 'zrA', 'zrb'
     ]
     gra = _gra.new()
     alist = dir(gra)
     for a in attrs:
         self.assertEqual(True, a in alist)
コード例 #8
0
ファイル: compositing.py プロジェクト: aperezhortal/rave
    def _apply_gra(self, result, d, t):
        if nodomdb:
            self.logger.info(
                "Could not load rave_dom_db, probably due to missing dependencies like jprops or sqlalchemy, ignoring gra correction"
            )
            return

        try:
            zrA = self.zr_A
            zrb = self.zr_b
            db = rave_dom_db.create_db_from_conf()
            dt = datetime.datetime(int(d[:4]), int(d[4:6]), int(d[6:]),
                                   int(t[:2]), int(t[2:4]), 0)
            dt = dt - datetime.timedelta(
                seconds=3600 * 12)  # 12 hours back in time for now..

            gra = _gra.new()
            gra.A = DEFAULTA
            gra.B = DEFAULTB
            gra.C = DEFAULTC
            gra.zrA = zrA
            gra.zrb = zrb

            grac = db.get_gra_coefficient(dt)
            if grac != None and not math.isnan(grac.a) and not math.isnan(
                    grac.b) and not math.isnan(grac.c):
                if self.verbose:
                    self.logger.debug(
                        "Applying gra coefficients from database")
                gra.A = grac.a
                gra.B = grac.b
                gra.C = grac.c
            else:
                self.logger.info(
                    "Could not find coefficients for given time, trying to get aged or climatologic coefficients"
                )
                nowdt = datetime.datetime(int(d[:4]), int(d[4:6]), int(d[6:]),
                                          int(t[:2]), int(t[2:4]), 0)
                agedt = nowdt - datetime.timedelta(
                    seconds=3600 * 48)  # 2 days back
                sig, pts, loss, r, rsig, corr, gra.A, gra.B, gra.C, mean, dev = self.get_backup_gra_coefficient(
                    db, agedt, nowdt)

            dfield = result.findQualityFieldByHowTask(
                "se.smhi.composite.distance.radar")
            param = result.getParameter(self.quantity)
            gra_field = gra.apply(dfield, param)
            gra_field.quantity = self.quantity + "_CORR"
            return gra_field
        except Exception:
            import traceback
            traceback.print_exc()
            self.logger.error("Failed to apply gra coefficients", exc_info=1)
        return None
コード例 #9
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
    def test_apply_DBZH_gain2000(self):
        distance = _ravefield.new()
        distance.setData(numpy.zeros((1, 1), numpy.float64))
        distance.setValue(0, 0, 13)
        distance.addAttribute("what/gain", 2000.0)
        distance.addAttribute("what/offset", 0.0)

        param = _cartesianparam.new()
        param.setData(numpy.zeros((1, 1), numpy.float64))
        param.setValue((0, 0), 78)
        param.quantity = "DBZH"
        param.gain = 0.4
        param.offset = -30.0

        gra = _gra.new()
        gra.A = 0.323868
        gra.B = -0.001078
        gra.C = 0.000018
        gra.zrA = 200.0
        gra.zrb = 1.6

        result = gra.apply(distance, param)

        self.assertAlmostEqual(79.23, result.getValue((0, 0))[1], 2)
コード例 #10
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
    def test_apply_DBZH(self):
        distance = _ravefield.new()
        distance.setData(numpy.zeros((2, 2), numpy.float64))
        distance.setValue(0, 0, 0.1)
        distance.setValue(0, 1, 0.2)
        distance.setValue(1, 0, 0.3)
        distance.setValue(1, 1, 0.4)
        distance.addAttribute("what/gain", 10000.0)
        distance.addAttribute("what/offset", 0.0)

        param = _cartesianparam.new()
        param.setData(numpy.zeros((2, 2), numpy.float64))
        param.setValue((0, 0), 1)
        param.setValue((0, 1), 2)
        param.setValue((1, 0), 3)
        param.setValue((1, 1), 4)
        param.quantity = "DBZH"
        param.gain = 10.0
        param.offset = 2.0

        gra = _gra.new()
        gra.A = 1.0
        gra.B = 2.0
        gra.C = 3.0
        gra.zrA = 100.0
        gra.zrb = 1.1

        result = gra.apply(distance, param)

        self.assertAlmostEqual(18.60, result.getConvertedValue((0, 0))[1], 2)
        self.assertAlmostEqual(40.7, result.getConvertedValue((0, 1))[1], 2)
        self.assertAlmostEqual(54.0, result.getConvertedValue((1, 0))[1], 4)
        self.assertAlmostEqual(64.0, result.getConvertedValue((1, 1))[1], 4)
        self.assertEqual(
            "GRA: A=1.000000, B=2.000000, C=3.000000, low_db=-0.250000, high_db=2.000000",
            result.getAttribute("how/task_args"))
コード例 #11
0
ファイル: PyGraTest.py プロジェクト: aperezhortal/rave
 def test_new(self):
     obj = _gra.new()
     self.assertNotEqual(-1, str(type(obj)).find("GraCore"))
コード例 #12
0
def generate(files, arguments):
    args = arglist2dict(arguments)

    zr_a = 200.0
    zr_b = 1.6
    quantity = "DBZH"
    accept = 0.0
    distancefield = "se.smhi.composite.distance.radar"
    hours = 1
    N = 5
    applygra = False

    #Accept is the required limit for how many nodata-pixels that are allowed in order for the
    #data to be accumulated
    #If we expect to have 10 observations and an accept limit of 20, then it can be 0, 1 or 2 observations
    #with nodata for that position.

    etime = args["time"]
    edate = args["date"]

    img = None

    if "zra" in args.keys():
        zr_a = float(args["zra"])
    if "zrb" in args.keys():
        zr_b = float(args["zrb"])
    if "quantity" in args.keys():
        quantity = args["quantity"]
    if "accept" in args.keys():
        accept = float(args["accept"]) / 100.0
    if "distancefield" in args.keys():
        distancefield = args["distancefield"]
    if "hours" in args.keys():
        hours = int(args["hours"])
    if "N" in args.keys():
        N = int(args["N"])
    if "applygra" in args:
        applygra = True

    if distancefield == "eu.baltrad.composite.quality.distance.radar":
        distancefield = "se.smhi.composite.distance.radar"

    pdatetime = datetime.datetime.strptime(
        edate + etime, "%Y%m%d%H%M%S") - datetime.timedelta(minutes=60 * hours)
    sdate = pdatetime.strftime("%Y%m%d")
    stime = pdatetime.strftime("%H%M00")

    acrr = _acrr.new()
    acrr.nodata = -1.0
    acrr.undetect = 0.0
    acrr.quality_field_name = distancefield

    nodes = None

    for fname in files:
        obj = None
        if ravebdb != None:
            obj = ravebdb.get_rave_object(fname)
        else:
            rio = _raveio.open(fname)
            obj = rio.object

        if _cartesianvolume.isCartesianVolume(obj):
            obj = obj.getImage(0)

        if not _cartesian.isCartesian(obj):
            raise AttributeError("Must call plugin with cartesian products")

        if img == None:
            img = _cartesian.new()
            img.xscale = obj.xscale
            img.yscale = obj.yscale
            img.areaextent = obj.areaextent
            img.projection = obj.projection
            img.product = _rave.Rave_ProductType_RR
            img.source = obj.source
            img.time = etime
            img.date = edate
            img.startdate = sdate
            img.starttime = stime
            img.enddate = edate
            img.endtime = etime

        if obj.hasAttribute("how/nodes") and nodes == None:
            nodes = obj.getAttribute("how/nodes")

        if obj.xscale != img.xscale or obj.yscale != img.yscale or \
          obj.projection.definition != img.projection.definition:
            raise AttributeError(
                "Scale or projdef inconsistancy for used area")

        par = obj.getParameter(quantity)
        if par == None:
            logger.warn("Could not find parameter (%s) for %s %s" %
                        (quantity, obj.date, obj.time))
        else:
            if par.getQualityFieldByHowTask(distancefield) != None:
                acrr.sum(par, zr_a, zr_b)

    # accept, N, hours
    result = acrr.accumulate(accept, N, hours)

    fileno, outfile = rave_tempfile.mktemp(suffix='.h5', close="True")
    if nodes != None:
        img.addAttribute("how/nodes", nodes)

    img.addParameter(result)

    #logger.info("Apply gra: %s"%`applygra`)
    if applygra:
        db = rave_dom_db.create_db_from_conf()
        dt = datetime.datetime(int(edate[:4]), int(edate[4:6]), int(edate[6:]),
                               int(etime[:2]), int(etime[2:4]), 0)
        dt = dt - datetime.timedelta(
            seconds=3600 * 12)  # 12 hours back in time for now..

        gra = _gra.new()
        gra.A = DEFAULTA
        gra.B = DEFAULTB
        gra.C = DEFAULTC
        gra.zrA = zr_a
        gra.zrb = zr_b

        grac = db.get_gra_coefficient(dt)
        if grac != None and not math.isnan(grac.a) and not math.isnan(
                grac.b) and not math.isnan(grac.c):
            logger.debug("Using gra coefficients from database, quantity: %s" %
                         quantity)
            gra.A = grac.a
            gra.B = grac.b
            gra.C = grac.c
        else:
            logger.info(
                "Could not find coefficients for given time, trying to get aged or climatologic coefficients"
            )
            nowdt = datetime.datetime(int(edate[:4]), int(edate[4:6]),
                                      int(edate[6:]), int(etime[:2]),
                                      int(etime[2:4]), 0)
            agedt = nowdt - datetime.timedelta(
                seconds=3600 * 48)  # 2 days back
            sig, pts, loss, r, rsig, corr, gra.A, gra.B, gra.C, mean, dev = get_backup_gra_coefficient(
                db, agedt, nowdt)

        dfield = result.getQualityFieldByHowTask(distancefield)

        gra_field = gra.apply(dfield, result)

        gra_field.quantity = result.quantity + "_CORR"
        img.addParameter(gra_field)

    ios = _raveio.new()
    ios.object = img
    ios.filename = outfile
    ios.version = RAVE_IO_DEFAULT_VERSION
    ios.save()

    return outfile