diff --git a/km3io/daq.py b/km3io/daq.py index eb12052b6070852852c6d8bf7dc61714ecc26b7d..e1f1e55ca5001766d54e1a21d80a9430eb3b0047 100644 --- a/km3io/daq.py +++ b/km3io/daq.py @@ -30,9 +30,10 @@ def get_rate(value): return MINIMAL_RATE_HZ * np.exp(value * RATE_FACTOR) -@nb.guvectorize( - "void(i8, b1[:], b1[:])", "(), (n) -> (n)", target="parallel", nopython=True - ) +@nb.guvectorize("void(i8, b1[:], b1[:])", + "(), (n) -> (n)", + target="parallel", + nopython=True) def unpack_bits(value, bits_template, out): """Return a boolean array for a value's bit representation. diff --git a/km3io/offline.py b/km3io/offline.py index 362d90d69311cd587706ce71f2e3211cac511994..8bd986d53834e73ff8d5a2f66e8080333c2462b6 100644 --- a/km3io/offline.py +++ b/km3io/offline.py @@ -5,7 +5,6 @@ import km3io.definitions.trigger import km3io.definitions.fitparameters import km3io.definitions.reconstruction - # 110 MB based on the size of the largest basket found so far in km3net BASKET_CACHE_SIZE = 110 * 1024**2 @@ -178,7 +177,9 @@ class OfflineKeys: list of all "trks.fitinf" keys. """ if self._fit_keys is None: - self._fit_keys = sorted(self.fitparameters, key=self.fitparameters.get, reverse=False) + self._fit_keys = sorted(self.fitparameters, + key=self.fitparameters.get, + reverse=False) # self._fit_keys = [*fit.keys()] return self._fit_keys @@ -377,13 +378,13 @@ class OfflineReader: if b'Head;1' in fobj.keys(): self._header = {} for n, x in fobj['Head']._map_3c_string_2c_string_3e_.items(): - print("{:15s} {}".format(n.decode("utf-8"), x.decode("utf-8"))) + print("{:15s} {}".format(n.decode("utf-8"), + x.decode("utf-8"))) self._header[n.decode("utf-8")] = x.decode("utf-8") if b'Header;1' in fobj.keys(): warnings.warn("Your file header has an unsupported format") return self._header - @property def keys(self): """wrapper for all keys in an offline file. @@ -491,17 +492,21 @@ class OfflineReader: """ if self._best_reco is None: keys = ", ".join(self.keys.fit_keys[:-1]) - empty_fit_info = np.array([match for match in - self._find_empty(self.tracks.fitinf)]) - fit_info = [i for i,j in zip(self.tracks.fitinf, - empty_fit_info[:,1]) if j is not None] + empty_fit_info = np.array( + [match for match in self._find_empty(self.tracks.fitinf)]) + fit_info = [ + i for i, j in zip(self.tracks.fitinf, empty_fit_info[:, 1]) + if j is not None + ] stages = self._get_max_reco_stages(self.tracks.rec_stages) - fit_data = np.array([i[j] for i,j in zip(fit_info, stages[:,2])]) + fit_data = np.array([i[j] for i, j in zip(fit_info, stages[:, 2])]) rows_size = len(max(fit_data, key=len)) - equal_size_data = np.vstack([np.hstack([i, np.zeros(rows_size-len(i)) - + np.nan]) for i in fit_data]) - self._best_reco = np.core.records.fromarrays(equal_size_data.transpose(), - names=keys) + equal_size_data = np.vstack([ + np.hstack([i, np.zeros(rows_size - len(i)) + np.nan]) + for i in fit_data + ]) + self._best_reco = np.core.records.fromarrays( + equal_size_data.transpose(), names=keys) return self._best_reco def _get_max_reco_stages(self, reco_stages): @@ -522,12 +527,14 @@ class OfflineReader: *lentgh of the maximum reco_stages *position of the maximum reco_stages """ - empty_reco_stages = np.array([match for match in - self._find_empty(reco_stages)]) - max_reco_stages = np.array([[max(i, key=len), len(max(i, key=len)), - i.index(max(i, key=len))] for i,j in - zip(reco_stages, empty_reco_stages[:,1]) - if j is not None]) + empty_reco_stages = np.array( + [match for match in self._find_empty(reco_stages)]) + max_reco_stages = np.array( + [[max(i, key=len), + len(max(i, key=len)), + i.index(max(i, key=len))] + for i, j in zip(reco_stages, empty_reco_stages[:, 1]) + if j is not None]) return max_reco_stages def get_reco_fit(self, stages): @@ -555,17 +562,21 @@ class OfflineReader: """ keys = ", ".join(self.keys.fit_keys[:-1]) fit_info = self.tracks.fitinf - rec_stages = np.array([match for match in - self._find_rec_stages(stages)]) - if np.all(rec_stages[:,1]==None): - raise ValueError("The stages {} are not found in your file." - .format(str(stages))) + rec_stages = np.array( + [match for match in self._find_rec_stages(stages)]) + if np.all(rec_stages[:, 1] == None): + raise ValueError( + "The stages {} are not found in your file.".format( + str(stages))) else: - fit_data = np.array([i[k] for i,j,k in zip(fit_info, - rec_stages[:,0], rec_stages[:,1]) - if k is not None]) + fit_data = np.array([ + i[k] + for i, j, k in zip(fit_info, rec_stages[:, 0], rec_stages[:, + 1]) + if k is not None + ]) rec_array = np.core.records.fromarrays(fit_data.transpose(), - names=keys) + names=keys) return rec_array def _find_rec_stages(self, stages): @@ -615,9 +626,9 @@ class OfflineReader: """ for i, rs in enumerate(array): try: - if len(rs)==0: + if len(rs) == 0: j = None - if len(rs)!=0: + if len(rs) != 0: j = rs.index([]) except ValueError: j = False # rs not empty but [] not found @@ -784,11 +795,8 @@ class OfflineTracks: return OfflineTrack(self._keys, [v[item] for v in self._values], fitparameters=self._fitparameters) else: - return OfflineTracks( - self._keys, - [v[item] for v in self._values], - fitparameters=self._fitparameters - ) + return OfflineTracks(self._keys, [v[item] for v in self._values], + fitparameters=self._fitparameters) def __len__(self): try: @@ -831,8 +839,10 @@ class OfflineTrack: "{:30} {:^2} {:>26}".format(k, ':', str(v)) for k, v in zip(self._keys, self._values) if k not in ['fitinf'] ]) + "\n\t" + "\n\t".join([ - "{:30} {:^2} {:>26}".format(k, ':', str(getattr(self, 'fitinf')[v])) - for k, v in self._fitparameters.items() if len(getattr(self, 'fitinf'))>v + "{:30} {:^2} {:>26}".format(k, ':', str( + getattr(self, 'fitinf')[v])) + for k, v in self._fitparameters.items() + if len(getattr(self, 'fitinf')) > v ]) # I don't like 18 being explicit here def __getitem__(self, item): diff --git a/requirements-dev.txt b/requirements-dev.txt index ab7cf28580f2dcfbc3ee5f3fb1bd354853f9639e..25bd197c80c8c619fa392e662298066b8f72b4d9 100644 --- a/requirements-dev.txt +++ b/requirements-dev.txt @@ -10,4 +10,4 @@ sphinx-autoapi sphinx-gallery sphinx-rtd-theme sphinxcontrib-versioning -yapf +yapf>=0.29.0 diff --git a/tests/test_offline.py b/tests/test_offline.py index 281bf83d0f956a19f685b50fea25bba1f3a14c1b..5257b4d99b834f5a33f7624041ce145351e7d674 100644 --- a/tests/test_offline.py +++ b/tests/test_offline.py @@ -49,8 +49,10 @@ class TestOfflineKeys(unittest.TestCase): def test_trigger(self): # there are 4 trigger keys in v1.1.2 of km3net-Dataformat trigger = self.keys.trigger - keys = ['JTRIGGER3DSHOWER', 'JTRIGGERMXSHOWER', - 'JTRIGGER3DMUON', 'JTRIGGERNB'] + keys = [ + 'JTRIGGER3DSHOWER', 'JTRIGGERMXSHOWER', 'JTRIGGER3DMUON', + 'JTRIGGERNB' + ] values = [1, 2, 4, 5] for k, v in zip(keys, values): @@ -59,9 +61,10 @@ class TestOfflineKeys(unittest.TestCase): def test_reconstruction(self): # there are 34 parameters in v1.1.2 of km3net-Dataformat reco = self.keys.reconstruction - keys = ['JPP_RECONSTRUCTION_TYPE', 'JMUONFIT', 'JMUONBEGIN', - 'JMUONPREFIT', 'JMUONSIMPLEX', 'JMUONGANDALF', - 'JMUONENERGY', 'JMUONSTART'] + keys = [ + 'JPP_RECONSTRUCTION_TYPE', 'JMUONFIT', 'JMUONBEGIN', 'JMUONPREFIT', + 'JMUONSIMPLEX', 'JMUONGANDALF', 'JMUONENERGY', 'JMUONSTART' + ] values = [4000, 0, 0, 1, 2, 3, 4, 5] self.assertEqual(34, len([*reco.keys()])) @@ -77,6 +80,7 @@ class TestOfflineKeys(unittest.TestCase): for k, v in fit.items(): self.assertEqual(values[v], fit[k]) + class TestReader(unittest.TestCase): def setUp(self): self.r = Reader(OFFLINE_FILE) @@ -168,28 +172,27 @@ class TestOfflineReader(unittest.TestCase): fitinf = self.nu.tracks.fitinf rec_stages = self.nu.tracks.rec_stages - empty_fitinf = np.array([match for match in - self.nu._find_empty(fitinf)]) - empty_stages = np.array([match for match in - self.nu._find_empty(rec_stages)]) + empty_fitinf = np.array( + [match for match in self.nu._find_empty(fitinf)]) + empty_stages = np.array( + [match for match in self.nu._find_empty(rec_stages)]) - self.assertListEqual(empty_fitinf[:5, 1].tolist(), [23, 14, - 14, 4, None]) - self.assertListEqual(empty_stages[:5, 1].tolist(), [False, False, - False, False, - None]) + self.assertListEqual(empty_fitinf[:5, 1].tolist(), + [23, 14, 14, 4, None]) + self.assertListEqual(empty_stages[:5, 1].tolist(), + [False, False, False, False, None]) def test_find_rec_stages(self): - stages = np.array([match for match in - self.nu._find_rec_stages([1, 2, 3, 4, 5])]) + stages = np.array( + [match for match in self.nu._find_rec_stages([1, 2, 3, 4, 5])]) self.assertListEqual(stages[:5, 1].tolist(), [0, 0, 0, 0, None]) def test_get_reco_fit(self): - JGANDALF_BETA0_RAD = [0.0020367251782607574, - 0.003306725805622178, - 0.0057877124222254885, - 0.015581698352185896] + JGANDALF_BETA0_RAD = [ + 0.0020367251782607574, 0.003306725805622178, 0.0057877124222254885, + 0.015581698352185896 + ] reco_fit = self.nu.get_reco_fit([1, 2, 3, 4, 5])['JGANDALF_BETA0_RAD'] self.assertListEqual(JGANDALF_BETA0_RAD, reco_fit[:4].tolist()) @@ -201,18 +204,18 @@ class TestOfflineReader(unittest.TestCase): max_reco = self.nu._get_max_reco_stages(rec_stages) self.assertEqual(len(max_reco.tolist()), 9) - self.assertListEqual(max_reco[0].tolist(), [[1, 2, 3, 4, 5], - 5, 0]) + self.assertListEqual(max_reco[0].tolist(), [[1, 2, 3, 4, 5], 5, 0]) def test_best_reco(self): - JGANDALF_BETA1_RAD = [0.0014177681261476852, - 0.002094094517471032, - 0.003923368624980349, - 0.009491461076780453] + JGANDALF_BETA1_RAD = [ + 0.0014177681261476852, 0.002094094517471032, 0.003923368624980349, + 0.009491461076780453 + ] best = self.nu.best_reco self.assertEqual(best.size, 9) - self.assertEqual(best['JGANDALF_BETA1_RAD'][:4].tolist(), JGANDALF_BETA1_RAD) + self.assertEqual(best['JGANDALF_BETA1_RAD'][:4].tolist(), + JGANDALF_BETA1_RAD) def test_reading_header(self): # head is the supported format @@ -407,16 +410,14 @@ class TestOfflineTracks(unittest.TestCase): track_selection_2 = tracks[1:3] assert 2 == len(track_selection_2) for _slice in [ - slice(0, 0), - slice(0, 1), - slice(0, 2), - slice(1, 5), - slice(3, -2) + slice(0, 0), + slice(0, 1), + slice(0, 2), + slice(1, 5), + slice(3, -2) ]: - self.assertListEqual( - list(tracks.E[:,0][_slice]), - list(tracks[_slice].E[:,0]) - ) + self.assertListEqual(list(tracks.E[:, 0][_slice]), + list(tracks[_slice].E[:, 0])) class TestOfflineTrack(unittest.TestCase):