{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "initial_id", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:07.125944Z", "start_time": "2024-08-06T11:43:07.121495Z" }, "collapsed": true, "tags": [ "remove-cell" ] }, "outputs": [], "source": [ "#|hide\n", "#|default_exp qcrad" ] }, { "cell_type": "markdown", "id": "cf56cd614fb8d48a", "metadata": { "collapsed": false }, "source": [ "# PyrNet automatic quality checks\n", "In the following, functions for automatic quality screening are developed. Including BSRN recommended physical and rare limits, as well as network sanity checks." ] }, { "cell_type": "code", "execution_count": 2, "id": "10e20462eea472cd", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:10.908256Z", "start_time": "2024-08-06T11:43:07.241659Z" }, "collapsed": false }, "outputs": [], "source": [ "#|export\n", "import xarray as xr\n", "import numpy as np\n", "import warnings\n", "import logging\n", "\n", "import pyrnet.data\n", "import pyrnet.utils\n", "\n", "\n", "# logging setup\n", "logging.basicConfig(\n", " filename='pyrnet.log',\n", " encoding='utf-8',\n", " level=logging.DEBUG,\n", " format='%(asctime)s %(name)s %(levelname)s:%(message)s'\n", ")\n", "logger = logging.getLogger(__name__)" ] }, { "cell_type": "code", "execution_count": 3, "id": "933ea329f4416a5e", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.500362Z", "start_time": "2024-08-06T11:43:10.911578Z" }, "collapsed": false }, "outputs": [], "source": [ "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": 4, "id": "46c99745dd91bc2b", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.505940Z", "start_time": "2024-08-06T11:43:11.502086Z" }, "collapsed": false }, "outputs": [], "source": [ "#|export\n", "class CONSTANTS:\n", " S0 = 1367 # W m-2\n", " k = 5.67*1e-8" ] }, { "cell_type": "markdown", "id": "80c0dbd48c9039c1", "metadata": { "collapsed": false }, "source": [ "## BSRN recommended checks\n", "BSRN recommends thresholds for physical and rare limits of GHI data" ] }, { "cell_type": "code", "execution_count": 5, "id": "f3b0a3fe1b692933", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.515348Z", "start_time": "2024-08-06T11:43:11.509265Z" }, "collapsed": false }, "outputs": [], "source": [ "#|export\n", "class QCCode:\n", " \"\"\" BSRN quality codes\n", " https://wiki.pangaea.de/wiki/BSRN_Toolbox#Quality_Check\n", " \"\"\"\n", " below_physical = 2**0 # 1\n", " above_phyiscal = 2**1 # 2\n", " below_rare = 2**2 # 4\n", " above_rare = 2**3 # 8\n", " compare_to_low = 2**4 # 16\n", " compare_to_high = 2**5 # 32\n", " quality_control_failed = 2**6 # 64" ] }, { "cell_type": "markdown", "id": "94006795", "metadata": {}, "source": [ "## Additional Flags\n", "Outlier and probability of bird or random shading detection" ] }, { "cell_type": "code", "execution_count": 6, "id": "2b9a3dcd", "metadata": {}, "outputs": [], "source": [ "#|export\n", "class FLCode:\n", " \"\"\" Codes for additional pyrnet flags.\n", " \"\"\"\n", " low_outlier = 2**0 # 1\n", " strong_fluctuation = 2**1 # 2 Strong fluctuation, which maybe logger failiure\n", " not_applicable = 2**2" ] }, { "cell_type": "markdown", "id": "66d85261e2c99f10", "metadata": { "collapsed": false }, "source": [ "## Load test dataset:" ] }, { "cell_type": "code", "execution_count": 7, "id": "6dd8e1d8c7a00692", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.693921Z", "start_time": "2024-08-06T11:43:11.517968Z" }, "collapsed": false, "tags": [ "hide-input", "hide-output" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 1kB\n",
       "Dimensions:               (station: 1, time: 9, maintenancetime: 1)\n",
       "Coordinates:\n",
       "  * station               (station) float64 8B 1.0\n",
       "  * time                  (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n",
       "  * maintenancetime       (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n",
       "Data variables: (12/20)\n",
       "    ghi                   (time, station) float64 72B 280.9 280.9 ... 280.9\n",
       "    gti                   (time, station) float64 72B 288.9 288.9 ... 289.4\n",
       "    ta                    (time, station) float64 72B 294.8 294.7 ... 294.8\n",
       "    rh                    (time, station) float64 72B 0.6253 0.6248 ... 0.629\n",
       "    battery_voltage       (time, station) float64 72B 6.443 6.445 ... 6.465\n",
       "    gti_min               (time, station) float64 72B 288.7 288.7 ... 288.7\n",
       "    ...                    ...\n",
       "    maintenance_flag_gti  (maintenancetime, station) float32 4B 7.0\n",
       "    szen                  (time, station) float64 72B 42.51 42.51 ... 42.51\n",
       "    sazi                  (time, station) float64 72B 182.9 182.9 ... 182.9\n",
       "    esd                   (station) float64 8B 1.01\n",
       "    qc_flag_ghi           (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n",
       "    qc_flag_gti           (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n",
       "Attributes: (12/31)\n",
       "    Conventions:               CF-1.10, ACDD-1.3\n",
       "    title:                     TROPOS pyranometer network (PyrNet) observatio...\n",
       "    history:                   2024-05-31T13:47:06: Generated level l1a  by p...\n",
       "    institution:               Leibniz Institute for Tropospheric Research (T...\n",
       "    source:                    TROPOS pyranometer network (PyrNet)\n",
       "    references:                https://doi.org/10.5194/amt-9-1153-2016\n",
       "    ...                        ...\n",
       "    geospatial_lon_max:        11.885252\n",
       "    geospatial_lon_units:      degE\n",
       "    time_coverage_start:       2022-08-30T11:21:01\n",
       "    time_coverage_end:         2022-08-30T11:21:09\n",
       "    time_coverage_duration:    P0DT0H0M8S\n",
       "    time_coverage_resolution:  P0DT0H0M1S
" ], "text/plain": [ " Size: 1kB\n", "Dimensions: (station: 1, time: 9, maintenancetime: 1)\n", "Coordinates:\n", " * station (station) float64 8B 1.0\n", " * time (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n", " * maintenancetime (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n", "Data variables: (12/20)\n", " ghi (time, station) float64 72B 280.9 280.9 ... 280.9\n", " gti (time, station) float64 72B 288.9 288.9 ... 289.4\n", " ta (time, station) float64 72B 294.8 294.7 ... 294.8\n", " rh (time, station) float64 72B 0.6253 0.6248 ... 0.629\n", " battery_voltage (time, station) float64 72B 6.443 6.445 ... 6.465\n", " gti_min (time, station) float64 72B 288.7 288.7 ... 288.7\n", " ... ...\n", " maintenance_flag_gti (maintenancetime, station) float32 4B 7.0\n", " szen (time, station) float64 72B 42.51 42.51 ... 42.51\n", " sazi (time, station) float64 72B 182.9 182.9 ... 182.9\n", " esd (station) float64 8B 1.01\n", " qc_flag_ghi (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n", " qc_flag_gti (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n", "Attributes: (12/31)\n", " Conventions: CF-1.10, ACDD-1.3\n", " title: TROPOS pyranometer network (PyrNet) observatio...\n", " history: 2024-05-31T13:47:06: Generated level l1a by p...\n", " institution: Leibniz Institute for Tropospheric Research (T...\n", " source: TROPOS pyranometer network (PyrNet)\n", " references: https://doi.org/10.5194/amt-9-1153-2016\n", " ... ...\n", " geospatial_lon_max: 11.885252\n", " geospatial_lon_units: degE\n", " time_coverage_start: 2022-08-30T11:21:01\n", " time_coverage_end: 2022-08-30T11:21:09\n", " time_coverage_duration: P0DT0H0M8S\n", " time_coverage_resolution: P0DT0H0M1S" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#|dropcode\n", "#|dropout\n", "fname = \"../../example_data/to_l1b_output.nc\"\n", "ds_l1b = xr.load_dataset(fname)\n", "ds_l1b " ] }, { "cell_type": "markdown", "id": "a1ff010e73b142fa", "metadata": { "collapsed": false }, "source": [ "## Function to initialize qc-flag variables:" ] }, { "cell_type": "code", "execution_count": 8, "id": "7d76db3bef479c3d", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.702786Z", "start_time": "2024-08-06T11:43:11.695578Z" }, "collapsed": false, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "#|export\n", "#|dropcode\n", "def init_qc_flag(ds, var):\n", " qc_bits = [2**i for i in range(7)]\n", " # ds[f\"qc_flag_{var}\"] = ds[var].copy()\n", " # ds[f\"qc_flag_{var}\"] = np.zeros(ds[var].shape).astype(np.ubyte)\n", " ds = ds.assign({f\"qc_flag_{var}\": (ds[var].dims, np.zeros(ds[var].shape).astype(np.ubyte))})\n", " attrs = {\n", " \"standard_name\": \"quality_flag\",\n", " \"ancillary_variables\": var,\n", " \"valid_range\": [0, np.sum(qc_bits)],\n", " \"flag_masks\": qc_bits,\n", " \"flag_values\": qc_bits,\n", " \"flag_meanings\": str(\n", " \"below_physical_limit\" + \" \" +\n", " \"above_physical_limit\" + \" \" +\n", " \"below_rare_limit\" + \" \" +\n", " \"above_rare_limit\" + \" \" +\n", " \"comparison_to_low\" + \" \" +\n", " \"comparison_to_high\" + \" \"+\n", " \"quality_control_failed\"\n", " )\n", " }\n", " ds[f\"qc_flag_{var}\"].attrs.update(attrs)\n", " ds[f\"qc_flag_{var}\"].encoding.update({\n", " \"dtype\": \"u1\",\n", " \"_FillValue\": 255,\n", " \"zlib\": True\n", " })\n", " \n", " # update flux var ancillary variables\n", " if \"ancillary_variables\" in ds[var].attrs:\n", " avars = ds[var].attrs[\"ancillary_variables\"] + \" \"\n", " else:\n", " avars = \"\"\n", " if f\"qc_flag_{var}\" not in avars:\n", " ds[var].attrs.update({\"ancillary_variables\": avars + f\"qc_flag_{var}\"})\n", " \n", " return ds\n", "\n", "def init_additional_flag(ds, var):\n", " qc_bits = [2**i for i in range(3)]\n", " ds = ds.assign({f\"add_flag_{var}\": (ds[var].dims, np.zeros(ds[var].shape).astype(np.ubyte))})\n", " attrs = {\n", " \"standard_name\": \"quality_flag\",\n", " \"ancillary_variables\": var,\n", " \"valid_range\": [0, np.sum(qc_bits)],\n", " \"flag_masks\": qc_bits,\n", " \"flag_values\": qc_bits,\n", " \"flag_meanings\": str(\n", " \"low_outlier\" + \" \" +\n", " \"strong_fluctuation\" + \" \" +\n", " \"not_applicable\"\n", " )\n", " }\n", " ds[f\"add_flag_{var}\"].attrs.update(attrs)\n", " ds[f\"add_flag_{var}\"].encoding.update({\n", " \"dtype\": \"u1\",\n", " \"_FillValue\": 255,\n", " \"zlib\": True\n", " })\n", " \n", " # update flux var ancillary variables\n", " if \"ancillary_variables\" in ds[var].attrs:\n", " avars = ds[var].attrs[\"ancillary_variables\"] + \" \"\n", " else:\n", " avars = \"\"\n", " if f\"add_flag_{var}\" not in avars:\n", " ds[var].attrs.update({\"ancillary_variables\": avars + f\"add_flag_{var}\"})\n", " \n", " return ds" ] }, { "cell_type": "markdown", "id": "264a6b61b518fdf8", "metadata": { "collapsed": false }, "source": [ "## Initialize qc-flags for dataset" ] }, { "cell_type": "code", "execution_count": 9, "id": "a09283de54f67de1", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.751558Z", "start_time": "2024-08-06T11:43:11.705056Z" }, "collapsed": false, "tags": [ "hide-output" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 1kB\n",
       "Dimensions:               (station: 1, time: 9, maintenancetime: 1)\n",
       "Coordinates:\n",
       "  * station               (station) float64 8B 1.0\n",
       "  * time                  (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n",
       "  * maintenancetime       (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n",
       "Data variables: (12/22)\n",
       "    ghi                   (time, station) float64 72B 280.9 280.9 ... 280.9\n",
       "    gti                   (time, station) float64 72B 288.9 288.9 ... 289.4\n",
       "    ta                    (time, station) float64 72B 294.8 294.7 ... 294.8\n",
       "    rh                    (time, station) float64 72B 0.6253 0.6248 ... 0.629\n",
       "    battery_voltage       (time, station) float64 72B 6.443 6.445 ... 6.465\n",
       "    gti_min               (time, station) float64 72B 288.7 288.7 ... 288.7\n",
       "    ...                    ...\n",
       "    sazi                  (time, station) float64 72B 182.9 182.9 ... 182.9\n",
       "    esd                   (station) float64 8B 1.01\n",
       "    qc_flag_ghi           (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    qc_flag_gti           (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    add_flag_ghi          (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    add_flag_gti          (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "Attributes: (12/31)\n",
       "    Conventions:               CF-1.10, ACDD-1.3\n",
       "    title:                     TROPOS pyranometer network (PyrNet) observatio...\n",
       "    history:                   2024-05-31T13:47:06: Generated level l1a  by p...\n",
       "    institution:               Leibniz Institute for Tropospheric Research (T...\n",
       "    source:                    TROPOS pyranometer network (PyrNet)\n",
       "    references:                https://doi.org/10.5194/amt-9-1153-2016\n",
       "    ...                        ...\n",
       "    geospatial_lon_max:        11.885252\n",
       "    geospatial_lon_units:      degE\n",
       "    time_coverage_start:       2022-08-30T11:21:01\n",
       "    time_coverage_end:         2022-08-30T11:21:09\n",
       "    time_coverage_duration:    P0DT0H0M8S\n",
       "    time_coverage_resolution:  P0DT0H0M1S
" ], "text/plain": [ " Size: 1kB\n", "Dimensions: (station: 1, time: 9, maintenancetime: 1)\n", "Coordinates:\n", " * station (station) float64 8B 1.0\n", " * time (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n", " * maintenancetime (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n", "Data variables: (12/22)\n", " ghi (time, station) float64 72B 280.9 280.9 ... 280.9\n", " gti (time, station) float64 72B 288.9 288.9 ... 289.4\n", " ta (time, station) float64 72B 294.8 294.7 ... 294.8\n", " rh (time, station) float64 72B 0.6253 0.6248 ... 0.629\n", " battery_voltage (time, station) float64 72B 6.443 6.445 ... 6.465\n", " gti_min (time, station) float64 72B 288.7 288.7 ... 288.7\n", " ... ...\n", " sazi (time, station) float64 72B 182.9 182.9 ... 182.9\n", " esd (station) float64 8B 1.01\n", " qc_flag_ghi (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " qc_flag_gti (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " add_flag_ghi (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " add_flag_gti (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", "Attributes: (12/31)\n", " Conventions: CF-1.10, ACDD-1.3\n", " title: TROPOS pyranometer network (PyrNet) observatio...\n", " history: 2024-05-31T13:47:06: Generated level l1a by p...\n", " institution: Leibniz Institute for Tropospheric Research (T...\n", " source: TROPOS pyranometer network (PyrNet)\n", " references: https://doi.org/10.5194/amt-9-1153-2016\n", " ... ...\n", " geospatial_lon_max: 11.885252\n", " geospatial_lon_units: degE\n", " time_coverage_start: 2022-08-30T11:21:01\n", " time_coverage_end: 2022-08-30T11:21:09\n", " time_coverage_duration: P0DT0H0M8S\n", " time_coverage_resolution: P0DT0H0M1S" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#|dropout\n", "config = pyrnet.data.get_config()\n", "\n", "for var in config[\"radflux_varname\"]:\n", " ds_l1b = init_qc_flag(ds_l1b, var) \n", " ds_l1b = init_additional_flag(ds_l1b, var) \n", "\n", "ds_l1b" ] }, { "cell_type": "markdown", "id": "74a19376e53face8", "metadata": { "collapsed": false }, "source": [ "## Prepare ancillary variables" ] }, { "cell_type": "code", "execution_count": 10, "id": "c12c02028d333f4", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:11.759134Z", "start_time": "2024-08-06T11:43:11.753824Z" }, "collapsed": false }, "outputs": [], "source": [ "szen = ds_l1b.szen.values\n", "mu0 = np.cos(np.deg2rad(szen))\n", "mu0[mu0 < 0] = 0 # exclude night\n", "esd = ds_l1b.esd.values\n", "Sa = CONSTANTS.S0 / esd**2" ] }, { "cell_type": "markdown", "id": "761ca9941636e5ee", "metadata": { "collapsed": false }, "source": [ "## Perform quality checks on GHI (main pyranometer) and GTI (extra pyranometer).\n", "Check if GTI is tilted and if so, apply a simple conversion to horizontal irradiance for the quality checks." ] }, { "cell_type": "code", "execution_count": 11, "id": "5d797bd16478c491", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:14.721319Z", "start_time": "2024-08-06T11:43:11.762289Z" }, "collapsed": false, "tags": [ "hide-input", "hide-output" ] }, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\witthuhn\\AppData\\Local\\Temp\\ipykernel_16388\\4238324457.py:66: RuntimeWarning: Mean of empty slice\n", " all_values_mean_no_tilt = np.nanmean(all_values[:,~all_values_tilted_flag],axis=1)\n", "C:\\Users\\witthuhn\\AppData\\Local\\Temp\\ipykernel_16388\\4238324457.py:67: RuntimeWarning: Mean of empty slice\n", " all_values_mean_tilt = np.nanmean(all_values[:,all_values_tilted_flag],axis=1)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 1kB\n",
       "Dimensions:               (station: 1, time: 9, maintenancetime: 1)\n",
       "Coordinates:\n",
       "  * station               (station) float64 8B 1.0\n",
       "  * time                  (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n",
       "  * maintenancetime       (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n",
       "Data variables: (12/22)\n",
       "    ghi                   (time, station) float64 72B 280.9 280.9 ... 280.9\n",
       "    gti                   (time, station) float64 72B 288.9 288.9 ... 289.4\n",
       "    ta                    (time, station) float64 72B 294.8 294.7 ... 294.8\n",
       "    rh                    (time, station) float64 72B 0.6253 0.6248 ... 0.629\n",
       "    battery_voltage       (time, station) float64 72B 6.443 6.445 ... 6.465\n",
       "    gti_min               (time, station) float64 72B 288.7 288.7 ... 288.7\n",
       "    ...                    ...\n",
       "    sazi                  (time, station) float64 72B 182.9 182.9 ... 182.9\n",
       "    esd                   (station) float64 8B 1.01\n",
       "    qc_flag_ghi           (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    qc_flag_gti           (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    add_flag_ghi          (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    add_flag_gti          (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "Attributes: (12/31)\n",
       "    Conventions:               CF-1.10, ACDD-1.3\n",
       "    title:                     TROPOS pyranometer network (PyrNet) observatio...\n",
       "    history:                   2024-05-31T13:47:06: Generated level l1a  by p...\n",
       "    institution:               Leibniz Institute for Tropospheric Research (T...\n",
       "    source:                    TROPOS pyranometer network (PyrNet)\n",
       "    references:                https://doi.org/10.5194/amt-9-1153-2016\n",
       "    ...                        ...\n",
       "    geospatial_lon_max:        11.885252\n",
       "    geospatial_lon_units:      degE\n",
       "    time_coverage_start:       2022-08-30T11:21:01\n",
       "    time_coverage_end:         2022-08-30T11:21:09\n",
       "    time_coverage_duration:    P0DT0H0M8S\n",
       "    time_coverage_resolution:  P0DT0H0M1S
" ], "text/plain": [ " Size: 1kB\n", "Dimensions: (station: 1, time: 9, maintenancetime: 1)\n", "Coordinates:\n", " * station (station) float64 8B 1.0\n", " * time (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n", " * maintenancetime (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n", "Data variables: (12/22)\n", " ghi (time, station) float64 72B 280.9 280.9 ... 280.9\n", " gti (time, station) float64 72B 288.9 288.9 ... 289.4\n", " ta (time, station) float64 72B 294.8 294.7 ... 294.8\n", " rh (time, station) float64 72B 0.6253 0.6248 ... 0.629\n", " battery_voltage (time, station) float64 72B 6.443 6.445 ... 6.465\n", " gti_min (time, station) float64 72B 288.7 288.7 ... 288.7\n", " ... ...\n", " sazi (time, station) float64 72B 182.9 182.9 ... 182.9\n", " esd (station) float64 8B 1.01\n", " qc_flag_ghi (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " qc_flag_gti (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " add_flag_ghi (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " add_flag_gti (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", "Attributes: (12/31)\n", " Conventions: CF-1.10, ACDD-1.3\n", " title: TROPOS pyranometer network (PyrNet) observatio...\n", " history: 2024-05-31T13:47:06: Generated level l1a by p...\n", " institution: Leibniz Institute for Tropospheric Research (T...\n", " source: TROPOS pyranometer network (PyrNet)\n", " references: https://doi.org/10.5194/amt-9-1153-2016\n", " ... ...\n", " geospatial_lon_max: 11.885252\n", " geospatial_lon_units: degE\n", " time_coverage_start: 2022-08-30T11:21:01\n", " time_coverage_end: 2022-08-30T11:21:09\n", " time_coverage_duration: P0DT0H0M8S\n", " time_coverage_resolution: P0DT0H0M1S" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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f//3f+u9997TbbfdpltuuUWbNm0KjKmrq9MFF1yg3/zmN6f8VRNtyc7OVnl5uQoKCrRp0yYVFhZq+vTpgf1NTU3q1q2b7rjjDmVkZKipqcmofG2d+8EHH1RMTIwxGV0ul2655Rbl5+drz549mj59ug4cOHDKn9bd1fK18Pl8uvHGGzVw4ECFh4cbc/+1ePXVV3Xw4EEdPHhQTz/9tEaMGGFUxp///Of6wx/+oMWLF2v16tXKzs7WXXfdZUS+X/7yl4H7ruX+69Wrl6699loj8u3bt08TJkzQ9773PZWVlemVV15RVVWVysvLjXmMvvzyy8rOztZPfvITffDBB3r88cf1yCOP6LHHHjvjc0iSbINIsl988cU29+3bt8+WZJeWlp7V3GPHjrVvu+22Nvf169fPfuSRR75yjl27dtmS7J07dwa2vfzyy7ZlWfZnn33WanxOTo49YcKEwG3T8rV1blMz3nXXXfbw4cONynfPPffYP/7xj+01a9bY8fHxtm2bcf991TpNyLhr1y47IiLC/tvf/tbqeBPynaysrMyWZBcWFhqRb8OGDXZERITd1NQUGPPSSy/ZlmXZDQ0NRmS88cYb7RtuuCHouGXLltnnnXee7ff7z3i9Xf6ZHCfceuutGjly5GnHHD58WImJie2ad+3atUG/Ab2oqEgJCQkaMmRIYFtGRobCwsJUXFzcrrnbI9Tznc25TxbKGT/66CNt3rz5lP+KPBOhlm/r1q3asGHDKf/V2F6hlk+SfvCDH6hPnz4aPny4XnrppXadty2hlPFPf/qTLrjgAm3atElpaWk6//zz9R//8R+qqqpq17lPFEr5TvaHP/xBF198sUaMGNGuc58olPINHjxYYWFhWrNmjZqamnT48GH913/9lzIyMuRyudp1/hOFUsb6+npFR0cHzdOtWzf985//1KeffnrG56bkSEpOTlbfvn1Puf/555/Xzp072/17s+Lj43XJJZcEbnu9XvXp0ydoTEREhBITE+X1etu36HYI5Xxne+6ThWLGq666StHR0brooos0YsQIzZ8/v13nPlEo5fviiy906623au3atY799uFQyte9e3f99re/1YYNG/TnP/9Zw4cP18SJE8+56IRSxo8//liffvqpNmzYoKeeekpr165VSUmJbrjhhnad+0ShlO9Ex48f17p16zR16tR2nfdkoZQvLS1N+fn5uu+++xQVFaWEhAT985//1PPPP9+uc58slDJmZWXphRde0JYtW+T3+/Xhhx/qt7/9rSTp4MGDZ3zukP3dVf9KCxYsOOW+1157Tbfddpt+//vfa+DAge2ad9KkSZo0adK5Lu+chWq+czn3yUIx43PPPafa2lr99a9/1d13363Fixef1TxSaOWbNm2abrrpJl1zzTXtOu50Qilfr169lJeXF7j9ne98RwcOHNDDDz+sH/zgB+2a60ShlNHv96u+vl5PPfWULr74YknSE088ocGDB7drnhOFUr4Tvfjii6qtrVVOTs5ZzyGFVj6v16tp06YpJydHN954o2prazVnzhzdcMMNKigoaNdcJwqljNOmTdPf//53XX/99fL5fHK73fr5z3+uuXPnKizszJ+foeScxhtvvKHx48frkUce0S233HLO83k8HlVWVgZta2xsVFVVVbvesOWUzszn9LlPpTMzpqamSpIGDBigpqamNt/ceq46I9/WrVv10ksvBUqbbdvy+/2KiHD+fyeh8j04dOjQc7p4nE5nZExOTlZERESg4EhS//79z/ncbens+/APf/iDrr/++g775c6dkW/FihWKj4/XokWLAmOefvpppaamdshbHzojo2VZWrhwoR566CF5vV717t1bW7ZskSRdcMEFZ3wuXq46hddff13jxo3TwoULHbs4paen69ChQyopKQls27p1q/x+v4YOHerIOc5UZ+briHO3JZTuQ7/fL5/P58gaWnRWvqKiIpWVlQX+zJ8/X3FxcWf0kdT2CKX7r6ysTMnJyY6s4USdlfHqq69WY2Oj/v73vwfGfPjhh46c/0SdfR/u27dPr7322jm/VHUqnZWvrq6u1bMZ4eHhkpr/X+Okzr4Pw8PD9Y1vfEORkZF65plnlJ6ert69e5/5yc74Lcohqra21i4tLbVLS0ttSfaSJUvs0tJS+9NPP7Vt27a/+OILu7S01P7zn/9sS7KfffZZu7S01D548GBgjl/96lf2zTffHLi9detWOyYmxp45c6Z98ODBwJ8vvvgiMKa+vj5w3uTkZPuXv/ylXVpaau/duzcw5oUXXrAvueSSoPWOHj3avvLKK+3i4mL7zTfftC+66CL7xhtvDBpTXl5ul5aW2uPHj7eHDx9uP/vss/azzz5rRL62zv3RRx/Zr7/+ujH34dNPP20/99xz9q5du+y///3v9h//+Ee7d+/e9pgxY4zId7KVK1fa3bt3N+b+W7t2rb1+/Xp79+7d9u7du+0HH3zQtizLnjt3rjEZm5qa7G9/+9v2NddcY7/77rt2YWGhfemll9rDhg0zIl+LWbNm2SkpKfahQ4eMuk5s2bLFtizLnjdvnv3hhx/aJSUl9qhRo+zk5GS7qKjIiIyff/65vXLlSnv37t12aWmpfccdd9jR0dF2cXFxq/v5dLp8yXnttddsSa3+5OTk2LZt22vWrGlz//333x+YIycnx7722muDbrd1zIljWj6Gd7oxLec+0RdffGHfeOONdvfu3W23223fdtttdm1tbdCYfv36tTm3CflOdW6TMj777LP2t7/9bbt79+52bGzsKe/PrprvZPfee69R+dauXWv379/fjomJsd1ut/3d737Xnjt3rlEZbdu2P/vsM/uHP/yh3b17d7tHjx7G5WtqarLPO+88+7777jPyOvHMM8/YV155pR0bG2v37t3bvuqqq4zK+Pnnn9vDhg2zY2Nj7ZiYGHvUqFH29u3b7faybNu2BQAAYBjekwMAAIxEyQEAAEai5AAAACNRcgAAgJEoOQAAwEiUHAAAYCRKDgAAMBIlBwAAGImSAwAAjETJAQAARqLkAAAAI/0fBrG4thStOSsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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jpzjVHVmvo44d2tC6Wvo9/vl8/kcWUOTzsqXn5+voqKiwJ8FCxaoR48ep/SW1PYIpa9fUVGREhMTHVlDc52V8aqrrlJ9fb3+9re/BcZ8/PHHjpy/uc7+Gu7fv1+vv/76GT9V1ZbOyldTU9PiakZYWJikxn9rnNTZX8OwsDB94xvfUEREhJ599lmlpqbq7LPPPvWTnfJLlENUZWWlvXv3bnv37t22JHvp0qX27t277c8++8y2bdv+4osv7N27d9t/+tOfbEn2c889Z+/evds+dOhQYI6f//zn9q233hq4vW3bNjs6OtqeNWuWfejQocCfL774IjCmtrY2cN7ExET7Zz/7mb1792573759gTEvvviifdFFFwWtd/To0fbll19uFxQU2G+99ZZ9wQUX2FOmTAkaU1xcbO/evdseN26cPXz4cPu5556zn3vuOSPytXbuTz75xH7jjTeM+Ro+88wz9vPPP29/9NFH9t/+9jf7qaeess8++2x7zJgxRuQ70apVq+zu3bsb8/Vbt26dvWHDBnvPnj32nj177Iceesi2LMueN2+eMRkbGhrsb3/72/bVV19tv/fee3ZeXp598cUX28OGDTMiX5PZs2fbSUlJdnl5uVGPE1u3brUty7Lnz59vf/zxx3ZhYaE9atQoOzEx0c7Pzzci47/+9S971apV9p49e+zdu3fbd911lx0VFWUXFBS0+DqfTJcvOa+//rotqcWfrKws27Zte+3ata3uf+CBBwJzZGVl2ddcc03Q7daOaT6m6W14JxvTdO7mvvjiC3vKlCl29+7dbY/HY99xxx12ZWVl0Jh+/fq1OrcJ+do6t0kZn3vuOfvb3/623b17dzsmJqbNr2dXzXei+++/36h869ats/v3729HR0fbHo/HvuKKK+x58+YZldG2bfvzzz+3b7zxRrt79+52r169jMvX0NBgn3POOfYvfvELIx8nnn32Wfvyyy+3Y2Ji7LPPPtu+8sorjcr4r3/9yx42bJgdExNjR0dH26NGjbJ37Nhht5dl27YtAAAAw/CaHAAAYCRKDgAAMBIlBwAAGImSAwAAjETJAQAARqLkAAAAI1FyAACAkSg5AADASJQcAABgJEoOAAAwEiUHAAAY6f8DxRNyBz9NG0MAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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oMd2u92Kjo7WgQMHZLfbG/TYTQHzNX/+PiPzNX/+PiPzXTnLslRRUaGoqCgFBFzdp3iMvAMUEBCgzp07+/QcdrvdL//BPo/5mj9/n5H5mj9/n5H5rszV3vk5jw9BAwAA4xBAAADAOARQAwsJCdGMGTMUEhLS2JfiE8zX/Pn7jMzX/Pn7jMzXNBj5IWgAAGA27gABAADjEEAAAMA4BBAAADAOAQQAAIzj1wG0ceNG3X333YqKipLNZtPq1atrPb9q1Srddtttat++vWw2m7Zt2/aTx/zoo480fPhwRUZGqnXr1oqNjdWyZctqrdmxY4dGjBihbt26yWazae7cuXW63hMnTigtLU12u11hYWHKzMzU999/73n+zJkzGjNmjPr166egoCAlJib61Xzezv3UU0/51Yx79uzRr371K0VERCg0NFSRkZHq2bOn38x3oW+++UatWrVScHCw38z33XffyWazXfRITEz0mxmlH37b7osvvqhrrrlGwcHBCg0Nld1u94v5nn76aa+vYWBgoF+9hu+//74GDRqktm3bKiwsTJGRkYqIiPCb+d544w3FxsaqVatW6tq1q2bNmlWnY1/IrwPo1KlT6t+/vxYsWHDJ5xMTEzVz5sw6H3PTpk267rrr9NZbb+nLL79URkaGRo8erfz8fM+a06dPq0ePHvrzn/8sp9NZ52OnpaVpx44dWr9+vfLz87Vx40aNGzfO83x1dbVatmypRx99VElJSaqurvar+byd+/nnn1erVq38Zsbg4GCNHj1aH3zwgfbs2aNx48aptLRUCQkJfjHfeVVVVUpNTVWfPn0UGBjoN6/feR9++KEOHz6sw4cPa+nSpbrpppv8asYJEybo1Vdf1YsvvqjFixcrLS1NEydO9Iv5HnvsMc9rd/4RHR2tPn36+M1ruHfvXg0fPly33nqrtm3bpueee07BwcFq3bq1X8z33nvvKS0tTQ899JC2b9+uV155RXPmzNH8+fPrfA5JkmUISdbbb7/t9bm9e/dakqySkpIrOvadd95pZWRkeH2ua9eu1pw5c37yGDt37rQkWVu2bPFse++99yybzWYdOnToovXp6enW8OHDPV/723zezu2vM06cONFKTEz0q/kef/xx64EHHrBee+01y+FwWJblH6/fT12nP8y4c+dOKygoyNq9e/dF+/vDfD+2bds2S5K1ceNGy7L8Y8a8vDwrKCjIqq6u9qxZs2aNZbPZ/GK+1NRUa+TIkbX2mzdvntW5c2erpqamztfr13eAGsKYMWN0yy23XHZNeXm52rVrV6/j5ubm1vqDWIuKihQWFqYBAwZ4tiUlJSkgIECbN2+u17Hro6nPdyXn/rGmPOM333yjdevWaciQIfU694Wa2nyFhYXKy8u75P9N11dTm0+S7rnnHnXs2FGJiYlas2ZNvc7rTVOa8Z133lGPHj2Un5+v7t27q1u3bvrd736nEydO1OvcF2pK8/3Yq6++qmuuuUY33XRTvc79Y01pxri4OAUEBOi1115TdXW1ysvL9Y9//ENJSUn1OveFmtJ8lZWVCg0NrXWcli1b6uDBg9q3b1+dz00A/YTIyEh16dLlks+/8cYb2rJlizIyMup1XIfDoWuvvdbztcvlUseOHWutCQoKUrt27eRyuep30fXQlOe70nP/WFOccfDgwQoNDVXPnj1100036dlnn63XuS/UlOY7fvy4xowZo9zc3Ab7QxCb0nxt2rTR7NmzlZeXp3fffVeJiYlKSUm56ghqSjP++9//1r59+5SXl6clS5YoNzdXxcXFGjlyZL3OfaGmNN+Fzpw5o2XLlikzM7Ne5/WmKc3YvXt3ffDBB5o6dapCQkIUFhamgwcP6o033qjXuS/UlOZLTk7WqlWrVFBQoJqaGn311VeaPXu2JOnw4cN1PreRfxp8feTk5FzyuQ0bNigjI0N/+ctf1KdPn3od995779W99957tZd31ZrqfFdz7h9rijOuXLlSFRUV+uKLLzR58mS9+OKLV3QcqWnNN3bsWP3mN7/RzTffXK/9LqcpzdehQwdlZWV5vr7xxhtVWlqqWbNm6Z577qnXsS7UlGasqalRZWWllixZomuuuUaS9Ne//lVxcXH1Os6FmtJ8F3r77bdVUVGh9PT0Kz7GeU1pRpfLpbFjxyo9PV2pqamqqKjQ9OnTrypim9J8Y8eO1bfffqu77rpLVVVVstvtmjBhgp5++mkFBNT9vg4BdIU+/vhj3X333ZozZ45Gjx591cdzOp06cuRIrW3nzp3TiRMn6vXhsYbSmPM19LkvpTFnjI6OliT17t1b1dXVXj9oe7UaY77CwkKtWbPGE3SWZammpkZBQQ3/n5qm8u9gfHy81q9ff9Xn96YxZoyMjFRQUJAnfiQpJibmqs/tTWO/hq+++qruuusuRUREXPW5L6UxZlywYIEcDodeeOEFz5qlS5d6/rvTkBpjPpvNppkzZ+pPf/qTXC6XwsPDVVBQIEnq0aNHnc/Ft8CuwEcffaRhw4Zp5syZDfbGlZCQoJMnT6q4uNizrbCwUDU1NYqPj2+Qc9RVY87ni3N705Rew5qaGlVVVTXINZzXWPMVFRVp27Ztnsezzz6rtm3b1unHauujKb1+27ZtU2RkZINcw4Uaa8b/+7//07lz5/Ttt9961nz11VcNcv4LNfZruHfvXm3YsKFBvv11KY014+nTpy+6ExIYGNgg579QY7+GgYGB6tSpk1q0aKHXX39dCQkJCg8Pr/vJ6vxx6WaooqLCKikpsUpKSixJ1ksvvWSVlJRY+/btsyzLso4fP26VlJRY7777riXJWrFihVVSUmIdPnzYc4wpU6ZYDz74oOfrwsJCq1WrVlZ2drZ1+PBhz+P48eOeNZWVlZ7zRkZGWo899phVUlJiff311541q1atsq699tpa13v77bdb119/vbV582brn//8p9WzZ08rNTW11podO3ZYJSUl1t13320lJiZaK1assFasWOEX83k79zfffGN99NFHfvMaLl261Fq5cqW1c+dO69tvv7X+/ve/W+Hh4dYdd9zhF/P92MKFC602bdr4zeuXm5trLV++3Nq1a5e1a9cu6/nnn7dsNpv19NNP+82M1dXV1g033GDdfPPN1tatW62NGzdaffv2tQYNGuQX8503bdo0Kyoqyjp37pzfvVcUFBRYNpvNeuaZZ6yvvvrK+uSTT6yEhAQrMjLSL+Y7evSotXDhQmvXrl1WSUmJ9eijj1qhoaHW5s2bL3qdL8evA2jDhg2WpIse6enplmVZ1muvveb1+RkzZniOkZ6ebg0ZMqTW1972uXDN+R8lvNya8+e+0PHjx63U1FSrTZs2lt1utzIyMqyKiopaa7p27er12P4w36XO7U8zrlixwrrhhhusNm3aWK1bt77k69lc5/uxJ554wq/my83NtWJiYqxWrVpZdrvdGjhwoPX000/71YyWZVmHDh2y7rvvPqtNmzbWL37xC7+br7q62urcubM1depUy7L8873i9ddft66//nqrdevWlsPh8Kv5jh49ag0aNMhq3bq11apVK2vo0KHWp59+atWXzbIsSwAAAAbhM0AAAMA4BBAAADAOAQQAAIxDAAEAAOMQQAAAwDgEEAAAMA4BBAAAjEMAAQAA4xBAAADAOAQQAAAwDgEEAACMQwABAADj/D/4AyZZtoGXiAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "#|dropcode\n", "#|dropout\n", "dsr = ds_l1b.copy()\n", "dsr = dsr.drop_vars([var for var in dsr if var not in config[\"radflux_varname\"]])\n", "for var in config[\"radflux_varname\"]:\n", " is_tilted = pyrnet.utils.check_tilted(ds_l1b[var])\n", " values = ds_l1b[var].values.copy()\n", " # apply correction if possible\n", " if np.any(is_tilted):\n", " vangle = pyrnet.utils.make_iter(ds_l1b[var].attrs[\"vangle\"])\n", " hangle = pyrnet.utils.make_iter(ds_l1b[var].attrs[\"hangle\"])\n", " cfac = pyrnet.utils.tilt_correction_factor(\n", " dp = vangle,\n", " dy = hangle,\n", " szen=ds_l1b.szen.values,\n", " sazi=ds_l1b.sazi.values\n", " )\n", " mask = is_tilted[None,:] * np.isnan(cfac)\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.quality_control_failed\n", " apply_correction = is_tilted[None,:] * ~np.isnan(cfac)\n", " values[apply_correction] *= cfac[apply_correction]\n", "\n", " # update radflux collection dataset\n", " dsr[var].values = values\n", "\n", " # physical minimum\n", " mask = values < -4\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.below_physical\n", " # physical maximum\n", " mask = values > ((Sa * 1.5 * mu0 ** 1.2) + 100)\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.above_phyiscal\n", " # rare limit minimum\n", " mask = values < -2\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.below_rare\n", " # rare limit maximum\n", " mask = values > ((Sa * 1.2 * mu0 ** 1.2) + 50)\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.above_rare\n", "\n", " fig,ax = plt.subplots(1,1)\n", " ax.set_title(var)\n", " ax.fill_between(ds_l1b.time,np.ones(mu0.shape[0])*-4,((Sa * 1.5 * mu0 ** 1.2) + 100)[:,0],color='r',alpha=0.2)\n", " ax.fill_between(ds_l1b.time,np.ones(mu0.shape[0])*-2,((Sa * 1.2 * mu0 ** 1.2) + 50)[:,0],color='g',alpha=0.2)\n", " ax.plot(ds_l1b.time,ds_l1b[var].values,'grey')\n", " ax.plot(ds_l1b.time,values, 'k')\n", " ax.set_ylim([0,1500])\n", " ax.grid(True)\n", "\n", "# compare all sensors from network, or single station\n", "# dsr = dsr.where(np.abs(np.diff(dsr.ghi.values, axis=0, prepend=0)) < 5)\n", "# dsr = dsr.resample(time=\"120min\",skipna=True).mean()\n", "window = 30*60\n", "if dsr.time.size0.8*dsrmax.ghi)\n", "thres_low = np.ones(ds_l1b.time.size)*0.9\n", "thres_high = np.ones(ds_l1b.time.size)*1.1\n", "thres_low[ds_l1b.szen.mean(\"station\")>75] = 0.85\n", "thres_high[ds_l1b.szen.mean(\"station\")>75] = 1.15\n", "\n", "all_values_tilted_flag = np.concatenate([pyrnet.utils.check_tilted(dsr[var]) for var in dsr],axis=0)\n", "all_values = np.concatenate([dsr[var].values for var in dsr],axis=1)\n", "all_values_mean_no_tilt = np.nanmean(all_values[:,~all_values_tilted_flag],axis=1)\n", "all_values_mean_tilt = np.nanmean(all_values[:,all_values_tilted_flag],axis=1)\n", "\n", "for var in config[\"radflux_varname\"]:\n", " is_tilted = pyrnet.utils.check_tilted(ds_l1b[var])\n", " meanvalues = np.repeat(all_values_mean_no_tilt[:,None],dsr[var].shape[1],axis=1)\n", " meanvalues[:,is_tilted] = all_values_mean_tilt[:,None]\n", " \n", " ratio = np.ones(dsr[var].shape)\n", " ratio[meanvalues>50] = dsr[var].values[meanvalues>50] / meanvalues[meanvalues>50]\n", "\n", " fig,ax = plt.subplots(1,1)\n", " ax.set_title(var)\n", " ax.plot(dsr.time,dsr[var].values,'grey')\n", " ax.fill_between(dsr.time,all_values_mean_no_tilt*0.9,all_values_mean_no_tilt*1.1,color='r',alpha=0.2)\n", " ax.plot(dsr.time,meanvalues,'k')\n", " # reindex ratio to original resolution\n", " dsr = dsr.assign({\"ratio\": ((\"time\",\"station\"), ratio)})\n", " ratio = dsr.ratio.reindex_like(ds_l1b, method='nearest').values\n", " dsr = dsr.drop_vars([\"ratio\"])\n", " # comparison to low\n", " mask = ratio < thres_low[:,None]\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.compare_to_low\n", "\n", " # comparison to high\n", " mask = ratio > thres_high[:,None]\n", " ds_l1b[f\"qc_flag_{var}\"].values[mask] += QCCode.compare_to_high\n", "\n", "fig,ax = plt.subplots(1,1)\n", "ax.plot(ds_l1b.time,ds_l1b.qc_flag_ghi)\n", "ds_l1b" ] }, { "cell_type": "markdown", "id": "9ddb5d00a059f147", "metadata": { "collapsed": false }, "source": [ "## qc_flag function" ] }, { "cell_type": "code", "execution_count": 12, "id": "d62e6d71332b950a", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:14.752319Z", "start_time": "2024-08-06T11:43:14.727296Z" }, "collapsed": false, "tags": [ "hide-input" ] }, "outputs": [], "source": [ "#|export\n", "#|dropcode\n", "def add_qc_flags(ds, vars):\n", " \"\"\"\n", " Add quality flags to flux variables in the dataset.\n", " \n", " Parameters\n", " ----------\n", " ds: xr.Dataset\n", " Dataset with flux variables, dimensions ('time','station'). Also, solar zenith (szen) and azimuth (sazi) angles are required.\n", " Works for pyrnet l1b and l1b_network files.\n", " vars: list\n", " List of flux variable names in ds.\n", "\n", " Returns\n", " -------\n", " xr.Dataset\n", " The input dataset, but with additional 'qc_flag_' variables.\n", " \"\"\"\n", " # keep only available variables\n", " vars = [ var for var in vars if var in ds ]\n", " \n", " # init qc flags\n", " for var in vars:\n", " ds = init_qc_flag(ds, var) \n", " \n", " # ancillary variables\n", " szen = ds.szen.values\n", " mu0 = np.cos(np.deg2rad(szen))\n", " mu0[mu0 < 0] = 0 # exclude night\n", " esd = ds.esd.values\n", " Sa = CONSTANTS.S0 / esd**2\n", " \n", " # prepare subsample dataset, to be resampled to 30min mean for comparison checks\n", " dsr = ds.copy()\n", " dsr = dsr.drop_vars([var for var in dsr if var not in vars])\n", " \n", " # do physical and extreme limit tests\n", " for var in vars:\n", " is_tilted = pyrnet.utils.check_tilted(ds[var])\n", " values = ds[var].values.copy()\n", " \n", " # apply correction if possible\n", " if np.any(is_tilted):\n", " vangle = pyrnet.utils.make_iter(ds[var].attrs[\"vangle\"])\n", " hangle = pyrnet.utils.make_iter(ds[var].attrs[\"hangle\"])\n", " cfac = pyrnet.utils.tilt_correction_factor(\n", " dp = vangle,\n", " dy = hangle,\n", " szen=ds.szen.values,\n", " sazi=ds.sazi.values\n", " )\n", " mask = is_tilted[None,:] * np.isnan(cfac)\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.quality_control_failed\n", " apply_correction = is_tilted[None,:] * ~np.isnan(cfac)\n", " values[apply_correction] *= cfac[apply_correction]\n", " \n", " # update subsample dataset\n", " dsr[var].values = values\n", " \n", " # physical minimum\n", " mask = values < -4\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.below_physical\n", " # physical maximum\n", " mask = values > ((Sa * 1.5 * mu0 ** 1.2) + 100)\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.above_phyiscal\n", " # rare limit minimum\n", " mask = values < -2\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.below_rare\n", " # rare limit maximum\n", " mask = values > ((Sa * 1.2 * mu0 ** 1.2) + 50)\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.above_rare\n", " \n", " \n", " # compare all sensors from network, or single station\n", " window = 30*60\n", " if dsr.time.size0.8*dsrmax.ghi)\n", " thres_low = np.ones(ds.time.size)*0.9\n", " thres_high = np.ones(ds.time.size)*1.1\n", " thres_low[ds.szen.mean(\"station\")>75] = 0.85\n", " thres_high[ds.szen.mean(\"station\")>75] = 1.15\n", " \n", " all_values_tilted_flag = np.concatenate([pyrnet.utils.check_tilted(dsr[var]) for var in dsr],axis=0)\n", " all_values = np.concatenate([dsr[var].values for var in dsr],axis=1)\n", " with warnings.catch_warnings():\n", " warnings.filterwarnings(action='ignore', message='Mean of empty slice')\n", " all_values_mean_no_tilt = np.nanmean(all_values[:,~all_values_tilted_flag],axis=1)\n", " all_values_mean_tilt = np.nanmean(all_values[:,all_values_tilted_flag],axis=1)\n", " \n", " for var in vars:\n", " is_tilted = pyrnet.utils.check_tilted(ds[var])\n", " meanvalues = np.repeat(all_values_mean_no_tilt[:,None],dsr[var].shape[1],axis=1)\n", " meanvalues[:,is_tilted] = all_values_mean_tilt[:,None]\n", " \n", " ratio = np.ones(dsr[var].shape)\n", " ratio[meanvalues>50] = dsr[var].values[meanvalues>50] / meanvalues[meanvalues>50]\n", " \n", " # reindex ratio to original resolution\n", " dsr = dsr.assign({\"ratio\": ((\"time\",\"station\"), ratio)})\n", " ratio = dsr.ratio.reindex_like(ds, method='nearest').values\n", " dsr = dsr.drop_vars([\"ratio\"])\n", " # comparison to low\n", " mask = ratio < thres_low[:,None]\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.compare_to_low\n", " \n", " # comparison to high\n", " mask = ratio > thres_high[:,None]\n", " ds[f\"qc_flag_{var}\"].values[mask] += QCCode.compare_to_high\n", " \n", " return ds" ] }, { "cell_type": "markdown", "id": "1cadc1e0428fea2c", "metadata": { "collapsed": false }, "source": [ "## Test add_qc_flag function" ] }, { "cell_type": "code", "execution_count": 13, "id": "e2505f402e83ef73", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:14.861564Z", "start_time": "2024-08-06T11:43:14.755546Z" }, "collapsed": false, "tags": [ "hide-output" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 1kB\n",
       "Dimensions:               (station: 1, time: 9, maintenancetime: 1)\n",
       "Coordinates:\n",
       "  * station               (station) float64 8B 1.0\n",
       "  * time                  (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n",
       "  * maintenancetime       (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n",
       "Data variables: (12/20)\n",
       "    ghi                   (time, station) float64 72B 280.9 280.9 ... 280.9\n",
       "    gti                   (time, station) float64 72B 288.9 288.9 ... 289.4\n",
       "    ta                    (time, station) float64 72B 294.8 294.7 ... 294.8\n",
       "    rh                    (time, station) float64 72B 0.6253 0.6248 ... 0.629\n",
       "    battery_voltage       (time, station) float64 72B 6.443 6.445 ... 6.465\n",
       "    gti_min               (time, station) float64 72B 288.7 288.7 ... 288.7\n",
       "    ...                    ...\n",
       "    maintenance_flag_gti  (maintenancetime, station) float32 4B 7.0\n",
       "    szen                  (time, station) float64 72B 42.51 42.51 ... 42.51\n",
       "    sazi                  (time, station) float64 72B 182.9 182.9 ... 182.9\n",
       "    esd                   (station) float64 8B 1.01\n",
       "    qc_flag_ghi           (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n",
       "    qc_flag_gti           (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n",
       "Attributes: (12/31)\n",
       "    Conventions:               CF-1.10, ACDD-1.3\n",
       "    title:                     TROPOS pyranometer network (PyrNet) observatio...\n",
       "    history:                   2024-05-31T13:47:06: Generated level l1a  by p...\n",
       "    institution:               Leibniz Institute for Tropospheric Research (T...\n",
       "    source:                    TROPOS pyranometer network (PyrNet)\n",
       "    references:                https://doi.org/10.5194/amt-9-1153-2016\n",
       "    ...                        ...\n",
       "    geospatial_lon_max:        11.885252\n",
       "    geospatial_lon_units:      degE\n",
       "    time_coverage_start:       2022-08-30T11:21:01\n",
       "    time_coverage_end:         2022-08-30T11:21:09\n",
       "    time_coverage_duration:    P0DT0H0M8S\n",
       "    time_coverage_resolution:  P0DT0H0M1S
" ], "text/plain": [ " Size: 1kB\n", "Dimensions: (station: 1, time: 9, maintenancetime: 1)\n", "Coordinates:\n", " * station (station) float64 8B 1.0\n", " * time (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n", " * maintenancetime (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n", "Data variables: (12/20)\n", " ghi (time, station) float64 72B 280.9 280.9 ... 280.9\n", " gti (time, station) float64 72B 288.9 288.9 ... 289.4\n", " ta (time, station) float64 72B 294.8 294.7 ... 294.8\n", " rh (time, station) float64 72B 0.6253 0.6248 ... 0.629\n", " battery_voltage (time, station) float64 72B 6.443 6.445 ... 6.465\n", " gti_min (time, station) float64 72B 288.7 288.7 ... 288.7\n", " ... ...\n", " maintenance_flag_gti (maintenancetime, station) float32 4B 7.0\n", " szen (time, station) float64 72B 42.51 42.51 ... 42.51\n", " sazi (time, station) float64 72B 182.9 182.9 ... 182.9\n", " esd (station) float64 8B 1.01\n", " qc_flag_ghi (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n", " qc_flag_gti (time, station) float32 36B 0.0 0.0 0.0 ... 0.0 0.0\n", "Attributes: (12/31)\n", " Conventions: CF-1.10, ACDD-1.3\n", " title: TROPOS pyranometer network (PyrNet) observatio...\n", " history: 2024-05-31T13:47:06: Generated level l1a by p...\n", " institution: Leibniz Institute for Tropospheric Research (T...\n", " source: TROPOS pyranometer network (PyrNet)\n", " references: https://doi.org/10.5194/amt-9-1153-2016\n", " ... ...\n", " geospatial_lon_max: 11.885252\n", " geospatial_lon_units: degE\n", " time_coverage_start: 2022-08-30T11:21:01\n", " time_coverage_end: 2022-08-30T11:21:09\n", " time_coverage_duration: P0DT0H0M8S\n", " time_coverage_resolution: P0DT0H0M1S" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# #|dropout\n", "fname = \"../../example_data/to_l1b_output.nc\"\n", "ds = xr.load_dataset(fname)\n", "ds " ] }, { "cell_type": "code", "execution_count": 14, "id": "302af8a38faf1c82", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:15.040203Z", "start_time": "2024-08-06T11:43:14.863822Z" }, "collapsed": false }, "outputs": [], "source": [ "%load_ext memory_profiler\n", "from pyrnet.qcrad import add_qc_flags as test_add_qc_flags\n" ] }, { "cell_type": "code", "execution_count": 15, "id": "fc5a4ac9d25b73c9", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:15.047891Z", "start_time": "2024-08-06T11:43:15.042552Z" }, "collapsed": false }, "outputs": [], "source": [ "# %%mprun -f test_add_qc_flags\n", "# _ = test_add_qc_flags(ds, [\"ghi\", \"gti\"])" ] }, { "cell_type": "code", "execution_count": 16, "id": "f63a060a8b4a2e1c", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:15.135671Z", "start_time": "2024-08-06T11:43:15.052667Z" }, "collapsed": false, "tags": [ "hide-output" ] }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "\n", "
<xarray.Dataset> Size: 1kB\n",
       "Dimensions:               (station: 1, time: 9, maintenancetime: 1)\n",
       "Coordinates:\n",
       "  * station               (station) float64 8B 1.0\n",
       "  * time                  (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n",
       "  * maintenancetime       (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n",
       "Data variables: (12/20)\n",
       "    ghi                   (time, station) float64 72B 280.9 280.9 ... 280.9\n",
       "    gti                   (time, station) float64 72B 288.9 288.9 ... 289.4\n",
       "    ta                    (time, station) float64 72B 294.8 294.7 ... 294.8\n",
       "    rh                    (time, station) float64 72B 0.6253 0.6248 ... 0.629\n",
       "    battery_voltage       (time, station) float64 72B 6.443 6.445 ... 6.465\n",
       "    gti_min               (time, station) float64 72B 288.7 288.7 ... 288.7\n",
       "    ...                    ...\n",
       "    maintenance_flag_gti  (maintenancetime, station) float32 4B 7.0\n",
       "    szen                  (time, station) float64 72B 42.51 42.51 ... 42.51\n",
       "    sazi                  (time, station) float64 72B 182.9 182.9 ... 182.9\n",
       "    esd                   (station) float64 8B 1.01\n",
       "    qc_flag_ghi           (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "    qc_flag_gti           (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n",
       "Attributes: (12/31)\n",
       "    Conventions:               CF-1.10, ACDD-1.3\n",
       "    title:                     TROPOS pyranometer network (PyrNet) observatio...\n",
       "    history:                   2024-05-31T13:47:06: Generated level l1a  by p...\n",
       "    institution:               Leibniz Institute for Tropospheric Research (T...\n",
       "    source:                    TROPOS pyranometer network (PyrNet)\n",
       "    references:                https://doi.org/10.5194/amt-9-1153-2016\n",
       "    ...                        ...\n",
       "    geospatial_lon_max:        11.885252\n",
       "    geospatial_lon_units:      degE\n",
       "    time_coverage_start:       2022-08-30T11:21:01\n",
       "    time_coverage_end:         2022-08-30T11:21:09\n",
       "    time_coverage_duration:    P0DT0H0M8S\n",
       "    time_coverage_resolution:  P0DT0H0M1S
" ], "text/plain": [ " Size: 1kB\n", "Dimensions: (station: 1, time: 9, maintenancetime: 1)\n", "Coordinates:\n", " * station (station) float64 8B 1.0\n", " * time (time) datetime64[ns] 72B 2022-08-30T11:21:01 ... 2...\n", " * maintenancetime (maintenancetime) datetime64[ns] 8B 2023-05-08T16:0...\n", "Data variables: (12/20)\n", " ghi (time, station) float64 72B 280.9 280.9 ... 280.9\n", " gti (time, station) float64 72B 288.9 288.9 ... 289.4\n", " ta (time, station) float64 72B 294.8 294.7 ... 294.8\n", " rh (time, station) float64 72B 0.6253 0.6248 ... 0.629\n", " battery_voltage (time, station) float64 72B 6.443 6.445 ... 6.465\n", " gti_min (time, station) float64 72B 288.7 288.7 ... 288.7\n", " ... ...\n", " maintenance_flag_gti (maintenancetime, station) float32 4B 7.0\n", " szen (time, station) float64 72B 42.51 42.51 ... 42.51\n", " sazi (time, station) float64 72B 182.9 182.9 ... 182.9\n", " esd (station) float64 8B 1.01\n", " qc_flag_ghi (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", " qc_flag_gti (time, station) uint8 9B 0 0 0 0 0 0 0 0 0\n", "Attributes: (12/31)\n", " Conventions: CF-1.10, ACDD-1.3\n", " title: TROPOS pyranometer network (PyrNet) observatio...\n", " history: 2024-05-31T13:47:06: Generated level l1a by p...\n", " institution: Leibniz Institute for Tropospheric Research (T...\n", " source: TROPOS pyranometer network (PyrNet)\n", " references: https://doi.org/10.5194/amt-9-1153-2016\n", " ... ...\n", " geospatial_lon_max: 11.885252\n", " geospatial_lon_units: degE\n", " time_coverage_start: 2022-08-30T11:21:01\n", " time_coverage_end: 2022-08-30T11:21:09\n", " time_coverage_duration: P0DT0H0M8S\n", " time_coverage_resolution: P0DT0H0M1S" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#|dropout\n", "ds = add_qc_flags(ds, [\"ghi\", \"gti\"])\n", "ds" ] }, { "cell_type": "markdown", "id": "38bfb334", "metadata": {}, "source": [ "## add_flag function" ] }, { "cell_type": "code", "execution_count": 17, "id": "65678ba7", "metadata": { "tags": [ "hide-input" ] }, "outputs": [], "source": [ "#|export\n", "#|dropcode\n", "def add_add_flags(ds, vars):\n", " \"\"\"\n", " Add additional flags to flux variables in the dataset.\n", " \n", " Parameters\n", " ----------\n", " ds: xr.Dataset\n", " Dataset with flux variables, dimensions ('time','station'). Also, solar zenith (szen) angle and _std variable are required.\n", " Works for pyrnet l1b and l1b_network files.\n", " vars: list\n", " List of flux variable names in ds.\n", "\n", " Returns\n", " -------\n", " xr.Dataset\n", " The input dataset, but with additional 'add_flag_' variables.\n", " \"\"\"\n", " # keep only available variables\n", " vars = [ var for var in vars if var in ds ]\n", " \n", " # init qc flags\n", " for var in vars:\n", " ds = init_additional_flag(ds, var) \n", " \n", " # ancillary variables\n", " szen = ds.szen.values\n", " mu0 = np.cos(np.deg2rad(szen))\n", "\n", " for var in vars:\n", " pmean = np.nanmean(ds[var].values,axis=1)\n", " pstd = np.nanstd(ds[var].values,axis=1)\n", " \n", " # flag lower outlier \n", " # deviation > 3 sigma of certain time step and only if irradiance lower 100Wm-2*mu0\n", " newflag = (ds[var].values<(pmean-3*pstd)[:,None])*(ds[var].values<100*mu0)\n", " newflag *= mu0>0 # exclude nigth\n", " \n", " # flag high fluctuation\n", " # if fluctuation of sampling within resolution is very high (std>100Wm-2*mu0) its probably logger failiure, or bird, or hand (very strong shadow within short period)\n", " if f\"{var}_std\" not in ds:\n", " ds[f\"add_flag_{var}\"].values += FLCode.not_applicable\n", " newflag2 = np.zeros(ds[var].shape).astype(bool)\n", " else:\n", " newflag2 = ds[f\"{var}_std\"].values>(100*mu0)\n", " newflag2 *= mu0>0\n", "\n", " # for savety flag 10min around incident\n", " newflag = np.apply_along_axis(lambda m: np.convolve(m, np.ones(5*60), mode='same'), axis=0, arr=newflag)\n", " newflag = newflag.astype(bool)\n", "\n", " newflag2 = np.apply_along_axis(lambda m: np.convolve(m, np.ones(5*60), mode='same'), axis=0, arr=newflag2)\n", " newflag2 = newflag2.astype(bool)\n", "\n", " # add Flag Code\n", " ds[f\"add_flag_{var}\"].values[newflag] += FLCode.low_outlier\n", " ds[f\"add_flag_{var}\"].values[newflag2] += FLCode.strong_fluctuation\n", " \n", " return ds\n", "\n" ] }, { "cell_type": "code", "execution_count": 18, "id": "c23d17c81a5e5683", "metadata": { "ExecuteTime": { "end_time": "2024-08-06T11:43:16.612727Z", "start_time": "2024-08-06T11:43:15.138050Z" }, "collapsed": false, "tags": [ "remove-cell", "hide-input", "hide-output" ] }, "outputs": [], "source": [ "#|hide\n", "# Export module\n", "# Requires *nbdev* to export and update the *../lib/logger.py* module\n", "import nbdev.export\n", "import nbformat as nbf\n", "name = \"qcrad\"\n", "\n", "# Export python module\n", "nbdev.export.nb_export( f\"{name}.ipynb\" ,f\"../../src/pyrnet\")\n", "\n", "# Export to docs\n", "ntbk = nbf.read(f\"{name}.ipynb\", nbf.NO_CONVERT)\n", "\n", "text_search_dict = {\n", " \"#|hide\": \"remove-cell\", # Remove the whole cell\n", " \"#|dropcode\": \"hide-input\", # Hide the input w/ a button to show\n", " \"#|dropout\": \"hide-output\" # Hide the output w/ a button to show\n", "}\n", "for cell in ntbk.cells:\n", " cell_tags = cell.get('metadata', {}).get('tags', [])\n", " for key, val in text_search_dict.items():\n", " if key in cell['source']:\n", " if val not in cell_tags:\n", " cell_tags.append(val)\n", " if len(cell_tags) > 0:\n", " cell['metadata']['tags'] = cell_tags\n", " nbf.write(ntbk, f\"../../docs/source/nbs/{name}.ipynb\")" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.4" } }, "nbformat": 4, "nbformat_minor": 5 }