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