reboost 0.6.2__py3-none-any.whl → 0.8.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
reboost/spms/pe.py ADDED
@@ -0,0 +1,178 @@
1
+ from __future__ import annotations
2
+
3
+ import logging
4
+
5
+ import awkward as ak
6
+ import numpy as np
7
+ from lgdo import VectorOfVectors
8
+
9
+ from ..optmap import convolve
10
+ from ..units import units_conv_ak
11
+
12
+ log = logging.getLogger(__name__)
13
+
14
+
15
+ def load_optmap_all(map_file: str) -> convolve.OptmapForConvolve:
16
+ """Load an optical map file for later use with :py:func:`detected_photoelectrons`."""
17
+ return convolve.open_optmap(map_file)
18
+
19
+
20
+ def load_optmap(map_file: str, spm_det_uid: int) -> convolve.OptmapForConvolve:
21
+ """Load an optical map file for later use with :py:func:`detected_photoelectrons`."""
22
+ return convolve.open_optmap_single(map_file, spm_det_uid)
23
+
24
+
25
+ def _nested_unflatten(data: ak.Array, lengths: ak.Array):
26
+ return ak.unflatten(ak.unflatten(ak.flatten(data), ak.flatten(lengths)), ak.num(lengths))
27
+
28
+
29
+ def corrected_photoelectrons(
30
+ simulated_pe: ak.Array,
31
+ simulated_uids: ak.Array,
32
+ data_pe: ak.Array,
33
+ data_uids: ak.Array,
34
+ *,
35
+ seed: int | None = None,
36
+ ) -> tuple[ak.Array, ak.Array]:
37
+ r"""Add a correction to the observed number of photoelectrons (p.e.) using forced trigger data.
38
+
39
+ For every simulated event a corresponding forced trigger event in data is chosen
40
+ and the resulting number of p.e. for each channel (i) is:
41
+
42
+ .. math::
43
+
44
+ n_i = n_{\text{sim},i} + n_{\text{data},i}
45
+
46
+ .. warning::
47
+ The number of supplied forced trigger events in data should ideally be
48
+ more than that in the simulations. If this is not the case and "allow_data_reuse"
49
+ is True then some data events will be used multiple times. This introduces
50
+ a small amount of correlation between the simulated events, but is probably acceptable
51
+ in most circumstances.
52
+
53
+ Parameters
54
+ ----------
55
+ simulated_pe
56
+ The number of number of detected pe per sipm channel.
57
+ simulated_uids
58
+ The unique identifier (uid) for each sipm hit.
59
+ data_pe
60
+ The collection of forced trigger pe.
61
+ data_uids
62
+ The uids for each forced trigger event.
63
+ seed
64
+ Seed for random number generator
65
+
66
+ Returns
67
+ -------
68
+ a tuple of the corrected pe and sipm uids.
69
+ """
70
+ rand = np.random.default_rng(seed=seed)
71
+ rand_ints = rand.integers(0, len(data_pe), size=len(simulated_pe))
72
+
73
+ selected_data_pe = data_pe[rand_ints]
74
+ selected_data_uids = data_uids[rand_ints]
75
+
76
+ # combine sims with data
77
+ pe_tot = ak.concatenate([simulated_pe, selected_data_pe], axis=1)
78
+ uid_tot = ak.concatenate([simulated_uids, selected_data_uids], axis=1)
79
+
80
+ # sort by uid
81
+ order = ak.argsort(uid_tot)
82
+ pe_tot = pe_tot[order]
83
+ uid_tot = uid_tot[order]
84
+
85
+ # add an extra axis
86
+ n = ak.run_lengths(uid_tot)
87
+
88
+ # add another dimension
89
+ pe_tot = _nested_unflatten(pe_tot, n)
90
+ uid_tot = _nested_unflatten(uid_tot, n)
91
+
92
+ # sum pe and take the first uid (should all be the same)
93
+ corrected_pe = ak.sum(pe_tot, axis=-1)
94
+ uid_tot = ak.fill_none(ak.firsts(uid_tot, axis=-1), np.nan)
95
+
96
+ return corrected_pe, uid_tot
97
+
98
+
99
+ def detected_photoelectrons(
100
+ num_scint_ph: ak.Array,
101
+ particle: ak.Array,
102
+ time: ak.Array,
103
+ xloc: ak.Array,
104
+ yloc: ak.Array,
105
+ zloc: ak.Array,
106
+ optmap: convolve.OptmapForConvolve,
107
+ material: str,
108
+ spm_detector_uid: int,
109
+ map_scaling: float = 1,
110
+ map_scaling_sigma: float = 0,
111
+ ) -> VectorOfVectors:
112
+ """Derive the number of detected photoelectrons (p.e.) from scintillator hits using an optical map.
113
+
114
+ Parameters
115
+ ----------
116
+ num_scint_ph
117
+ array of emitted scintillation photons, as generated by
118
+ :func:`emitted_scintillation_photons`.
119
+ particle
120
+ array of particle PDG IDs of scintillation events.
121
+ time
122
+ array of timestamps of scintillation events.
123
+ xloc
124
+ array of x coordinate position of scintillation events.
125
+ yloc
126
+ array of y coordinate position of scintillation events.
127
+ zloc
128
+ array of z coordinate position of scintillation events.
129
+ optmap
130
+ the optical map loaded via py:func:`load_optmap`.
131
+ material
132
+ scintillating material name.
133
+ spm_detector_uid
134
+ SiPM detector uid as used in the optical map.
135
+ map_scaling
136
+ scale the detection probability in the map for this detector by this factor.
137
+ map_scaling_sigma
138
+ if larger than zero, sample the used scaling factor for each (reshaped) event
139
+ from a normal distribution with this standard deviation.
140
+ """
141
+ hits = ak.Array(
142
+ {
143
+ "num_scint_ph": num_scint_ph,
144
+ "particle": particle,
145
+ "time": units_conv_ak(time, "ns"),
146
+ "xloc": units_conv_ak(xloc, "m"),
147
+ "yloc": units_conv_ak(yloc, "m"),
148
+ "zloc": units_conv_ak(zloc, "m"),
149
+ }
150
+ )
151
+
152
+ scint_mat_params = convolve._get_scint_params(material)
153
+ pe = convolve.iterate_stepwise_depositions_pois(
154
+ hits, optmap, scint_mat_params, spm_detector_uid, map_scaling, map_scaling_sigma
155
+ )
156
+
157
+ return VectorOfVectors(pe, attrs={"units": "ns"})
158
+
159
+
160
+ def emitted_scintillation_photons(
161
+ edep: ak.Array, particle: ak.Array, material: str
162
+ ) -> VectorOfVectors:
163
+ """Derive the number of emitted scintillation photons from scintillator hits.
164
+
165
+ Parameters
166
+ ----------
167
+ edep
168
+ array of deposited energy in scintillation events.
169
+ particle
170
+ array of particle PDG IDs of scintillation events.
171
+ material
172
+ scintillating material name.
173
+ """
174
+ hits = ak.Array({"edep": units_conv_ak(edep, "keV"), "particle": particle})
175
+
176
+ scint_mat_params = convolve._get_scint_params(material)
177
+ ph = convolve.iterate_stepwise_depositions_scintillate(hits, scint_mat_params)
178
+ return VectorOfVectors(ph)
reboost/units.py CHANGED
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
  from typing import Any
