From c8809a80f1451d49d054013ecdd789787e378a72 Mon Sep 17 00:00:00 2001 From: karnem <mikhail.karnevskiy@desy.de> Date: Mon, 2 Sep 2019 11:42:42 +0200 Subject: [PATCH] simplify code. Include nconstants. --- notebooks/AGIPD/PlotFromCalDB_AGIPD_NBC.ipynb | 91 +++++++------------ .../FastCCD/PlotFromCalDB_FastCCD_NBC.ipynb | 2 +- notebooks/LPD/PlotFromCalDB_LPD_NBC.ipynb | 74 ++++++--------- .../ePix/PlotFromCalDB_ePix100_NBC.ipynb | 70 ++++++-------- 4 files changed, 90 insertions(+), 147 deletions(-) diff --git a/notebooks/AGIPD/PlotFromCalDB_AGIPD_NBC.ipynb b/notebooks/AGIPD/PlotFromCalDB_AGIPD_NBC.ipynb index 545a9a475..e3efb528a 100644 --- a/notebooks/AGIPD/PlotFromCalDB_AGIPD_NBC.ipynb +++ b/notebooks/AGIPD/PlotFromCalDB_AGIPD_NBC.ipynb @@ -28,12 +28,14 @@ "cluster_profile = \"noDB\" # The ipcluster profile to use\n", "start_date = \"2019-01-01\" # Date to start investigation interval from\n", "end_date = \"2019-12-12\" # Date to end investigation interval at, can be \"now\"\n", + "nconstants = 20 # Number of time stamps to plot. If not 0, overcome start_date.\n", "constants = [\"Noise\", \"SlopesFF\", \"SlopesPC\", \"Offset\"] # Constants to plot\n", "modules = [1] # Modules, set to -1 for all, range allowed\n", "bias_voltages = [300, 500] # Bias voltage\n", - "mem_cells = [128, 176] # Number of used memory cells. Typically: 4,32,64,128,176.\n", + "mem_cells = [128, 176, 250] # Number of used memory cells. Typically: 4,32,64,128,176.\n", + "acquisition_rate = [None]\n", "photon_energy = 9.2 # Photon energy of the beam\n", - "out_folder = \"/gpfs/exfel/data/scratch/karnem/testAGIPD16_21/\" # Output folder, required\n", + "out_folder = \"/gpfs/exfel/data/scratch/karnem/testAGIPD16_25/\" # Output folder, required\n", "use_existing = \"\" # If not empty, constants stored in given folder will be used\n", "cal_db_timeout = 120000 # timeout on caldb requests\",\n", "adu_to_photon = 33.17 # ADU to photon conversion factor (8000 / 3.6 / 67.)\n", @@ -47,7 +49,8 @@ "range_gain = [0.8, 1.2, 0.8, 1.2] # plotting range for gain: high gain l, r, medium gain l, r \n", "range_noise_e = [85., 500., 85., 500.] # plotting range for noise in [e-]: high gain l, r, medium gain l, r \n", "range_slopesPC = [22.0, 27.0, -0.5, 1.5] # plotting range for slope PC: high gain l, r, medium gain l, r \n", - "range_slopesFF = [0.8, 1.2, 0.6, 1.2] # plotting range for slope FF: high gain l, r, medium gain l, r " + "range_slopesFF = [0.8, 1.2, 0.6, 1.2] # plotting range for slope FF: high gain l, r, medium gain l, r \n", + "plot_range = 3 # range for plotting in units of median absolute deviations" ] }, { @@ -67,13 +70,11 @@ "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", - "import h5py\n", - "\n", "from iCalibrationDB import Constants, Conditions, Detectors, ConstantMetaData\n", "from cal_tools.tools import get_from_db, get_random_db_interface\n", "from cal_tools.ana_tools import (save_dict_to_hdf5, load_data_from_hdf5, \n", " combine_constants, HMType,\n", - " hm_combine, combine_lists)" + " hm_combine, combine_lists, get_range)" ] }, { @@ -122,7 +123,8 @@ "metadata": {}, "outputs": [], "source": [ - "parameter_list = combine_lists(bias_voltages, modules, mem_cells, names = ['bias_voltage', 'module', 'mem_cells'])\n", + "parameter_list = combine_lists(bias_voltages, modules, mem_cells, acquisition_rate,\n", + " names = ['bias_voltage', 'module', 'mem_cells', 'acquisition_rate'])\n", "print(parameter_list)" ] }, @@ -152,13 +154,15 @@ " dcond = Conditions.Dark\n", " mcond = getattr(dcond, dclass)(\n", " memory_cells=pars['mem_cells'],\n", - " bias_voltage=pars['bias_voltage'])\n", + " bias_voltage=pars['bias_voltage'],\n", + " acquisition_rate=pars['acquisition_rate'])\n", " else:\n", " dcond = Conditions.Illuminated\n", " mcond = getattr(dcond, dclass)(\n", - " memory_cells=pars['mem_cells'],\n", - " bias_voltage=pars['bias_voltage'],\n", - " photon_energy=photon_energy)\n", + " memory_cells=pars['mem_cells'],\n", + " bias_voltage=pars['bias_voltage'],\n", + " acquisition_rate=pars['acquisition_rate'],\n", + " photon_energy=photon_energy)\n", "\n", " print('Request: ', const, 'with paramters:', pars)\n", " # Request Constant versions for given parameters and module\n", @@ -173,7 +177,6 @@ " meta_only=True,\n", " version_info=True)\n", "\n", - " print(data)\n", " # Request BP constant versions\n", " print('constantDark:', constantsDark[const], ) \n", " dataBP = get_from_db(getattr(det, pars['module']),\n", @@ -187,13 +190,12 @@ " meta_only=True,\n", " version_info=True)\n", " \n", - " print('BP!!!!!', dataBP)\n", - " \n", " if not isinstance(data, list) or not isinstance(dataBP, list):\n", " continue\n", " \n", " found_BPmatch = False\n", " for d in data:\n", + " print('Item: ', d)\n", " # Match proper BP constant version\n", " # and get constant version within\n", " # requested time range\n", @@ -203,7 +205,8 @@ "\n", " dt = dateutil.parser.parse(d['begin_at'])\n", "\n", - " if dt.replace(tzinfo=None) > end or dt.replace(tzinfo=None) < start:\n", + " if (dt.replace(tzinfo=None) > end or \n", + " (nconstants==0 and dt.replace(tzinfo=None) < start)):\n", " continue\n", " \n", " closest_BP = None\n", @@ -302,25 +305,31 @@ "ret_constants = {}\n", "constand_data = ConstantMetaData()\n", "constant_BP = ConstantMetaData()\n", - "for i, constant_version in enumerate(constant_versions):\n", + "# sort over begin_at\n", + "idxs, _ = zip(*sorted(enumerate(constant_versions), \n", + " key=lambda x: x[1]['begin_at'], reverse=True))\n", "\n", - " const = constant_version['data_set_name'].split('/')[-2]\n", + "for i in idxs:\n", + " const = constant_versions[i]['data_set_name'].split('/')[-2]\n", " qm = constant_parameters[i]['module']\n", " \n", - " constand_data.retrieve_from_version_info(constant_version)\n", + " if not const in ret_constants:\n", + " ret_constants[const] = {}\n", + " if not qm in ret_constants[const]:\n", + " ret_constants[const][qm] = []\n", + " \n", + " if nconstants>0 and len(ret_constants[const][qm])>=nconstants:\n", + " continue\n", + " \n", + " constand_data.retrieve_from_version_info(constant_versions[i])\n", " constant_BP.retrieve_from_version_info(constantBP_versions[i])\n", " \n", " cdata = constand_data.calibration_constant.data\n", " cdataBP = constant_BP.calibration_constant.data\n", " ctime = constand_data.calibration_constant_version.begin_at \n", - " \n", + " \n", " print(\"constant: {}, module {}, begin_at {}\".format(const, qm, ctime))\n", - " \n", - " if not const in ret_constants:\n", - " ret_constants[const] = {}\n", - " if not qm in ret_constants[const]:\n", - " ret_constants[const][qm] = []\n", - " \n", + "\n", " cdata = modify_const(const, cdata)\n", " cdataBP = modify_const(const, cdataBP, True)\n", "\n", @@ -540,20 +549,12 @@ " else:\n", " pass\n", "\n", - " # loop over modules\n", - " mod_data = {}\n", - " mod_data['stdASIC'] = []\n", - " mod_data['stdCell'] = []\n", - " mod_names = []\n", - " mod_times = []\n", - "\n", " # Loop over modules\n", " for mod, data in mods.items():\n", " if mod not in modules:\n", " continue\n", "\n", " print(mod)\n", - "\n", " ctimes = np.array(data[\"ctime\"])\n", " ctimes_ticks = [x.strftime('%y-%m-%d') for x in ctimes]\n", "\n", @@ -604,24 +605,9 @@ " for key in rdata:\n", " adata[key] = np.nanmean(rdata[key], axis=(1, 2)).swapaxes(0, 1)\n", "\n", - " # Summary information over modules\n", - " for key in pdata:\n", - " if key not in mod_data:\n", - " mod_data[key] = []\n", - " mod_data[key].append(np.nanmean(pdata[key], axis=0))\n", - "\n", - " mod_data['stdASIC'].append(np.nanstd(\n", - " np.nanmean(rdata['Mean'][:, :, :, :nMemToShow], axis=(1, 2)), axis=1))\n", - " mod_data['stdCell'].append(np.nanstd(\n", - " np.nanmean(rdata['Mean'][:, :, :, :nMemToShow], axis=3), axis=(1, 2)))\n", - "\n", - " mod_names.append(mod)\n", - " mod_times.append(ctimes_ticks)\n", - "\n", " # Plotting\n", " for key in pdata:\n", - " vmin = None\n", - " vmax = None\n", + " vmin,vmax = get_range(pdata[key][::-1], plot_range)\n", " if const in rangevals and key in ['Mean', 'MeanBP']:\n", " vmin = rangevals[const][gain][0]\n", " vmax = rangevals[const][gain][1]\n", @@ -658,13 +644,6 @@ " out_folder, const, mod, gain, key),\n", " vmin=vmin, vmax=vmax)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/notebooks/FastCCD/PlotFromCalDB_FastCCD_NBC.ipynb b/notebooks/FastCCD/PlotFromCalDB_FastCCD_NBC.ipynb index 029a487d1..1bd8c1792 100644 --- a/notebooks/FastCCD/PlotFromCalDB_FastCCD_NBC.ipynb +++ b/notebooks/FastCCD/PlotFromCalDB_FastCCD_NBC.ipynb @@ -158,7 +158,7 @@ " if not isinstance(data, list):\n", " continue\n", " \n", - " data = sorted(data, key=itemgetter('begin_at'))\n", + " data = sorted(data, key=itemgetter('begin_at'), reverse=True)\n", " print('Number of retrieved constants: {}'.format(len(data)) )\n", " \n", " if const in constantsDark:\n", diff --git a/notebooks/LPD/PlotFromCalDB_LPD_NBC.ipynb b/notebooks/LPD/PlotFromCalDB_LPD_NBC.ipynb index 8ecc446be..b3f50de67 100644 --- a/notebooks/LPD/PlotFromCalDB_LPD_NBC.ipynb +++ b/notebooks/LPD/PlotFromCalDB_LPD_NBC.ipynb @@ -22,18 +22,17 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "cluster_profile = \"noDB\" # The ipcluster profile to use\n", "start_date = \"2018-01-30\" # Date to start investigation interval from\n", "end_date = \"2018-12-12\" # Date to end investigation interval at, can be \"now\"\n", - "constants = [\"Offset\", \"Noise\", \"SlopesFF\", \"SlopesCI\"] # constants to plot\n", + "nconstants = 10 # Number of time stamps to plot. If not 0, overcome start_date.\n", + "constants = [\"Offset\"]#, \"Noise\", \"SlopesFF\", \"SlopesCI\"] # constants to plot\n", "modules = [2] # Modules, set to -1 for all, range allowed\n", "bias_voltages = [250, 500] # Bias voltage\n", - "mem_cells = [1, 128, 256, 512] # Number of used memory cells. Typically: 4,32,64,128,176.\n", + "mem_cells = [128, 256, 512] # Number of used memory cells.\n", "photon_energy = 9.2 # Photon energy of the beam\n", "out_folder = \"/gpfs/exfel/data/scratch/karnem/testLPD_11/\" # Output folder, required\n", "use_existing = \"\" # If not empty, constants stored in given folder will be used\n", @@ -49,7 +48,8 @@ "range_gain = [20, 30, 20, 30] # plotting range for gain: high gain l, r, medium gain l, r \n", "range_noise_e = [100., 600., 100., 600.] # plotting range for noise in [e-]: high gain l, r, medium gain l, r \n", "range_slopesCI = [0.95, 1.05, 0.0, 0.5] # plotting range for slope CI: high gain l, r, medium gain l, r \n", - "range_slopesFF = [0.8, 1.2, 0.8, 1.2] # plotting range for slope FF: high gain l, r, medium gain l, r " + "range_slopesFF = [0.8, 1.2, 0.8, 1.2] # plotting range for slope FF: high gain l, r, medium gain l, r \n", + "plot_range = 3 # range for plotting in units of median absolute deviations" ] }, { @@ -69,13 +69,11 @@ "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", - "import h5py\n", - "\n", "from iCalibrationDB import Constants, Conditions, Detectors, ConstantMetaData\n", "from cal_tools.tools import get_from_db, get_random_db_interface\n", "from cal_tools.ana_tools import (save_dict_to_hdf5, load_data_from_hdf5, \n", " combine_constants, HMType,\n", - " hm_combine, combine_lists)" + " hm_combine, combine_lists, get_range)" ] }, { @@ -203,7 +201,8 @@ "\n", " dt = dateutil.parser.parse(d['begin_at'])\n", "\n", - " if dt.replace(tzinfo=None) > end or dt.replace(tzinfo=None) < start:\n", + " if (dt.replace(tzinfo=None) > end or \n", + " (nconstants==0 and dt.replace(tzinfo=None) < start)):\n", " continue\n", " \n", " closest_BP = None\n", @@ -293,12 +292,24 @@ "ret_constants = {}\n", "constand_data = ConstantMetaData()\n", "constant_BP = ConstantMetaData()\n", - "for i, constant_version in enumerate(constant_versions):\n", "\n", - " const = constant_version['data_set_name'].split('/')[-2]\n", + "# sort over begin_at\n", + "idxs, _ = zip(*sorted(enumerate(constant_versions), \n", + " key=lambda x: x[1]['begin_at'], reverse=True))\n", + "\n", + "for i in idxs:\n", + " const = constant_versions[i]['data_set_name'].split('/')[-2]\n", " qm = constant_parameters[i]['module']\n", " \n", - " constand_data.retrieve_from_version_info(constant_version)\n", + " if not const in ret_constants:\n", + " ret_constants[const] = {}\n", + " if not qm in ret_constants[const]:\n", + " ret_constants[const][qm] = []\n", + " \n", + " if nconstants>0 and len(ret_constants[const][qm])>=nconstants:\n", + " continue\n", + " \n", + " constand_data.retrieve_from_version_info(constant_versions[i])\n", " constant_BP.retrieve_from_version_info(constantBP_versions[i])\n", " \n", " cdata = constand_data.calibration_constant.data\n", @@ -306,12 +317,7 @@ " ctime = constand_data.calibration_constant_version.begin_at \n", " \n", " print(\"constant: {}, module {}, begin_at {}\".format(const, qm, ctime))\n", - " \n", - " if not const in ret_constants:\n", - " ret_constants[const] = {}\n", - " if not qm in ret_constants[const]:\n", - " ret_constants[const][qm] = []\n", - " \n", + "\n", " cdata = modify_const(const, cdata)\n", " cdataBP = modify_const(const, cdataBP)\n", "\n", @@ -481,9 +487,7 @@ { "cell_type": "code", "execution_count": null, - "metadata": { - "collapsed": true - }, + "metadata": {}, "outputs": [], "source": [ "# Parameters for plotting\n", @@ -515,7 +519,7 @@ "cell_type": "code", "execution_count": null, "metadata": { - "scrolled": true + "scrolled": false }, "outputs": [], "source": [ @@ -533,13 +537,6 @@ " else:\n", " pass\n", "\n", - " # loop over modules\n", - " mod_data = {}\n", - " mod_data['stdASIC'] = []\n", - " mod_data['stdCell'] = []\n", - " mod_names = []\n", - " mod_times = []\n", - "\n", " # Loop over modules\n", " for mod, data in mods.items():\n", " \n", @@ -598,24 +595,9 @@ " for key in rdata:\n", " adata[key] = np.nanmean(rdata[key], axis=(1, 2)).swapaxes(0, 1)\n", "\n", - " # Summary information over modules\n", - " for key in pdata:\n", - " if key not in mod_data:\n", - " mod_data[key] = []\n", - " mod_data[key].append(np.nanmean(pdata[key], axis=0))\n", - "\n", - " mod_data['stdASIC'].append(np.nanstd(\n", - " np.nanmean(rdata['Mean'][:, :, :, :nMemToShow], axis=(1, 2)), axis=1))\n", - " mod_data['stdCell'].append(np.nanstd(\n", - " np.nanmean(rdata['Mean'][:, :, :, :nMemToShow], axis=3), axis=(1, 2)))\n", - "\n", - " mod_names.append(mod)\n", - " mod_times.append(ctimes_ticks)\n", - "\n", " # Plotting\n", " for key in pdata:\n", - " vmin = None\n", - " vmax = None\n", + " vmin,vmax = get_range(pdata[key][::-1].flatten(), plot_range)\n", " if const in rangevals and key in ['Mean', 'MeanBP']:\n", " vmin = rangevals[const][gain][0]\n", " vmax = rangevals[const][gain][1]\n", diff --git a/notebooks/ePix/PlotFromCalDB_ePix100_NBC.ipynb b/notebooks/ePix/PlotFromCalDB_ePix100_NBC.ipynb index 22aecccb9..e6163d8d4 100644 --- a/notebooks/ePix/PlotFromCalDB_ePix100_NBC.ipynb +++ b/notebooks/ePix/PlotFromCalDB_ePix100_NBC.ipynb @@ -24,6 +24,7 @@ "cluster_profile = \"noDB\" # The ipcluster profile to use\n", "start_date = \"2019-01-30\" # date to start investigation interval from\n", "end_date = \"2019-05-01\" # date to end investigation interval at, can be \"now\"\n", + "nconstants = 10 # Number of time stamps to plot. If not 0, overcome start_date.\n", "dclass=\"ePix100\" # Detector class\n", "db_module = \"ePix100_M15\" # detector entry in the DB to investigate\n", "constants = [\"Noise\", \"Offset\"] # constants to plot\n", @@ -35,10 +36,11 @@ "photon_energy = 9.2 # Photon energy of the beam\n", "out_folder = \"/gpfs/exfel/data/scratch/karnem/test_ePix/\" # output folder\n", "use_existing = \"\" # If not empty, constants stored in given folder will be used\n", - "cal_db_interface = \"tcp://max-exfl016:8016\" # the database interface to use\n", + "cal_db_interface = \"tcp://max-exfl016:8015#8025\" # the database interface to use\n", "cal_db_timeout = 180000 # timeout on caldb requests\",\n", - "range_offset = [1000., 2200] # plotting range for offset: high gain l, r, medium gain l, r \n", - "range_noise = [1.5, 3.3] # plotting range for noise: high gain l, r, medium gain l, r " + "range_offset = [1000., 2200] # plotting range for offset\n", + "range_noise = [1.5, 3.3] # plotting range for noise\n", + "plot_range = 3 # range for plotting in units of median absolute deviations" ] }, { @@ -58,13 +60,11 @@ "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", - "import h5py\n", - "\n", "from iCalibrationDB import Constants, Conditions, Detectors, ConstantMetaData\n", "from cal_tools.tools import get_from_db, get_random_db_interface\n", "from cal_tools.ana_tools import (save_dict_to_hdf5, load_data_from_hdf5, \n", - " combine_constants, HMType,\n", - " hm_combine, combine_lists)" + " HMType, hm_combine, \n", + " combine_lists, get_range)" ] }, { @@ -170,8 +170,6 @@ " meta_only=True,\n", " version_info=True)\n", " \n", - " print(dataBP)\n", - " \n", " if not isinstance(data, list) or not isinstance(dataBP, list):\n", " continue\n", " \n", @@ -186,7 +184,8 @@ "\n", " dt = dateutil.parser.parse(d['begin_at'])\n", "\n", - " if dt.replace(tzinfo=None) > end or dt.replace(tzinfo=None) < start:\n", + " if (dt.replace(tzinfo=None) > end or \n", + " (nconstants==0 and dt.replace(tzinfo=None) < start)):\n", " continue\n", "\n", " closest_BP = None\n", @@ -236,12 +235,15 @@ "# Remove dublications\n", "constant_versions_tmp = []\n", "constant_parameters_tmp = []\n", + "constantBP_versions_tmp = []\n", "for i, x in enumerate(constant_versions):\n", " if x not in constant_versions_tmp:\n", " constant_versions_tmp.append(x)\n", " constant_parameters_tmp.append(constant_parameters[i])\n", - " \n", + " if i<len(constantBP_versions)-1:\n", + " constantBP_versions_tmp.append(constantBP_versions[i])\n", "constant_versions=constant_versions_tmp\n", + "constantBP_versions=constantBP_versions_tmp\n", "constant_parameters=constant_parameters_tmp\n", "\n", "print('Number of stored constant versions is {}'.format(len(constant_versions)))\n" @@ -266,19 +268,25 @@ "ret_constants = {}\n", "constand_data = ConstantMetaData()\n", "constant_BP = ConstantMetaData()\n", - "for i, constant_version in enumerate(constant_versions):\n", "\n", - " const = constant_version['data_set_name'].split('/')[-2]\n", + "# sort over begin_at\n", + "idxs, _ = zip(*sorted(enumerate(constant_versions), \n", + " key=lambda x: x[1]['begin_at'], reverse=True))\n", + "\n", + "for i in idxs:\n", + " const = constant_versions[i]['data_set_name'].split('/')[-2]\n", " qm = db_module\n", " \n", - " print(\"constant: {}, module {}\".format(const,qm))\n", - " \n", - " constand_data.retrieve_from_version_info(constant_version)\n", - " \n", " if not const in ret_constants:\n", " ret_constants[const] = {}\n", " if not qm in ret_constants[const]:\n", " ret_constants[const][qm] = []\n", + " \n", + " if nconstants>0 and len(ret_constants[const][qm])>=nconstants:\n", + " continue\n", + " \n", + " print(\"constant: {}, module {}\".format(const,qm))\n", + " constand_data.retrieve_from_version_info(constant_versions[i])\n", " \n", " cdata = constand_data.calibration_constant.data\n", " ctime = constand_data.calibration_constant_version.begin_at\n", @@ -374,13 +382,6 @@ "\n", " print('Const: {}'.format(const))\n", "\n", - " # loop over modules\n", - " mod_data = {}\n", - " mod_data['stdASIC'] = []\n", - " mod_data['stdCell'] = []\n", - " mod_names = []\n", - " mod_times = []\n", - "\n", " # Loop over modules\n", " for mod, data in modules.items():\n", " print(mod)\n", @@ -422,32 +423,13 @@ " continue\n", " pdata[key] = rdata[key][:, :, :].reshape(nTimes, nBins).swapaxes(0, 1)\n", "\n", - " # Summary over ASICs\n", - " adata = {}\n", - " for key in rdata:\n", - " if key not in ['Mean', 'std']:\n", - " continue\n", - " adata[key] = np.nanmean(rdata[key], axis=(1, 2))\n", - "\n", - " # Summary information over modules\n", - " for key in pdata:\n", - " if key not in mod_data:\n", - " mod_data[key] = []\n", - " mod_data[key].append(np.nanmean(pdata[key], axis=0))\n", - "\n", - " mod_data['stdASIC'].append(np.nanstd(rdata['Mean'], axis=(1, 2)))\n", - "\n", - " mod_names.append(mod)\n", - " mod_times.append(ctimes_ticks)\n", - "\n", " # Plotting\n", " for key in pdata:\n", " \n", " if key not in ['Mean', 'std']:\n", " continue\n", " \n", - " vmin = None\n", - " vmax = None\n", + " vmin,vmax = get_range(pdata[key][::-1].flatten(), plot_range)\n", " if const in rangevals and key in ['Mean', 'MeanBP']:\n", " vmin = rangevals[const][0][0]\n", " vmax = rangevals[const][0][1]\n", -- GitLab