From 27a9ca24e24b3c45b585ca3efb3feb3c7b107b00 Mon Sep 17 00:00:00 2001 From: Rafael Gort <rafael.gort@xfel.eu> Date: Fri, 25 Sep 2020 18:29:18 +0200 Subject: [PATCH 1/3] Adaptation to processing routines such that they avoid return values. Test suites to be updated --- src/toolbox_scs/detectors/__init__.py | 3 ++- src/toolbox_scs/detectors/dssc.py | 10 ++++----- src/toolbox_scs/detectors/dssc_data.py | 8 +++++++ src/toolbox_scs/detectors/dssc_processing.py | 22 +++++++++++--------- 4 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/toolbox_scs/detectors/__init__.py b/src/toolbox_scs/detectors/__init__.py index 545a784..8189827 100644 --- a/src/toolbox_scs/detectors/__init__.py +++ b/src/toolbox_scs/detectors/__init__.py @@ -3,7 +3,7 @@ from .xgm import ( from .tim import ( load_TIM,) from .dssc_data import ( - save_xarray, load_xarray, get_data_formatted) + save_xarray, load_xarray, get_data_formatted, save_attributes_h5) from .dssc_misc import ( load_dssc_info, create_dssc_bins, quickmask_DSSC_ASIC, get_xgm_formatted, load_mask) @@ -27,6 +27,7 @@ __all__ = ( "save_xarray", "load_xarray", "get_data_formatted", + "save_attributes_h5", "quickmask_DSSC_ASIC", "load_mask", # Classes diff --git a/src/toolbox_scs/detectors/dssc.py b/src/toolbox_scs/detectors/dssc.py index 2c3e726..333abe4 100644 --- a/src/toolbox_scs/detectors/dssc.py +++ b/src/toolbox_scs/detectors/dssc.py @@ -182,7 +182,7 @@ class DSSCBinner: # ------------------------------------------------------------------------- # Data processing # ------------------------------------------------------------------------- - def process_data(self, modules=[], + def process_data(self, modules=[], filepath='./', chunksize=512, backend='loky', n_jobs=None, dark_image=None, xgm_normalization=False, normevery=1 @@ -240,6 +240,7 @@ class DSSCBinner: run_nr=self.runnr, module=m, chunksize=chunksize, + path=filepath, info=self.info, dssc_binners=self.binners, pulsemask=self.pulsemask, @@ -252,14 +253,13 @@ class DSSCBinner: data = None log.info(f'using parallelization backend {backend}') - data = joblib.Parallel(n_jobs=njobs, backend=backend) \ + joblib.Parallel(n_jobs=njobs, backend=backend) \ (joblib.delayed(process_dssc_data)(**module_jobs[i]) \ for i in range(len(mod_list))) - data = xr.concat(data, dim='module') - data = data.assign_coords(module=("module", np.array(mod_list))) + #data = xr.concat(data, dim='module') + #data = data.assign_coords(module=("module", np.array(mod_list))) log.info(f'Binning done') - return data class DSSCFormatter: diff --git a/src/toolbox_scs/detectors/dssc_data.py b/src/toolbox_scs/detectors/dssc_data.py index f38afe6..fa918bb 100644 --- a/src/toolbox_scs/detectors/dssc_data.py +++ b/src/toolbox_scs/detectors/dssc_data.py @@ -157,6 +157,11 @@ def get_data_formatted(filenames=[], data_list=[]): elif any(data_list) is True: data = data_list + mod_list = [] + for d in data: + if 'module' in d.attrs.keys(): + mod_list.append(d.attrs['module']) + if type(data[0]).__module__ == 'xarray.core.dataset': data = xr.concat(data, dim='module') elif type(data[0]).__module__ == 'pandas.core.frame': @@ -164,7 +169,10 @@ def get_data_formatted(filenames=[], data_list=[]): elif type(data[0]).__module__ == 'dask.dataframe.core': pass + if mod_list is not None: + data = data.assign_coords(module=("module", mod_list)) data = data.sortby("module") + data.attrs.clear() return data.transpose('trainId', 'pulse', 'module', 'x', 'y') diff --git a/src/toolbox_scs/detectors/dssc_processing.py b/src/toolbox_scs/detectors/dssc_processing.py index fb8eb0d..256e13f 100644 --- a/src/toolbox_scs/detectors/dssc_processing.py +++ b/src/toolbox_scs/detectors/dssc_processing.py @@ -4,6 +4,7 @@ comment: contributions should comply with pep8 code structure guidelines. """ import logging +import os from tqdm import tqdm import numpy as np @@ -14,6 +15,7 @@ import extra_data as ed from .dssc_misc import get_xgm_formatted from ..constants import mnemonics as _mnemonics +from .dssc_data import save_xarray log = logging.getLogger(__name__) @@ -134,11 +136,12 @@ def _load_chunk_xgm(sel, xgm_mnemonic, stride): return d -def process_dssc_data(proposal, run_nr, module, chunksize, info, dssc_binners, +def process_dssc_data(proposal, run_nr, module, chunksize, info, dssc_binners, + path='./', pulsemask=None, dark_image=None, xgm_normalization=False, - xgm_mnemonic='SCS_SA3', + xgm_mnemonic='SCS_SA3', normevery=1 ): """ @@ -195,10 +198,6 @@ def process_dssc_data(proposal, run_nr, module, chunksize, info, dssc_binners, # create empty dataset for dssc data to be filled iteratively module_data = create_empty_dataset(info, dssc_binners) - # progress bar for module 15 - if module == 15: - pbar = tqdm(total=len(chunks)) - # load data chunk by chunk and merge result into prepared empty dataset for chunk in chunks: log.debug(f"Module {module}: " @@ -263,12 +262,15 @@ def process_dssc_data(proposal, run_nr, module, chunksize, info, dssc_binners, log.debug(f"Module {module}: " f"processed trains {chunk}:{chunk + chunksize}") - if module == 15: - pbar.update(1) - log.debug(f'Module {module}: calculate mean') module_data['data'] = module_data['data'] / module_data['hist'] module_data = module_data.transpose('trainId', 'pulse', 'x', 'y') + module_data.attrs['module'] = module + + log.info(f'saving module {module}') + if not os.path.isdir(path): + os.mkdir(path) + fname = f'run_{run_nr}_module{module}.h5' + save_xarray(path+fname, module_data, mode='a') log.info(f"processing module {module}: done") - return module_data -- GitLab From 90c4a286f0ca2e041299b9e659b010464bb94532 Mon Sep 17 00:00:00 2001 From: Rafael Gort <rafael.gort@xfel.eu> Date: Fri, 25 Sep 2020 19:51:55 +0200 Subject: [PATCH 2/3] Removed outdated test suites --- src/toolbox_scs/test/test_detectors_common.py | 121 ------ src/toolbox_scs/test/test_dssc_cls.py | 153 +------- src/toolbox_scs/test/test_dssc_methods.py | 353 ------------------ 3 files changed, 1 insertion(+), 626 deletions(-) delete mode 100644 src/toolbox_scs/test/test_detectors_common.py delete mode 100644 src/toolbox_scs/test/test_dssc_methods.py diff --git a/src/toolbox_scs/test/test_detectors_common.py b/src/toolbox_scs/test/test_detectors_common.py deleted file mode 100644 index 7e54d49..0000000 --- a/src/toolbox_scs/test/test_detectors_common.py +++ /dev/null @@ -1,121 +0,0 @@ -import unittest -import logging -import os -import sys -import argparse - - -import toolbox_scs as tb -import toolbox_scs.detectors as tbdet -from toolbox_scs.util.exceptions import * - -logging.basicConfig(level=logging.DEBUG) -log_root = logging.getLogger(__name__) - -suites = {"packaging": ( - "test_init",), - "xgm": ( - "test_loadxgm", - "test_cleanxgm", - "test_matchxgmtim",), - "tim": ( - "test_loadtim",) - } - - -def list_suites(): - print("""\nPossible test suites:\n-------------------------""") - for key in suites: - print(key) - print("-------------------------\n") - - -class TestDetectors(unittest.TestCase): - @classmethod - def setUpClass(cls): - log_root.info("Start global setup.") - cls._run = tb.load_run(2212, 235) - - fields = ["sase1", "sase3", "npulses_sase3", - "npulses_sase1", "MCP2apd", "SCS_SA3", "nrj"] - cls._tb_data = tb.load(fields, 235, 2212) - - log_root.info("Finished global setup, start tests.") - - @classmethod - def tearDownClass(cls): - pass - - def setUp(self): - pass - - def tearDown(self): - pass - - def test_init(self): - self.assertEqual(tbdet.__name__, "toolbox_scs.detectors") - - def test_loadxgm(self): - cls = self.__class__ - xgm_data = tbdet.load_xgm(cls._run) - self.assertTrue(xgm_data.values[0][-1]) - - def test_cleanxgm(self): - cls = self.__class__ - data = tbdet.cleanXGMdata(cls._tb_data) - self.assertEqual(data['sa3_pId'].values[-1], 19) - - def test_matchxgmtim(self): - cls = self.__class__ - data = tbdet.matchXgmTimPulseId(cls._tb_data) - self.assertEqual(data['npulses_sase3'].values[0], 20) - - def test_loadtim(self): - cls = self.__class__ - data = tbdet.load_TIM(cls._run) - self.assertEqual(data.name, 'MCP2apd') - - - -def suite(*tests): - suite = unittest.TestSuite() - for test in tests: - suite.addTest(TestDetectors(test)) - return suite - - -def main(*cliargs): - try: - for test_suite in cliargs: - if test_suite in suites: - runner = unittest.TextTestRunner(verbosity=2) - runner.run(suite(*suites[test_suite])) - else: - log_root.warning( - "Unknown suite: '{}'".format(test_suite)) - pass - except Exception as err: - log_root.error("Unecpected error: {}".format(err), - exc_info=True) - pass - - - - - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--list-suites', - action='store_true', - help='list possible test suites') - parser.add_argument('--run-suites', metavar='S', - nargs='+', action='store', - help='a list of valid test suites') - args = parser.parse_args() - - if args.list_suites: - list_suites() - - if args.run_suites: - main(*args.run_suites) diff --git a/src/toolbox_scs/test/test_dssc_cls.py b/src/toolbox_scs/test/test_dssc_cls.py index f1bc984..c43b45f 100644 --- a/src/toolbox_scs/test/test_dssc_cls.py +++ b/src/toolbox_scs/test/test_dssc_cls.py @@ -19,14 +19,8 @@ log_root = logging.getLogger(__name__) suites = {"no-processing": ( "test_create", ), - "processing-quick": ( - "test_binning_quick", - ), "processing": ( - #"test_process_masking", - #"test_process_normalization", - "test_normalization_all", - #"test_normalization_all2", + "test_normalization_all2", ) } @@ -102,151 +96,6 @@ class TestDSSC(unittest.TestCase): self.assertEqual(str(cm.exception), err_msg) - def test_binning_quick(self): - # dark - proposal_nb = 2212 - run_nb = 232 - run = tb.load_run(proposal_nb, run_nb, include='*DA*') - run_info = tbdet.load_dssc_info(proposal_nb, run_nb) - bins_trainId = tb.get_array(run, - 'PP800_PhaseShifter', - 0.03) - bins_pulse = ['pumped', 'unpumped'] * 10 - - binner1 = tbdet.create_dssc_bins("trainId", - run_info['trainIds'], - bins_trainId.values) - binner2 = tbdet.create_dssc_bins("pulse", - np.linspace(0,19,20, dtype=int), - bins_pulse) - binners = {'trainId': binner1, 'pulse': binner2} - run232 = tbdet.DSSCBinner(proposal_nb, run_nb, binners=binners) - mod_list = [0, 15] - data = run232.process_data(modules=mod_list, chunksize=256) - self.assertIsNotNone(data.data) - #data = run232.process_data(backend='multiprocessing', n_jobs=10, - # modules=mod_list, - # chunksize=128) - self.assertIsNotNone(data.data) - - tbdet.save_xarray('./tmp/run232.h5', data) - data = tbdet.load_xarray('./tmp/run232.h5') - self.assertIsNotNone(data.data) - - - def test_process_masking(self): - proposal_nb = 2212 - run_nb = 235 - - run_info = tbdet.load_dssc_info(proposal_nb, run_nb) - fpt = run_info['frames_per_train'] - n_trains = run_info['number_of_trains'] - trainIds = run_info['trainIds'] - - run_obj = ed.open_run(proposal_nb,run_nb) - del_pos = tb.get_array(run_obj, 'PP800_PhaseShifter', 0.03) - - buckets_train = del_pos.values - buckets_pulse = ['pumped', 'unpumped'] * 10 - - binner1 = tbdet.create_dssc_bins("trainId", trainIds, buckets_train) - binner2 = tbdet.create_dssc_bins("pulse", - np.linspace(0,fpt-1,fpt, dtype=int), - buckets_pulse) - binners = {'trainId': binner1, 'pulse': binner2} - bin_obj = tbdet.DSSCBinner(proposal_nb, run_nb, binners) - - dssc_norm_every = 1 - xgm_threshold=(300.0, 8000.0) - bin_obj.create_xgm_mask(xgm_threshold, dssc_norm_every) - - data = bin_obj.process_data(modules=[3], chunksize=248) - self.assertIsNotNone(dark_data.data) - - - def test_process_normalization(self): - proposal_nb = 2212 - run_nb = 235 - - run_info = tbdet.load_dssc_info(proposal_nb, run_nb) - fpt = run_info['frames_per_train'] - n_trains = run_info['number_of_trains'] - trainIds = run_info['trainIds'] - - run_obj = ed.open_run(proposal_nb,run_nb) - del_pos = tb.get_array(run_obj, 'PP800_PhaseShifter', 0.03) - - buckets_train = del_pos.values - buckets_pulse = ['pumped', 'unpumped'] * 10 - - binner1 = tbdet.create_dssc_bins("trainId", trainIds, buckets_train) - binner2 = tbdet.create_dssc_bins("pulse", - np.linspace(0,fpt-1,fpt, dtype=int), - buckets_pulse) - binners = {'trainId': binner1, 'pulse': binner2} - bin_obj = tbdet.DSSCBinner(proposal_nb, run_nb, binners) - - dssc_norm_every = 1 - xgm_threshold=(300.0, 8000.0) - bin_obj.create_xgm_mask(xgm_threshold, dssc_norm_every) - - data = bin_obj.process_data(modules=[3,15], chunksize=248, - xgm_normalization=True, - normevery=dssc_norm_every) - self.assertIsNotNone(data.data) - - def test_normalization_all(self): - proposal_nb = 2212 - run_nb = 232 - - run_info = tbdet.load_dssc_info(proposal_nb, run_nb) - fpt = run_info['frames_per_train'] - n_trains = run_info['number_of_trains'] - trainIds = run_info['trainIds'] - - buckets_train = np.zeros(n_trains) - buckets_pulse = ['dark'] * fpt - - binner1 = tbdet.create_dssc_bins("trainId", trainIds, buckets_train) - binner2 = tbdet.create_dssc_bins("pulse", - np.linspace(0,fpt-1,fpt, dtype=int), - buckets_pulse) - binners = {'trainId': binner1, 'pulse': binner2} - bin_obj = tbdet.DSSCBinner(proposal_nb, run_nb, binners) - - dark_data = bin_obj.process_data(modules=[2,3,4,15], chunksize=248) - self.assertIsNotNone(dark_data.data) - - run_nb = 235 - - run_info = tbdet.load_dssc_info(proposal_nb, run_nb) - fpt = run_info['frames_per_train'] - n_trains = run_info['number_of_trains'] - trainIds = run_info['trainIds'] - - run_obj = ed.open_run(proposal_nb,run_nb) - del_pos = tb.get_array(run_obj, 'PP800_PhaseShifter', 0.03) - - buckets_train = del_pos.values - buckets_pulse = ['pumped', 'unpumped'] * 10 - - binner1 = tbdet.create_dssc_bins("trainId", trainIds, buckets_train) - binner2 = tbdet.create_dssc_bins("pulse", - np.linspace(0,fpt-1,fpt, dtype=int), - buckets_pulse) - binners = {'trainId': binner1, 'pulse': binner2} - bin_obj = tbdet.DSSCBinner(proposal_nb, run_nb, binners) - - dssc_norm_every = 1 - xgm_threshold=(300.0, 8000.0) - bin_obj.create_xgm_mask(xgm_threshold, dssc_norm_every) - - data = bin_obj.process_data(modules=[2,3,4,15], chunksize=248, - dark_image=dark_data['data'], - xgm_normalization=True, - normevery=dssc_norm_every) - self.assertIsNotNone(data.data) - def test_normalization_all2(self): proposal_nb = 2530 diff --git a/src/toolbox_scs/test/test_dssc_methods.py b/src/toolbox_scs/test/test_dssc_methods.py deleted file mode 100644 index 6b5739a..0000000 --- a/src/toolbox_scs/test/test_dssc_methods.py +++ /dev/null @@ -1,353 +0,0 @@ -import unittest -import logging -import os -import argparse -import shutil -import joblib -from time import strftime - -import numpy as np -import xarray as xr - -import extra_data as ed -import toolbox_scs as tb -import toolbox_scs.detectors as tbdet -from toolbox_scs.detectors.dssc_processing import (load_chunk_data, - create_empty_dataset) -from toolbox_scs.util.exceptions import ToolBoxFileError - -logging.basicConfig(level=logging.DEBUG) -log_root = logging.getLogger(__name__) - - -suites = {"metafunctions": ( - "test_info", - "test_binners", - #"test_createpulsemask", - "test_createempty", - #"test_loadmergechunk", - #"test_storage", - ), - "binning-normalize": ( - "normalize_xgm", - ) - } - - -_temp_dirs = ['tmp'] - - -def setup_tmp_dir(): - for d in _temp_dirs: - if not os.path.isdir(d): - os.mkdir(d) - - -def cleanup_tmp_dir(): - for d in _temp_dirs: - shutil.rmtree(d, ignore_errors=True) - log_root.info(f'remove {d}') - - -class TestDSSC(unittest.TestCase): - @classmethod - def setUpClass(cls): - log_root.info("Start global setup") - # --------------------------------------------------------------------- - # global test settings - # --------------------------------------------------------------------- - - setup_tmp_dir() - - # --------------------------------------------------------------------- - log_root.info("Finished global setup, start tests") - - - @classmethod - def tearDownClass(cls): - log_root.info("Clean up test environment....") - cleanup_tmp_dir() - - - def test_info(self): - proposal = 2212 - run_nr = 235 - info = tbdet.load_dssc_info(proposal, run_nr) - self.assertEqual(info['frames_per_train'], 20) - - - def test_binners(self): - cls = self.__class__ - proposal = 2212 - run_nr = 235 - cls._dssc_info_235 = tbdet.load_dssc_info(proposal, run_nr) - cls._run_235 = tb.load_run(proposal, run_nr, include='*DA*') - - # create 3 different binners manually - bins_trainId_name = 'PP800_PhaseShifter' - stepsize = .04 - bins_trainId = tb.get_array(cls._run_235, - 'PP800_PhaseShifter', - stepsize) - bins_pulse = ['pumped', 'unpumped'] * 10 - - - bin1 = tbdet.create_dssc_bins("trainId", - cls._dssc_info_235['trainIds'], - bins_trainId.values) - bin2 = tbdet.create_dssc_bins("pulse", - np.linspace(0,19,20, dtype=int), - bins_pulse) - bin3 = tbdet.create_dssc_bins("x", - np.linspace(1,128,128, dtype=int), - np.linspace(1,128,128, dtype=int)) - # create binner with invalid name - with self.assertRaises(ValueError) as err: - bin2 = tbdet.create_dssc_bins("blabla", - np.linspace(0,19,20, dtype=int), - bins_pulse) - - # format binner dictionary. The 4th binner is constructed automatically - binners = {"trainId": bin1, - "pulse": bin2, - "x": bin3} - self.assertIsNotNone(binners) - cls._binners_235 = {'trainId':bin1,'pulse':bin2} - - - def test_createpulsemask(self): - cls = self.__class__ - xgm_min = 0 - xgm_max = np.inf - - data = np.ones([len(cls._run_235.train_ids), - cls._dssc_info_235['frames_per_train']], dtype=bool) - dimensions = ['trainId', 'pulse'] - coordinates = {'trainId': cls._run_235.train_ids, - 'pulse': range(cls._dssc_info_235['frames_per_train'])} - pulsemask = xr.DataArray(data, dims=dimensions, coords=coordinates) - - valid = (cls._xgm > xgm_min) * (cls._xgm < xgm_max) - cls._pulsemask = valid.combine_first(pulsemask).astype(bool) - - self.assertIsNotNone(cls._pulsemask) - - - def test_createempty(self): - cls = self.__class__ - - # standard dset - empty_data = create_empty_dataset(cls._dssc_info_235, cls._binners_235) - self.assertIsNotNone(empty_data.dims['trainId']) - - # bin along pulse dimension only - bins_pulse = ['pumped', 'unpumped', 'pumped_dark', 'unpumped_dark'] * 5 - binner_pulse = tbdet.create_dssc_bins("pulse", - np.linspace(0,19,20, dtype=int), - bins_pulse) - empty_data = create_empty_dataset(cls._dssc_info_235, - {'pulse':binner_pulse}) - self.assertEqual(empty_data.pulse.values[1], 'pumped_dark') - - - def test_loadmergechunk(self): - cls = self.__class__ - # load single chunk - proposal = 2212 - run_nr = 235 - module = 1 - chunksize = 512 - sourcename = f'SCS_DET_DSSC1M-1/DET/{module}CH0:xtdf' - - collection = ed.open_run(proposal, run_nr, - include=f'*DSSC{module:02d}*') - - binners = cls._binners_235 - info = cls._dssc_info_235 - pulsemask = cls._pulsemask - - ntrains = len(collection.train_ids) - chunks = np.arange(ntrains, step=chunksize) - start_index = chunks[0] - - module_data = create_empty_dataset(info, binners) - - for chunk in chunks[0:2]: - sel = collection.select_trains( - ed.by_index[chunk:chunk + chunksize]) - log_root.debug(f"Module {module}: " - f"loading trains {chunk}:{chunk + chunksize}") - chunk_data = load_chunk_data(sel, sourcename) - self.assertIsNotNone(chunk_data) - - # pulse masking, and creation of related hist subset. - chunk_hist = xr.full_like(chunk_data[:,:,0,0], fill_value=1) - if pulsemask is not None: - chunk_data = chunk_data.where(pulsemask) - chunk_hist = chunk_hist.where(pulsemask) - chunk_data = chunk_data.to_dataset(name='data') - chunk_data['hist'] = chunk_hist - - # apply predefined binning - log_root.debug(f'Module {module}: apply binning to chunk_data') - for b in binners: - chunk_data[b+"_binned"] = binners[b] - chunk_data = chunk_data.groupby(b+"_binned").sum(b) - chunk_data = chunk_data.rename(name_dict={b+"_binned":b}) - # ToDo: Avoid creation of unnecessary data when binning along x,y - - # merge dsets and format - log_root.debug(f'Module {module}: merge data into prepared dset') - for var in ['data', 'hist']: - module_data[var] = xr.concat([module_data[var], - chunk_data[var]], - dim='tmp').sum('tmp') - - #module_data = module_data.transpose('trainId', 'pulse', 'x', 'y') - cls._module_data = module_data - self.assertIsNotNone(module_data) - - - def normalize_xgm(self): - cls = self.__class__ - # load single chunk - proposal = 2530 - run_nr = 50 - module = 1 - chunksize = 128 - sourcename = f'SCS_DET_DSSC1M-1/DET/{module}CH0:xtdf' - - collection = ed.open_run(proposal, run_nr, - include=f'*DSSC{module:02d}*') - collection_DA1 = ed.open_run(proposal, run_nr, include='*DA01*') - - dssc_info = tbdet.load_dssc_info(proposal, run_nr) - fpt = dssc_info['frames_per_train'] - - buckets_train = np.zeros(len(collection.train_ids)) - binner1 = tbdet.create_dssc_bins( - "trainId",collection.train_ids,buckets_train) - - buckets_pulse = ['image', 'dark'] * 99 + ['image_last'] - binner2 = tbdet.create_dssc_bins( - "pulse",np.linspace(0,fpt-1,fpt, dtype=int),buckets_pulse) - binners = {'trainId':binner1, 'pulse':binner2} - - - ntrains = len(collection.train_ids) - chunks = np.arange(ntrains, step=chunksize) - start_index = chunks[0] - - module_data = create_empty_dataset(dssc_info, binners) - - for chunk in chunks[0:1]: - sel = collection.select_trains( - ed.by_index[chunk:chunk + chunksize]) - sel_DA1 = collection_DA1.select_trains( - ed.by_index[chunk:chunk + chunksize]) - log_root.debug(f"Module {module}: " - f"loading trains {chunk}:{chunk + chunksize}") - chunk_data = load_chunk_data(sel, sourcename) - self.assertIsNotNone(chunk_data) - - # pulse masking, and creation of related hist subset. - chunk_hist = xr.full_like(chunk_data[:,:,0,0], fill_value=1) - chunk_data = chunk_data.to_dataset(name='data') - chunk_data['hist'] = chunk_hist - - log_root.debug('load and format xgm data') - xgm_mnem = tb.mnemonics['SCS_SA3'].values() - data_xgm = sel_DA1.get_array(*xgm_mnem) - data_xgm = data_xgm.rename( - new_name_or_name_dict={'XGMbunchId':'pulse'}) - - xgm_shape = data_xgm.shape[1] - norm_every = int(2) - xgm_coord_arr = np.linspace(0, - norm_every*(xgm_shape-1), - xgm_shape, dtype=int) - - data_xgm = data_xgm.assign_coords({'pulse':xgm_coord_arr}) - log_root.debug('normalize chunk_data using xgm') - chunk_data['data'][:,::norm_every,:,:] =\ - chunk_data['data'][:,::norm_every,:,:] /\ - data_xgm[:,0:int(np.ceil(fpt/norm_every))] - - # apply predefined binning - log_root.debug(f'Module {module}: apply binning to chunk_data') - for b in binners: - chunk_data[b+"_binned"] = binners[b] - chunk_data = chunk_data.groupby(b+"_binned").sum(b) - chunk_data = chunk_data.rename(name_dict={b+"_binned":b}) - - # merge dsets and format - log_root.debug(f'Module {module}: merge data into prepared dset') - for var in ['data', 'hist']: - module_data[var] = xr.concat([module_data[var], - chunk_data[var]], - dim='tmp').sum('tmp') - - #module_data = module_data.transpose('trainId', 'pulse', 'x', 'y') - - - def test_storage(self): - cls = self.__class__ - - tbdet.save_xarray('./tmp/run235.h5', cls._module_data) - tbdet.save_xarray('./tmp/run235.h5', cls._module_data, - mode = 'w') - run235 = tbdet.load_xarray('./tmp/run235.h5') - - self.assertIsNotNone(run235) - #run235.close() - - with self.assertRaises(ToolBoxFileError) as cm: - tbdet.save_xarray('./tmp/run235.h5', - cls._module_data.isel(pulse=0), - mode = 'a') - -def list_suites(): - print("\nPossible test suites:\n" + "-" * 79) - for key in suites: - print(key) - print("-" * 79 + "\n") - - -def suite(*tests): - suite = unittest.TestSuite() - for test in tests: - suite.addTest(TestDSSC(test)) - return suite - - -def main(*cliargs): - try: - for test_suite in cliargs: - if test_suite in suites: - runner = unittest.TextTestRunner(verbosity=2) - runner.run(suite(*suites[test_suite])) - else: - log_root.warning( - "Unknown suite: '{}'".format(test_suite)) - pass - except Exception as err: - log_root.error("Unecpected error: {}".format(err), - exc_info=True) - pass - - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--list-suites', - action='store_true', - help='list possible test suites') - parser.add_argument('--run-suites', metavar='S', - nargs='+', action='store', - help='a list of valid test suites') - args = parser.parse_args() - - if args.list_suites: - list_suites() - - if args.run_suites: - main(*args.run_suites) -- GitLab From def53c7d988927839070a733348dbec4a480c25f Mon Sep 17 00:00:00 2001 From: Rafael Gort <rafael.gort@xfel.eu> Date: Fri, 25 Sep 2020 20:23:27 +0200 Subject: [PATCH 3/3] removed outdated comments --- src/toolbox_scs/detectors/dssc.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/toolbox_scs/detectors/dssc.py b/src/toolbox_scs/detectors/dssc.py index 333abe4..a5aa64b 100644 --- a/src/toolbox_scs/detectors/dssc.py +++ b/src/toolbox_scs/detectors/dssc.py @@ -257,8 +257,6 @@ class DSSCBinner: (joblib.delayed(process_dssc_data)(**module_jobs[i]) \ for i in range(len(mod_list))) - #data = xr.concat(data, dim='module') - #data = data.assign_coords(module=("module", np.array(mod_list))) log.info(f'Binning done') -- GitLab