5
5
 
6
+ import awkward as ak
6
7
  import pint
7
8
  import pyg4ometry as pg4
8
9
  from lgdo import LGDO
@@ -16,7 +17,7 @@ ureg = pint.get_application_registry()
16
17
  ureg.formatter.default_format = "~P"
17
18
 
18
19
 
19
- def pg4_to_pint(obj) -> pint.Quantity:
20
+ def pg4_to_pint(obj: pint.Quantity | pg4.gdml.Defines.VectorBase) -> pint.Quantity:
20
21
  """Convert pyg4ometry object to pint Quantity."""
21
22
  if isinstance(obj, pint.Quantity):
22
23
  return obj
@@ -26,32 +27,54 @@ def pg4_to_pint(obj) -> pint.Quantity:
26
27
  raise ValueError(msg)
27
28
 
28
29
 
29
- def units_convfact(data: Any, target_units: pint.Units) -> float:
30
+ def units_convfact(data: Any | LGDO | ak.Array, target_units: pint.Unit | str) -> float:
30
31
  """Calculate numeric conversion factor to reach `target_units`.
31
32
 
32
33
  Parameters
33
34
  ----------
34
35
  data
35
- starting data structure. If an LGDO, try to determine units by peeking
36
- into its attributes. Otherwise, just return 1.
36
+ starting data structure. If an :class:`LGDO` or :class:`ak.Array`, try to
37
+ determine units by peeking into its attributes. Otherwise, just return 1.
37
38
  target_units
38
39
  units you wish to convert data to.
39
40
  """
