reboost 0.2.7__py3-none-any.whl → 0.3.1__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/optmap/cli.py CHANGED
@@ -166,7 +166,12 @@ def optical_cli() -> None:
166
166
  action="store",
167
167
  required=True,
168
168
  metavar="LGDO_PATH",
169
- help="path to LGDO inside non-optical LH5 hit file (e.g. /hit/detXX)",
169
+ help="path to LGDO inside non-optical LH5 hit file (e.g. /stp/detXX)",
170
+ )
171
+ convolve_parser.add_argument(
172
+ "--dist-mode",
173
+ action="store",
174
+ default="multinomial+no-fano",
170
175
  )
171
176
  convolve_parser.add_argument("--output", help="output hit LH5 file", metavar="OUTPUT_HIT")
172
177
 
@@ -183,7 +188,7 @@ def optical_cli() -> None:
183
188
 
184
189
  # STEP 1: build evt file from hit tier
185
190
  if args.command == "evt":
186
- from reboost.optmap.evt import build_optmap_evt
191
+ from .evt import build_optmap_evt
187
192
 
188
193
  _check_input_file(parser, args.detectors)
189
194
  _check_input_file(parser, args.input)
@@ -197,7 +202,7 @@ def optical_cli() -> None:
197
202
 
198
203
  # STEP 2a: build map file from evt tier
199
204
  if args.command == "createmap":
200
- from reboost.optmap.create import create_optical_maps
205
+ from .create import create_optical_maps
201
206
 
202
207
  _check_input_file(parser, args.input)
203
208
  _check_output_file(parser, args.output)
@@ -225,7 +230,7 @@ def optical_cli() -> None:
225
230
 
226
231
  # STEP 2b: view maps
227
232
  if args.command == "viewmap":
228
- from reboost.optmap.mapview import view_optmap
233
+ from .mapview import view_optmap
229
234
 
230
235
  _check_input_file(parser, args.input)
231
236
  if args.divide is not None:
@@ -242,7 +247,7 @@ def optical_cli() -> None:
242
247
 
243
248
  # STEP 2c: merge maps
244
249
  if args.command == "mergemap":
245
- from reboost.optmap.create import merge_optical_maps
250
+ from .create import merge_optical_maps
246
251
 
247
252
  # load settings for binning from config file.
248
253
  _check_input_file(parser, args.input, "settings")
@@ -257,22 +262,30 @@ def optical_cli() -> None:
257
262
 
258
263
  # STEP 2d: check maps
259
264
  if args.command == "checkmap":
260
- from reboost.optmap.create import check_optical_map
265
+ from .create import check_optical_map
261
266
 
262
267
  _check_input_file(parser, args.input)
263
268
  check_optical_map(args.input)
264
269
 
265
270
  # STEP 3: convolve with hits from non-optical simulations
266
271
  if args.command == "convolve":
267
- from reboost.optmap.convolve import convolve
272
+ from .convolve import convolve
268
273
 
269
274
  _check_input_file(parser, [args.map, args.edep])
270
- _check_output_file(parser, args.output)
271
- convolve(args.map, args.edep, args.edep_lgdo, args.material, args.output, args.bufsize)
275
+ _check_output_file(parser, args.output, optional=True)
276
+ convolve(
277
+ args.map,
278
+ args.edep,
279
+ args.edep_lgdo,
280
+ args.material,
281
+ args.output,
282
+ args.bufsize,
283
+ dist_mode=args.dist_mode,
284
+ )
272
285
 
273
286
  # STEP X: rebin maps
274
287
  if args.command == "rebin":
275
- from reboost.optmap.create import rebin_optical_maps
288
+ from .create import rebin_optical_maps
276
289
 
277
290
  _check_input_file(parser, args.input)
278
291
  _check_output_file(parser, args.output)
@@ -3,6 +3,7 @@ from __future__ import annotations
3
3
  import logging
4
4
 
5
5
  import legendoptics.scintillate as sc
6
+ import numba
6
7
  import numpy as np
7
8
  import pint
8
9
  from legendoptics import lar
@@ -23,7 +24,8 @@ OPTMAP_SUM_CH = -2
23
24
 
