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)
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)
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)
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)
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)
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)
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)
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
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)
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"))
def test_new(self): obj = _gra.new() self.assertNotEqual(-1, str(type(obj)).find("GraCore"))
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