40
41
  if isinstance(data, LGDO) and "units" in data.attrs:
41
42
  return ureg(data.attrs["units"]).to(target_units).magnitude
43
+ if isinstance(data, ak.Array) and "units" in ak.parameters(data):
44
+ return ureg(ak.parameters(data)["units"]).to(target_units).magnitude
42
45
  return 1
43
46
 
44
47
 
45
- def unwrap_lgdo(data: Any, library: str = "ak") -> tuple(Any, pint.Unit | None):
48
+ def units_conv_ak(data: Any | LGDO | ak.Array, target_units: pint.Unit | str) -> ak.Array:
49
+ """Calculate numeric conversion factor to reach `target_units`, and apply to data converted to ak.
50
+
51
+ Parameters
52
+ ----------
53
+ data
54
+ starting data structure. If an :class:`LGDO` or :class:`ak.Array`, try to
55
+ determine units by peeking into its attributes. Otherwise, return the data
56
+ unchanged.
57
+ target_units
58
+ units you wish to convert data to.
59
+ """
60
+ fact = units_convfact(data, target_units)
61
+ if isinstance(data, LGDO) and fact != 1:
62
+ return ak.without_parameters(data.view_as("ak") * fact)
63
+ if isinstance(data, ak.Array) and fact != 1:
64
+ return ak.without_parameters(data * fact)
65
+ return data.view_as("ak") if isinstance(data, LGDO) else data
66
+
67
+
68
+ def unwrap_lgdo(data: Any | LGDO | ak.Array, library: str = "ak") -> tuple[Any, pint.Unit | None]:
46
69
  """Return a view of the data held by the LGDO and its physical units.
47
70
 
48
71
  Parameters
49
72
  ----------
50
73
  data
51
- the data container. If not an LGDO, it will be returned as is with
52
- ``None`` units.
74
+ the data container. If not an :class:`LGDO` or :class:`ak.Array`, it will be
75
+ returned as is with ``None`` units.
53
76
  library
54
- forwarded to :func:`lgdo.view_as`.
77
+ forwarded to :meth:`LGDO.view_as`.
55
78
 
56
79
  Returns
57
80
  -------
@@ -64,6 +87,15 @@ def unwrap_lgdo(data: Any, library: str = "ak") -> tuple(Any, pint.Unit | None):
64
87
  if "units" in data.attrs:
65
88
  ret_units = ureg(data.attrs["units"]).u
66
89
 
90
+ if isinstance(data, ak.Array):
91
+ if library != "ak":
92
+ msg = "cannot unwrap an awkward array as a non-awkward type"
93
+ raise ValueError(msg)
94
+
95
+ if "units" in ak.parameters(data):
96
+ ret_units = ureg(ak.parameters(data)["units"]).u
97
+ ret_data = ak.without_parameters(data)
98
+
67
99
  return ret_data, ret_units
68
100
 
69
101
 
reboost/utils.py CHANGED
@@ -9,6 +9,7 @@ from collections.abc import Iterable, Mapping
9
9
  from contextlib import contextmanager
10
10
  from pathlib import Path
11
11
 
12
+ import h5py
12
13
  from dbetto import AttrsDict
13
14
  from lgdo import lh5
14
15
  from lgdo.types import Struct, Table, VectorOfVectors
@@ -164,7 +165,7 @@ def get_file_dict(
164
165
  files = {}
165
166
 
166
167
  for file_type, file_list in zip(
167
- ["stp", "glm", "hit"], [stp_files, glm_files_list, hit_files_list]
168
+ ["stp", "glm", "hit"], [stp_files, glm_files_list, hit_files_list], strict=True
168
169
  ):
169
170
  if isinstance(file_list, str):
170
171
  files[file_type] = [file_list]
@@ -283,7 +284,7 @@ def get_function_string(expr: str, aliases: dict | None = None) -> tuple[str, di
283
284
  if "." not in func_call:
284
285
  continue
285
286
 
286
- subpackage, func = func_call.rsplit(".", 1)
287
+ subpackage, _func = func_call.rsplit(".", 1)
287
288
  package = subpackage.split(".")[0]
288
289
 
289
290
  # import the subpackage
@@ -303,7 +304,10 @@ def get_function_string(expr: str, aliases: dict | None = None) -> tuple[str, di
303
304
  globs = globs | {
304
305
  package: importlib.import_module(package_import),
305
306
  }
306
- except Exception:
307
+ except Exception as e:
308
+ # for imports of our own package, raise the error back to the user
309
+ if package_import == "reboost":
310
+ raise e
307
311
  msg = f"Function {package_import} cannot be imported"
308
312
  log.debug(msg)
309
313
  continue
@@ -439,3 +443,61 @@ def write_lh5(
439
443
  )
440
444
  if time_dict is not None:
441
445
  time_dict.update_field("write", start_time)
446
+
447
+
448
+ def get_remage_detector_uids(h5file: str | Path) -> dict:
449
+ """Get mapping of detector names to UIDs from a remage output file.
450
+
451
+ The remage LH5 output files contain a link structure that lets the user
452
+ access detector tables by UID. For example:
453
+
454
+ .. code-block:: text
455
+
456
+ ├── stp · struct{det1,det2,optdet1,optdet2,scint1,scint2}
457
+ └── __by_uid__ · struct{det001,det002,det011,det012,det101,det102}
458
+ ├── det001 -> /stp/scint1
459
+ ├── det002 -> /stp/scint2
460
+ ├── det011 -> /stp/det1
461
+ ├── det012 -> /stp/det2
462
+ ├── det101 -> /stp/optdet1
463
+ └── det102 -> /stp/optdet2
464
+
465
+ This function analyzes this structure and returns:
466
+
467
+ .. code-block:: text
468
+
469
+ {1: 'scint1',
470
+ 2: 'scint2',
471
+ 11: 'det1',
472
+ 12: 'det2',
473
+ 101: 'optdet1',
474
+ 102: 'optdet2'g
475
+
476
+ Parameters
477
+ ----------
478
+ h5file
479
+ path to remage output file.
480
+ """
481
+ if isinstance(h5file, Path):
482
+ h5file = h5file.as_posix()
483
+
484
+ out = {}
485
+ with h5py.File(h5file, "r") as f:
486
+ g = f["/stp/__by_uid__"]
487
+ # loop over links
488
+ for key in g:
489
+ # is this a link?
490
+ link = g.get(key, getlink=True)
491
+ if isinstance(link, h5py.SoftLink):
492
+ m = re.fullmatch(r"det(\d+)", key)
493
+ if m is None:
494
+ msg = rf"'{key}' is not formatted as expected, i.e. 'det(\d+)', skipping"
495
+ log.warning(msg)
496
+ continue
497
+
498
+ # get the name of the link target without trailing groups (to
499
+ # i.e. remove /stp)
500
+ name = link.path.split("/")[-1]
501
+
502
+ out[int(m.group(1))] = name
503
+ return out
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reboost
3
- Version: 0.6.2
3
+ Version: 0.8.0
4
4
  Summary: New LEGEND Monte-Carlo simulation post-processing
5
5
  Author-email: Manuel Huber <info@manuelhu.de>, Toby Dixon <toby.dixon.23@ucl.ac.uk>, Luigi Pertoldi <gipert@pm.me>
6
6
  Maintainer: The LEGEND Collaboration
@@ -693,16 +693,16 @@ Classifier: Programming Language :: Python
693
693
  Classifier: Programming Language :: Python :: 3
694
694
  Classifier: Programming Language :: Python :: 3 :: Only
695
695
  Classifier: Topic :: Scientific/Engineering
696
- Requires-Python: >=3.9
696
+ Requires-Python: >=3.10
697
697
  Description-Content-Type: text/markdown
698
698
  License-File: LICENSE
699
699
  Requires-Dist: hdf5plugin
700
700
  Requires-Dist: colorlog
701
701
  Requires-Dist: numpy
702
702
  Requires-Dist: scipy
703
- Requires-Dist: numba
704
- Requires-Dist: legend-pydataobj>=1.14
705
- Requires-Dist: legend-pygeom-optics>=0.9.2
703
+ Requires-Dist: numba>=0.60
704
+ Requires-Dist: legend-pydataobj>=1.15.1
705
+ Requires-Dist: legend-pygeom-optics>=0.12.0
706
706
  Requires-Dist: legend-pygeom-tools>=0.0.11
707
707
  Requires-Dist: hist
708
708
  Requires-Dist: dbetto
@@ -728,6 +728,8 @@ Dynamic: license-file
728
728
 
729
729
  # reboost
730
730
 
731
+ [![PyPI](https://img.shields.io/pypi/v/reboost?logo=pypi)](https://pypi.org/project/reboost/)
732
+ [![conda-forge](https://img.shields.io/conda/vn/conda-forge/reboost.svg)](https://anaconda.org/conda-forge/reboost)
731
733
  ![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/legend-exp/reboost?logo=git)
732
734
  [![GitHub Workflow Status](https://img.shields.io/github/checks-status/legend-exp/reboost/main?label=main%20branch&logo=github)](https://github.com/legend-exp/reboost/actions)
733
735
  [![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit&logoColor=white)](https://github.com/pre-commit/pre-commit)
@@ -0,0 +1,42 @@
1
+ reboost/__init__.py,sha256=VZz9uo7i2jgAx8Zi15SptLZnE_qcnGuNWwqkD3rYHFA,278
2
+ reboost/_version.py,sha256=Rttl-BDadtcW1QzGnNffCWA_Wc9mUKDMOBPZp--Mnsc,704
3
+ reboost/build_evt.py,sha256=VXIfK_pfe_Cgym6gI8dESwONZi-v_4fll0Pn09vePQY,3767
4
+ reboost/build_glm.py,sha256=IerSLQfe51ZO7CQP2kmfPnOIVaDtcfw3byOM02Vaz6o,9472
5
+ reboost/build_hit.py,sha256=pjEaiPW63Q3MfpjI29uJXx9gtwfiOIgOcADRDrDpRrA,17409
6
+ reboost/cli.py,sha256=68EzKiWTHJ2u1RILUv7IX9HaVq6nTTM80_W_MUnWRe4,6382
7
+ reboost/core.py,sha256=TPxvZgUaHZdxfQSDdX2zIerQXt3Gq-zQaA6AeXZKNvA,15232
8
+ reboost/iterator.py,sha256=qlEqRv5qOh8eIs-dyVOLYTvH-ZpQDx9fLckpcAdtWjs,6975
9
+ reboost/log_utils.py,sha256=VqS_9OC5NeNU3jcowVOBB0NJ6ssYvNWnirEY-JVduEA,766
10
+ reboost/profile.py,sha256=EOTmjmS8Rm_nYgBWNh6Rntl2XDsxdyed7yEdWtsZEeg,2598
11
+ reboost/units.py,sha256=LUwl6swLQoG09Rt9wcDdu6DTrwDsy-C751BNGzX4sz8,3651
12
+ reboost/utils.py,sha256=-4315U6m1M-rwoaI_inI1wIo_l20kvoGmC84D_QOhkE,14563
13
+ reboost/daq/__init__.py,sha256=rNPhxx1Yawt3tENYhmOYSum9_TdV57ZU5kjxlWFAGuo,107
14
+ reboost/daq/core.py,sha256=Rs6Q-17fzEod2iX_2WqEmnqKnNRFoWTYURl3wYhFihU,9915
15
+ reboost/daq/utils.py,sha256=KcH6zvlInmD2YiF6V--DSYBTYudJw3G-hp2JGOcES2o,1042
16
+ reboost/hpge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
17
+ reboost/hpge/psd.py,sha256=P9lxji4njwFwPBR0vfh6gkvt7GQx2BRajvCsUUmtEqU,24407
18
+ reboost/hpge/surface.py,sha256=ROewOsSoq8zRAaiamWdMDl-UR7ZfsimgH2Lv9k0flKg,8494
19
+ reboost/hpge/utils.py,sha256=AcMS86v8s0SbeC4YA3CfH73GBZcC7Sb_RR3pRPjWAwU,2857
20
+ reboost/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ reboost/math/functions.py,sha256=OymiYTcA0NXxxm-MBDw5kqyNwHoLCmuv4J48AwnSrbU,5633
22
+ reboost/math/stats.py,sha256=Rq4Wdzv-3aoSK7EsPZCuOEHfnOz3w0moIzCEHbC07xw,3173
23
+ reboost/optmap/__init__.py,sha256=imvuyld-GLw8qdwqW-lXCg2feptcTyQo3wIzPvDHwmY,93
24
+ reboost/optmap/cli.py,sha256=KJFyO4Sd2oYlRC65Kvrdq0BN_Qygp6o7LgO36D5O6_s,8887
25
+ reboost/optmap/convolve.py,sha256=UVc-KjiYvi8LoAlykL__5qDd5T8teT89aDjiE7WYjE4,12464
26
+ reboost/optmap/create.py,sha256=R9W8Wyl8cgXIYESenVpCRuN_MoHhLfaEv4a44cf3AxU,14479
27
+ reboost/optmap/evt.py,sha256=p5ngsCuvOxIZDDQNL9efcLn8Q4CfGL7G726BRrCpE6Y,5637
28
+ reboost/optmap/mapview.py,sha256=_zGiONqCWc4kCp1yHvNFRkh7svvud4ZLqaSHkNieo_M,6878
29
+ reboost/optmap/numba_pdg.py,sha256=y8cXR5PWE2Liprp4ou7vl9do76dl84vXU52ZJD9_I7A,731
30
+ reboost/optmap/optmap.py,sha256=3clc1RA8jA4YJte83w085MY8zLpG-G7DBkpZ2UeKPpM,12825
31
+ reboost/shape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
+ reboost/shape/cluster.py,sha256=nwR1Dnf00SDICGPqpXeM1Q7_DwTtO9uP3wmuML45c3g,8195
33
+ reboost/shape/group.py,sha256=gOCYgir2gZqmW1JXtbNRPlQqP0gmUcbe7RVb9CbY1pU,5540
34
+ reboost/shape/reduction.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
35
+ reboost/spms/__init__.py,sha256=ffi0rH-ZFGmpURbFt-HY1ZAHCdady0mLXNsblRNh-JY,207
36
+ reboost/spms/pe.py,sha256=Q_GzN5HEp2BmgB4fni5mfc5ZOXh4mlJepDwZd1EzFdc,5696
37
+ reboost-0.8.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
38
+ reboost-0.8.0.dist-info/METADATA,sha256=t8uYwYlKBZPoO5Rbrv4RVr5AQj4D_rglFCQ-HFrYe1I,44442
39
+ reboost-0.8.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
40
+ reboost-0.8.0.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
41
+ reboost-0.8.0.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
42
+ reboost-0.8.0.dist-info/RECORD,,
@@ -1,37 +0,0 @@
1
- reboost/__init__.py,sha256=VZz9uo7i2jgAx8Zi15SptLZnE_qcnGuNWwqkD3rYHFA,278
2
- reboost/_version.py,sha256=DhO-RAVJdQTjYPaMf0M6q_WAXdD6jcx2tWl_B9FtuhM,511
3
- reboost/build_evt.py,sha256=VXIfK_pfe_Cgym6gI8dESwONZi-v_4fll0Pn09vePQY,3767
4
- reboost/build_glm.py,sha256=IerSLQfe51ZO7CQP2kmfPnOIVaDtcfw3byOM02Vaz6o,9472
5
- reboost/build_hit.py,sha256=BwcAzr7hkhLqQpyULYPqM70VEvENaw-j90fvBYKh-68,15649
6
- reboost/cli.py,sha256=HZgqUZK0tSmnlGqoXjrbmLitW_i001TzibxvDrRxLLg,6324
7
- reboost/core.py,sha256=WGbWe2rcfMDEaehVyw7peqAHoTFWoCu5J6CdWHC5aWA,14974
8
- reboost/iterator.py,sha256=fATFDxu2PUc0e48OdJJujZo2kwykfRLH1oBtcB-s5pM,6905
9
- reboost/log_utils.py,sha256=VqS_9OC5NeNU3jcowVOBB0NJ6ssYvNWnirEY-JVduEA,766
10
- reboost/profile.py,sha256=EOTmjmS8Rm_nYgBWNh6Rntl2XDsxdyed7yEdWtsZEeg,2598
11
- reboost/units.py,sha256=3EH8XlpbsObdu5vLgxhm1600L6UNYD5jng4SjJT_1QE,2202
12
- reboost/utils.py,sha256=dzDiQWwv_snoWoRBDnDNZ27hG0CpCRo8V4jSEG2b82c,12592
13
- reboost/hpge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- reboost/hpge/psd.py,sha256=jAUAoQ_PMz76wyA1NXYHNKtOwoCnRT3My8_LCFrKi-U,13860
15
- reboost/hpge/surface.py,sha256=lbWcFnFFWKxtFKs755GyM9US_IfyxaoM6MpOIZgIMM0,7478
16
- reboost/hpge/utils.py,sha256=0Rx4HubCOm8JMECjWcAJXfAch9OkSlRpUkdsSlzwZ2E,2830
17
- reboost/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- reboost/math/functions.py,sha256=OymiYTcA0NXxxm-MBDw5kqyNwHoLCmuv4J48AwnSrbU,5633
19
- reboost/math/stats.py,sha256=cG-6mQx33Dzpv3ABkHLEwC104WJ_PMgbWtmjg37SBj4,3164
20
- reboost/optmap/__init__.py,sha256=imvuyld-GLw8qdwqW-lXCg2feptcTyQo3wIzPvDHwmY,93
21
- reboost/optmap/cli.py,sha256=N8J2Hd8m_csYU9CtpAp7Rc3LHy6eNzZ26gWZgHCiUso,10250
22
- reboost/optmap/convolve.py,sha256=x7boLDcBJIsontoB0yemvzHSE2hlRpUomlDXc3jqdr4,14668
23
- reboost/optmap/create.py,sha256=_6GZbdRvmjDFs6DDbWC-THZxaNPUiLAOIDNaigMKJSQ,18139
24
- reboost/optmap/evt.py,sha256=UrjjNNeS7Uie4Ah9y_f5PyroFutLGo5aOFcwReOEy7o,5556
25
- reboost/optmap/mapview.py,sha256=73kpe0_SKDj9bIhEx1ybX1sBP8TyvufiLfps84A_ijA,6798
26
- reboost/optmap/numba_pdg.py,sha256=y8cXR5PWE2Liprp4ou7vl9do76dl84vXU52ZJD9_I7A,731
27
- reboost/optmap/optmap.py,sha256=j4rfbQ84PYSpE-BvP4Rdt96ZjPdwy8P4e4eZz1mATys,12817
28
- reboost/shape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
29
- reboost/shape/cluster.py,sha256=RIvBlhHzp88aaUZGofp5SD9bimnoiqIOddhQ84jiwoM,8135
30
- reboost/shape/group.py,sha256=gOCYgir2gZqmW1JXtbNRPlQqP0gmUcbe7RVb9CbY1pU,5540
31
- reboost/shape/reduction.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
- reboost-0.6.2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
33
- reboost-0.6.2.dist-info/METADATA,sha256=o0DAQXxkMCG68Uf-WHTHeVsIEMKMsj044lWWMJLAx_k,44222
34
- reboost-0.6.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
35
- reboost-0.6.2.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
36
- reboost-0.6.2.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
37
- reboost-0.6.2.dist-info/RECORD,,