24
25
  def open_optmap(optmap_fn: str):
25
26
  maps = lh5.ls(optmap_fn)
26
- det_ntuples = [m for m in maps if m not in ("all", "_hitcounts", "_hitcounts_exp")]
27
+ # TODO: rewrite logic to only accept _<number> instead of a blacklist
28
+ det_ntuples = [m for m in maps if m not in ("all", "_hitcounts", "_hitcounts_exp", "all_orig")]
27
29
  detids = np.array([int(m.lstrip("_")) for m in det_ntuples])
28
30
  detidx = np.arange(0, detids.shape[0])
29
31
 
@@ -69,15 +71,16 @@ def iterate_stepwise_depositions(
69
71
  optmap_for_convolve,
70
72
  scint_mat_params: sc.ComputedScintParams,
71
73
  rng: np.random.Generator = None,
74
+ dist: str = "multinomial",
75
+ mode: str = "no-fano",
72
76
  ):
73
77
  # those np functions are not supported by numba, but needed for efficient array access below.
74
78
  x0 = structured_to_unstructured(edep_df[["xloc_pre", "yloc_pre", "zloc_pre"]], np.float64)
75
79
  x1 = structured_to_unstructured(edep_df[["xloc_post", "yloc_post", "zloc_post"]], np.float64)
76
80
 
77
81
  rng = np.random.default_rng() if rng is None else rng
78
-
79
82
  output_map, res = _iterate_stepwise_depositions(
80
- edep_df, x0, x1, rng, *optmap_for_convolve, scint_mat_params
83
+ edep_df, x0, x1, rng, *optmap_for_convolve, scint_mat_params, dist, mode
81
84
  )
82
85
  if res["any_no_stats"] > 0 or res["det_no_stats"] > 0:
83
86
  log.warning(
@@ -119,6 +122,9 @@ def _pdgid_to_particle(pdgid: int) -> sc.ParticleIndex:
119
122
  return sc.PARTICLE_INDEX_ELECTRON
120
123
 
121
124
 
125
+ __counts_per_bin_key_type = numba.types.UniTuple(numba.types.int64, 3)
126
+
127
+
122
128
  # - run with NUMBA_FULL_TRACEBACKS=1 NUMBA_BOUNDSCHECK=1 for testing/checking
123
129
  # - cache=True does not work with outer prange, i.e. loading the cached file fails (numba bug?)
124
130
  # - the output dictionary is not threadsafe, so parallel=True is not working with it.
@@ -134,6 +140,8 @@ def _iterate_stepwise_depositions(
134
140
  optmap_weights,
135
141
  optmap_multi_det_exp,
136
142
  scint_mat_params: sc.ComputedScintParams,
143
+ dist: str,
144
+ mode: str,
137
145
  ):
138
146
  pdgid_map = {}
139
147
  output_map = {}
@@ -160,6 +168,7 @@ def _iterate_stepwise_depositions(
160
168
  charge,
161
169
  t.edep,
162
170
  rng,
171
+ emission_term_model=("poisson" if mode == "no-fano" else "normal_fano"),
163
172
  )
164
173
  if scint_times.shape[0] == 0: # short-circuit if we have no photons at all.
165
174
  continue
@@ -175,6 +184,11 @@ def _iterate_stepwise_depositions(
175
184
  # there are _much_ less unique bins, unfortunately np.unique(..., axis=n) does not work
176
185
  # with numba; also np.sort(..., axis=n) also does not work.
177
186
 
187
+ counts_per_bin = numba.typed.Dict.empty(
188
+ key_type=__counts_per_bin_key_type,
189
+ value_type=np.int64,
190
+ )
191
+
178
192
  # get probabilities from map.
179
193
  hitcount = np.zeros((detidx.shape[0], bins.shape[0]), dtype=np.int64)
180
194
  for j in prange(bins.shape[0]):
@@ -191,35 +205,65 @@ def _iterate_stepwise_depositions(
191
205
  continue
192
206
  if px_any == 0.0:
193
207
  continue
194
- if rng.uniform() >= px_any:
195
- continue
196
- ph_det += 1
197
- # we detect this energy deposition; we should at least get one photon out here!
198
-
199
- detsel_size = 1
200
- if np.isfinite(optmap_multi_det_exp):
201
- detsel_size = rng.geometric(1 - np.exp(-optmap_multi_det_exp))
202
-
203
- px_sum = optmap_weights[OPTMAP_SUM_CH, cur_bins[0], cur_bins[1], cur_bins[2]]
204
- assert px_sum >= 0.0 # should not be negative.
205
- detp = np.empty(detidx.shape, dtype=np.float64)
206
- had_det_no_stats = 0
207
- for d in detidx:
208
- # normalize so that sum(detp) = 1
209
- detp[d] = optmap_weights[d, cur_bins[0], cur_bins[1], cur_bins[2]] / px_sum
210
- if detp[d] < 0.0:
211
- had_det_no_stats = 1
212
- detp[d] = 0.0
213
- det_no_stats += had_det_no_stats
214
-
215
- # should be equivalent to rng.choice(detidx, size=(detsel_size, p=detp)
216
- detsel = detidx[
217
- np.searchsorted(np.cumsum(detp), rng.random(size=(detsel_size,)), side="right")
218
- ]
219
- for d in detsel:
220
- hitcount[d, j] += 1
221
- ph_det2 += detsel.shape[0]
222
208
 
209
+ if dist == "multinomial":
210
+ if rng.uniform() >= px_any:
211
+ continue
212
+ ph_det += 1
213
+ # we detect this energy deposition; we should at least get one photon out here!
214
+
215
+ detsel_size = 1
216
+ if np.isfinite(optmap_multi_det_exp):
217
+ detsel_size = rng.geometric(1 - np.exp(-optmap_multi_det_exp))
218
+
219
+ px_sum = optmap_weights[OPTMAP_SUM_CH, cur_bins[0], cur_bins[1], cur_bins[2]]
220
+ assert px_sum >= 0.0 # should not be negative.
221
+ detp = np.empty(detidx.shape, dtype=np.float64)
222
+ had_det_no_stats = 0
223
+ for d in detidx:
224
+ # normalize so that sum(detp) = 1
225
+ detp[d] = optmap_weights[d, cur_bins[0], cur_bins[1], cur_bins[2]] / px_sum
226
+ if detp[d] < 0.0:
227
+ had_det_no_stats = 1
228
+ detp[d] = 0.0
229
+ det_no_stats += had_det_no_stats
230
+
231
+ # should be equivalent to rng.choice(detidx, size=(detsel_size, p=detp)
232
+ detsel = detidx[
233
+ np.searchsorted(np.cumsum(detp), rng.random(size=(detsel_size,)), side="right")
234
+ ]
235
+ for d in detsel:
236
+ hitcount[d, j] += 1
237
+ ph_det2 += detsel.shape[0]
238
+
239
+ elif dist == "poisson":
240
+ # store the photon count in each bin, to sample them all at once below.
241
+ if cur_bins not in counts_per_bin:
242
+ counts_per_bin[cur_bins] = 1
243
+ else:
244
+ counts_per_bin[cur_bins] += 1
245
+
246
+ else:
247
+ msg = "unknown distribution"
248
+ raise RuntimeError(msg)
249
+
250
+ if dist == "poisson":
251
+ for j, (cur_bins, ph_counts_to_poisson) in enumerate(counts_per_bin.items()):
252
+ had_det_no_stats = 0
253
+ had_any = 0
254
+ for d in detidx:
255
+ detp = optmap_weights[d, cur_bins[0], cur_bins[1], cur_bins[2]]
256
+ if detp < 0.0:
257
+ had_det_no_stats = 1
258
+ continue
259
+ pois_cnt = rng.poisson(lam=ph_counts_to_poisson * detp)
260
+ hitcount[d, j] += pois_cnt
261
+ ph_det2 += pois_cnt
262
+ had_any = 1
263
+ ph_det += had_any
264
+ det_no_stats += had_det_no_stats
265
+
266
+ assert scint_times.shape[0] >= hitcount.shape[1] # TODO: use the right assertion here.
223
267
  out_hits_len = np.sum(hitcount)
224
268
  if out_hits_len > 0:
225
269
  out_times = np.empty(out_hits_len, dtype=np.float64)
@@ -285,6 +329,7 @@ def convolve(
285
329
  material: str,
286
330
  output_file: str | None = None,
287
331
  buffer_len: int = int(1e6),
332
+ dist_mode: str = "multinomial+no-fano",
288
333
  ):
289
334
  if material not in ["lar", "pen"]:
290
335
  msg = f"unknown material {material} for scintillation"
@@ -304,6 +349,11 @@ def convolve(
304
349
  log.info("opening map %s", map_file)
305
350
  optmap_for_convolve = open_optmap(map_file)
306
351
 
352
+ # special handling of distributions and flags.
353
+ dist, mode = dist_mode.split("+")
354
+ assert dist in ("multinomial", "poisson")
355
+ assert mode in ("", "no-fano")
356
+
307
357
  log.info("opening energy deposition hit output %s", edep_file)
308
358
  it = LH5Iterator(edep_file, edep_path, buffer_len=buffer_len)
309
359
  for it_count, (edep_lgdo, edep_events, edep_n_rows) in enumerate(it):
@@ -311,7 +361,9 @@ def convolve(
311
361
  edep_df = edep_lgdo.view_as("pd").iloc[0:edep_n_rows].to_records()
312
362
 
313
363
  log.info("start event processing (%d)", it_count)
314
- output_map = iterate_stepwise_depositions(edep_df, optmap_for_convolve, scint_mat_params)
364
+ output_map = iterate_stepwise_depositions(
365
+ edep_df, optmap_for_convolve, scint_mat_params, dist=dist, mode=mode
366
+ )
315
367
 
316
368
  log.info("store output photon hits (%d)", it_count)
317
369
  ph_count_o, tbl = get_output_table(output_map)
@@ -319,4 +371,4 @@ def convolve(
319
371
  "output photons: %d energy depositions -> %d photons", len(output_map), ph_count_o
320
372
  )
321
373
  if output_file is not None:
322
- lh5.write(tbl, "optical", lh5_file=output_file, group="hit", wo_mode="append")
374
+ lh5.write(tbl, "optical", lh5_file=output_file, group="stp", wo_mode="append")
reboost/optmap/evt.py CHANGED
@@ -26,7 +26,7 @@ def build_optmap_evt(
26
26
  msg = f"temporary output file {lh5_out_file_tmp} already exists"
27
27
  raise RuntimeError(msg)
28
28
 
29
- vert_it = LH5Iterator(lh5_in_file, "stp/vertices", buffer_len=buffer_len)
29
+ vert_it = LH5Iterator(lh5_in_file, "vtx", buffer_len=buffer_len)
30
30
  opti_it = LH5Iterator(lh5_in_file, "stp/optical", buffer_len=buffer_len)
31
31
 
32
32
  detectors = [str(d) for d in detectors]
reboost/shape/group.py CHANGED
@@ -122,7 +122,7 @@ def group_by_time(
122
122
 
123
123
  # get difference
124
124
  time_diffs = np.diff(obj[time_name])
125
- index_diffs = np.array(np.diff(obj[evtid_name]), dtype=np.int32)
125
+ index_diffs = np.diff(obj[evtid_name])
126
126
 
127
127
  # index of the last element in each run
128
128
  time_change = (time_diffs > window * 1000) & (index_diffs == 0)
reboost/utils.py CHANGED
@@ -4,12 +4,16 @@ import importlib
4
4
  import itertools
5
5
  import logging
6
6
  import re
7
+ import time
7
8
  from collections.abc import Iterable, Mapping
8
9
  from contextlib import contextmanager
9
10
  from pathlib import Path
10
11
 
11
12
  from dbetto import AttrsDict
12
- from lgdo.types import Table, VectorOfVectors
13
+ from lgdo import lh5
14
+ from lgdo.types import Struct, Table, VectorOfVectors
15
+
16
+ from .profile import ProfileDict
13
17
 
14
18
  log = logging.getLogger(__name__)
15
19
 
@@ -296,8 +300,57 @@ def _check_input_file(parser, file: str | Iterable[str], descr: str = "input") -
296
300
  parser.error(f"{descr} file(s) {''.join(not_existing)} missing")
297
301
 
298
302
 
299
- def _check_output_file(parser, file: str | Iterable[str]) -> None:
303
+ def _check_output_file(parser, file: str | Iterable[str] | None, optional: bool = False) -> None:
304
+ if file is None and optional:
305
+ return
306
+
300
307
  file = (file,) if isinstance(file, str) else file
301
308
  for f in file:
302
309
  if Path(f).exists():
303
310
  parser.error(f"output file {f} already exists")
311
+
312
+
313
+ def write_lh5(
314
+ hit_table: Table,
315
+ file: str,
316
+ time_dict: ProfileDict,
317
+ out_field: str,
318
+ out_detector: str,
319
+ wo_mode: str,
320
+ ):
321
+ """Write the lh5 file. This function handles writing first the data as a struct and then appending to this.
322
+
323
+ Parameters
324
+ ----------
325
+ hit_table
326
+ the table to write
327
+ file
328
+ the file to write to
329
+ time_dict
330
+ the dictionary of timing information to update.
331
+ out_field
332
+ output field
333
+ out_detector
334
+ output detector name
335
+ wo_mode
336
+ the mode to pass to `lh5.write`
337
+ """
338
+ if time_dict is not None:
339
+ start_time = time.time()
340
+
341
+ if wo_mode != "a":
342
+ lh5.write(
343
+ Struct({out_detector: hit_table}),
344
+ out_field,
345
+ file,
346
+ wo_mode=wo_mode,
347
+ )
348
+ else:
349
+ lh5.write(
350
+ hit_table,
351
+ f"{out_field}/{out_detector}",
352
+ file,
353
+ wo_mode=wo_mode,
354
+ )
355
+ if time_dict is not None:
356
+ time_dict.update_field("write", start_time)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reboost
3
- Version: 0.2.7
3
+ Version: 0.3.1
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
@@ -0,0 +1,38 @@
1
+ reboost/__init__.py,sha256=2Lc9Idexf1S3IQvHQS1LPD-SCud7Mnmpr2dJ6U-ThvU,303
2
+ reboost/_version.py,sha256=lOWWIGJeBi0KkFopWU_n3GH71C1PsaZ-ZYDfxFkne6c,511
3
+ reboost/build_evt.py,sha256=zj3wG_kaV3EoRMQ33AkCNa_2Fv8cLtRuhyRyRmSrOYQ,4797
4
+ reboost/build_glm.py,sha256=zRTXTmlvHePcFDJkJwBbIo5nMjW0ZP4-2CJvqN2QBe8,9525
5
+ reboost/build_hit.py,sha256=tf7KBp8DYuAmT-k6oBF54rjlIu_y9tVuyuGldA2I0Jk,15247
6
+ reboost/build_tcm.py,sha256=Ntf2nrS072SGlZzdTHETtaQdhl0tL3ikvdzrOQvlb-E,2944
7
+ reboost/cli.py,sha256=YZvCaxkU0VA_xMAeyw1PN_x17RUkl8uzv19nkNkz3kE,6509
8
+ reboost/core.py,sha256=B577b5KzAYpGI7c4eCxIRKgt9tq6hwVr2-DtYTml1e8,12826
9
+ reboost/iterator.py,sha256=YFsNjC2Onsyhvkogbs79eD8iqstCdCAfFEaEOMr_ujg,6810
10
+ reboost/log_utils.py,sha256=VqS_9OC5NeNU3jcowVOBB0NJ6ssYvNWnirEY-JVduEA,766
11
+ reboost/profile.py,sha256=EOTmjmS8Rm_nYgBWNh6Rntl2XDsxdyed7yEdWtsZEeg,2598
12
+ reboost/units.py,sha256=3EH8XlpbsObdu5vLgxhm1600L6UNYD5jng4SjJT_1QE,2202
13
+ reboost/utils.py,sha256=CL83IBkddFXdzD83JXGQeZ_N6WxJ8qwj7GgBt1vzmbg,9652
14
+ reboost/hpge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
+ reboost/hpge/psd.py,sha256=jAUAoQ_PMz76wyA1NXYHNKtOwoCnRT3My8_LCFrKi-U,13860
16
+ reboost/hpge/surface.py,sha256=lbWcFnFFWKxtFKs755GyM9US_IfyxaoM6MpOIZgIMM0,7478
17
+ reboost/hpge/utils.py,sha256=0Rx4HubCOm8JMECjWcAJXfAch9OkSlRpUkdsSlzwZ2E,2830
18
+ reboost/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
+ reboost/math/functions.py,sha256=OymiYTcA0NXxxm-MBDw5kqyNwHoLCmuv4J48AwnSrbU,5633
20
+ reboost/math/stats.py,sha256=iiOEi87x93kqPWeSmlRiA5Oe-R8XR-plm6Z532PhC9M,1401
21
+ reboost/optmap/__init__.py,sha256=imvuyld-GLw8qdwqW-lXCg2feptcTyQo3wIzPvDHwmY,93
22
+ reboost/optmap/cli.py,sha256=SzbPRgsbR5Llm3aSJubH02Ym8FQyTH7kvuLjK7faLiY,9572
23
+ reboost/optmap/convolve.py,sha256=jCH_d04yioB8hsJEPunm0zynA0ne4lx0ldSC1GJG_eY,14129
24
+ reboost/optmap/create.py,sha256=Nm5-xEe8M9q2GFQnUv8oN8qpAz9nZArIrQcPboqRmCQ,17153
25
+ reboost/optmap/evt.py,sha256=9rfAdN9MqL6UuUxUcMDGVwpcuqRVc2RwmEmd87jgYww,4698
26
+ reboost/optmap/mapview.py,sha256=73kpe0_SKDj9bIhEx1ybX1sBP8TyvufiLfps84A_ijA,6798
27
+ reboost/optmap/numba_pdg.py,sha256=y8cXR5PWE2Liprp4ou7vl9do76dl84vXU52ZJD9_I7A,731
28
+ reboost/optmap/optmap.py,sha256=j4rfbQ84PYSpE-BvP4Rdt96ZjPdwy8P4e4eZz1mATys,12817
29
+ reboost/shape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
+ reboost/shape/cluster.py,sha256=RIvBlhHzp88aaUZGofp5SD9bimnoiqIOddhQ84jiwoM,8135
31
+ reboost/shape/group.py,sha256=_z2qCOret3E-kj-nrp1-J5j2lEwQpgfYdQp2pgpDHR8,4449
32
+ reboost/shape/reduction.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
+ reboost-0.3.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
34
+ reboost-0.3.1.dist-info/METADATA,sha256=5U2BXVP61tZBAxBRdAChM184YBtWPxMj7TIHfLF9WGg,44251
35
+ reboost-0.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
36
+ reboost-0.3.1.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
37
+ reboost-0.3.1.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
38
+ reboost-0.3.1.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.7.1)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,38 +0,0 @@
1
- reboost/__init__.py,sha256=RVNl3Qgx_hTUeBGXaWYmiTcmXUDhTfvlAGGC8bo_jP8,316
2
- reboost/_version.py,sha256=Xk20v7uvkFqkpy9aLJzVngs1eKQn0FYUP2oyA1MEQUU,511
3
- reboost/build_evt.py,sha256=zj3wG_kaV3EoRMQ33AkCNa_2Fv8cLtRuhyRyRmSrOYQ,4797
4
- reboost/build_glm.py,sha256=kSY9hQjEsOE-0PiblhdBy_SvFIlgXLX6CUlgpxW-_OI,9389
5
- reboost/build_hit.py,sha256=Zu8WoeFYtFU_xUO3I8OZM5psNaiv1boMJPnBWC58nfQ,14958
6
- reboost/build_tcm.py,sha256=-PawBHoHj0zsm4XsZu5bco9d9a09STicZchduefSNfI,2951
7
- reboost/cli.py,sha256=swPJcYzvg18rSOMN-mpe0PCMf1-a9V7osIssX7JP7k0,6459
8
- reboost/core.py,sha256=7Nclc6RUCOSJ1CWVAX0rFNJGM1LEgqvc4tD04CxEAtg,10766
9
- reboost/iterator.py,sha256=uKCZHobfmfzuy6Q4olHgt7m1XtUMM5KUvrk3lJ3XWec,4782
10
- reboost/log_utils.py,sha256=VqS_9OC5NeNU3jcowVOBB0NJ6ssYvNWnirEY-JVduEA,766
11
- reboost/profile.py,sha256=EOTmjmS8Rm_nYgBWNh6Rntl2XDsxdyed7yEdWtsZEeg,2598
12
- reboost/units.py,sha256=3EH8XlpbsObdu5vLgxhm1600L6UNYD5jng4SjJT_1QE,2202
13
- reboost/utils.py,sha256=eBw0ZzwhlniTLbjz9tnstCXSYrjSeH4FJ0fkJ9-uqps,8450
14
- reboost/hpge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
- reboost/hpge/psd.py,sha256=868OUJzO9TNja0YSrZ3NDGeEAbUtpDZnmvBDm0jCC9E,6856
16
- reboost/hpge/surface.py,sha256=SZyTmOCTipf27jYaJhtdInzGF1RZ2wKpbtf6HlOQYwM,3662
17
- reboost/hpge/utils.py,sha256=0Rx4HubCOm8JMECjWcAJXfAch9OkSlRpUkdsSlzwZ2E,2830
18
- reboost/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
- reboost/math/functions.py,sha256=OymiYTcA0NXxxm-MBDw5kqyNwHoLCmuv4J48AwnSrbU,5633
20
- reboost/math/stats.py,sha256=iiOEi87x93kqPWeSmlRiA5Oe-R8XR-plm6Z532PhC9M,1401
21
- reboost/optmap/__init__.py,sha256=imvuyld-GLw8qdwqW-lXCg2feptcTyQo3wIzPvDHwmY,93
22
- reboost/optmap/cli.py,sha256=wBexh-zrr5ABherEyk9xigxdArvOAKiiRQwAYon9Sro,9408
23
- reboost/optmap/convolve.py,sha256=5FksUrVIG8ysn42QbWBrAx8M1HfAVJtaJJyE8oJ1NGM,12043
24
- reboost/optmap/create.py,sha256=Nm5-xEe8M9q2GFQnUv8oN8qpAz9nZArIrQcPboqRmCQ,17153
25
- reboost/optmap/evt.py,sha256=m3NWuLEk4zDQJO5vXq_XLLnqmkQwmtdKI3fqmZQBBvc,4707
26
- reboost/optmap/mapview.py,sha256=73kpe0_SKDj9bIhEx1ybX1sBP8TyvufiLfps84A_ijA,6798
27
- reboost/optmap/numba_pdg.py,sha256=y8cXR5PWE2Liprp4ou7vl9do76dl84vXU52ZJD9_I7A,731
28
- reboost/optmap/optmap.py,sha256=j4rfbQ84PYSpE-BvP4Rdt96ZjPdwy8P4e4eZz1mATys,12817
29
- reboost/shape/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
- reboost/shape/cluster.py,sha256=RIvBlhHzp88aaUZGofp5SD9bimnoiqIOddhQ84jiwoM,8135
31
- reboost/shape/group.py,sha256=Q3DhEPxbhw3p4bwvpswSd0A-p224l5vRZnfQIEkOVJE,4475
32
- reboost/shape/reduction.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- reboost-0.2.7.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
34
- reboost-0.2.7.dist-info/METADATA,sha256=91C3mSgN5iDtZLrON4O0iFmLlsdepdW-VX8Rvr_2Kas,44251
35
- reboost-0.2.7.dist-info/WHEEL,sha256=Nw36Djuh_5VDukK0H78QzOX-_FQEo6V37m3nkm96gtU,91
36
- reboost-0.2.7.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
37
- reboost-0.2.7.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
38
- reboost-0.2.7.dist-info/RECORD,,