reboost 0.8.5__py3-none-any.whl → 0.9.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/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.8.5'
32
- __version_tuple__ = version_tuple = (0, 8, 5)
31
+ __version__ = version = '0.9.0'
32
+ __version_tuple__ = version_tuple = (0, 9, 0)
33
33
 
34
34
  __commit_id__ = commit_id = None
reboost/hpge/psd.py CHANGED
@@ -13,7 +13,7 @@ from numpy.typing import ArrayLike, NDArray
13
13
 
14
14
  from .. import units
15
15
  from ..units import ureg as u
16
- from .utils import HPGeScalarRZField
16
+ from .utils import HPGePulseShapeLibrary, HPGeRZField
17
17
 
18
18
  log = logging.getLogger(__name__)
19
19
 
@@ -83,7 +83,7 @@ def drift_time(
83
83
  xloc: ArrayLike,
84
84
  yloc: ArrayLike,
85
85
  zloc: ArrayLike,
86
- dt_map: HPGeScalarRZField,
86
+ dt_map: HPGeRZField,
87
87
  coord_offset: pint.Quantity | pyg4ometry.gdml.Position = (0, 0, 0) * u.m,
88
88
  ) -> VectorOfVectors:
89
89
  """Calculates drift times for each step (cluster) in an HPGe detector.
@@ -454,33 +454,7 @@ def _get_waveform_value_surface(
454
454
  start: float,
455
455
  dt: float,
456
456
  ) -> tuple[float, float]:
457
- """Get the value of the waveform at a certain index.
458
-
459
- Parameters
460
- ----------
461
- idx
462
- the index of the time array to find the waveform at.
463
- edep
464
- Array of energies for each step
465
- drift_time
466
- Array of drift times for each step
467
- template
468
- array of the template for the current waveforms
469
- templates_surface
470
- The current templates from the surface.
471
- activeness_surface
472
- The total collected charge for each surface point.
473
- dist_step_in_um
474
- The binning in distance for the surface pulse library.
475
- start
476
- first time value of the template
477
- dt
478
- timestep (in ns) for the template.
479
-
480
- Returns
481
- -------
482
- Value of the current waveform and the energy.
483
- """
457
+ """Get the value of the waveform at a certain index."""
484
458
  n = len(bulk_template)
485
459
  out = 0
486
460
  etmp = 0
@@ -513,6 +487,7 @@ def _get_waveform_value_surface(
513
487
  else:
514
488
  out += E * _interpolate_pulse_model(bulk_template, time, start, start + dt * n, dt, mu)
515
489
  etmp += E
490
+
516
491
  return out, etmp
517
492
 
518
493
 
@@ -525,40 +500,78 @@ def _get_waveform_value(
525
500
  start: float,
526
501
  dt: float,
527
502
  ) -> float:
528
- """Get the value of the waveform at a certain index.
503
+ """Get the value of the waveform at a certain index."""
504
+ out = 0
505
+ time = start + dt * idx
529
506
 
530
- Parameters
531
- ----------
532
- idx
533
- the index of the time array to find the waveform at.
534
- edep
535
- Array of energies for each step
536
- drift_time
537
- Array of drift times for each step
538
- template
539
- array of the template for the current waveforms
540
- start
541
- first time value of the template
542
- dt
543
- timestep (in ns) for the template.
507
+ for i in range(len(edep)):
508
+ n = len(template)
544
509
 
545
- Returns
546
- -------
547
- Value of the current waveform
548
- """
549
- n = len(template)
510
+ E = edep[i]
511
+ mu = drift_time[i]
512
+
513
+ out += E * _interpolate_pulse_model(template, time, start, start + dt * n, dt, mu)
514
+
515
+ return out
516
+
517
+
518
+ @numba.njit(cache=True)
519
+ def _get_waveform_value_pulse_shape_library(
520
+ idx: int,
521
+ edep: ak.Array,
522
+ drift_time: ak.Array,
523
+ r: ak.Array,
524
+ z: ak.Array,
525
+ pulse_shape_library: tuple[np.array, np.array, np.array],
526
+ start: float,
527
+ dt: float,
528
+ ) -> float:
529
+ """Get the value of the waveform at a certain index, using the pulse shape library."""
550
530
  out = 0
551
531
  time = start + dt * idx
552
532
 
553
533
  for i in range(len(edep)):
534
+ ri, zi = _get_template_idx(r[i], z[i], pulse_shape_library[1], pulse_shape_library[2])
535
+
536
+ n = len(pulse_shape_library[0][ri][zi])
537
+
554
538
  E = edep[i]
555
539
  mu = drift_time[i]
556
540
 
557
- out += E * _interpolate_pulse_model(template, time, start, start + dt * n, dt, mu)
541
+ out += E * _interpolate_pulse_model(
542
+ pulse_shape_library[0][ri][zi], time, start, start + dt * n, dt, mu
543
+ )
558
544
 
559
545
  return out
560
546
 
561
547
 
548
+ @numba.njit(cache=True)
549
+ def _get_template_idx(
550
+ r: float,
551
+ z: float,
552
+ r_grid: np.array,
553
+ z_grid: np.array,
554
+ ) -> tuple[int, int]:
555
+ """Extract the closest template to a given (r,z) point with uniform grid, apart from the first and last point."""
556
+ if r < r_grid[1]:
557
+ ri = 0
558
+ elif r > r_grid[-2]:
559
+ ri = len(r_grid) - 1
560
+ else:
561
+ dr = r_grid[2] - r_grid[1]
562
+ ri = int((r - r_grid[1]) / dr) + 1
563
+
564
+ if z < z_grid[1]:
565
+ zi = 0
566
+ elif z > z_grid[-2]:
567
+ zi = len(z_grid) - 1
568
+ else:
569
+ dz = z_grid[2] - z_grid[1]
570
+ zi = int((z - z_grid[1]) / dz) + 1
571
+
572
+ return ri, zi
573
+
574
+
562
575
  def get_current_template(
563
576
  low: float = -1000, high: float = 4000, step: float = 1, mean_aoe: float = 1, **kwargs
564
577
  ) -> tuple[NDArray, NDArray]:
@@ -598,7 +611,10 @@ def _get_waveform_maximum_impl(
598
611
  t: ArrayLike,
599
612
  e: ArrayLike,
600
613
  dist: ArrayLike,
614
+ r: ArrayLike,
615
+ z: ArrayLike,
601
616
  template: ArrayLike,
617
+ pulse_shape_library: tuple[np.array, np.array, np.array],
602
618
  templates_surface: ArrayLike,
603
619
  activeness_surface: ArrayLike,
604
620
  tmin: float,
@@ -609,18 +625,9 @@ def _get_waveform_maximum_impl(
609
625
  time_step: int,
610
626
  surface_step_in_um: float,
611
627
  include_surface_effects: bool,
628
+ use_library: bool,
612
629
  ):
613
- """Basic implementation to get the maximum of the waveform.
614
-
615
- Parameters
616
- ----------
617
- t
618
- drift time for each step.
619
- e
620
- energy for each step.
621
- dist
622
- distance to surface for each step.
623
- """
630
+ """Basic implementation to get the maximum of the waveform."""
624
631
  max_a = 0
625
632
  max_t = 0
626
633
  energy = np.sum(e)
@@ -634,8 +641,12 @@ def _get_waveform_maximum_impl(
634
641
  if time < tmin or (time > (tmax + time_step)):
635
642
  continue
636
643
 
637
- if not has_surface_hit:
644
+ if not has_surface_hit and (not use_library):
638
645
  val_tmp = _get_waveform_value(j, e, t, template, start=start, dt=1.0)
646
+ elif use_library:
647
+ val_tmp = _get_waveform_value_pulse_shape_library(
648
+ j, e, t, r, z, pulse_shape_library, start=start, dt=1.0
649
+ )
639
650
  else:
640
651
  val_tmp, energy = _get_waveform_value_surface(
641
652
  j,
@@ -663,9 +674,13 @@ def _estimate_current_impl(
663
674
  edep: ak.Array,
664
675
  dt: ak.Array,
665
676
  dist_to_nplus: ak.Array,
677
+ r: ak.Array,
678
+ z: ak.Array,
666
679
  template: np.array,
680
+ pulse_shape_library: tuple[np.array, np.array, np.array],
667
681
  times: np.array,
668
682
  include_surface_effects: bool,
683
+ use_library: bool,
669
684
  fccd: float,
670
685
  templates_surface: np.array,
671
686
  activeness_surface: np.array,
@@ -674,26 +689,13 @@ def _estimate_current_impl(
674
689
  """Estimate the maximum current that would be measured in the HPGe detector.
675
690
 
676
691
  This is based on extracting a waveform with :func:`get_current_waveform` and finding the maxima of it.
677
-
678
- Parameters
679
- ----------
680
- edep
681
- Array of energies for each step.
682
- dt
683
- Array of drift times for each step.
684
- dist_to_nplus
685
- Array of distance to nplus contact for each step (can be `None`, in which case no surface effects are included.)
686
- template
687
- array of the bulk pulse template
688
- times
689
- time-stamps for the bulk pulse template
690
692
  """
691
693
  A = np.zeros(len(dt))
692
694
  maximum_t = np.zeros(len(dt))
693
695
  energy = np.zeros(len(dt))
694
696
 
695
697
  time_step = 1
696
- n = len(template)
698
+ n = len(times)
697
699
  start = times[0]
698
700
 
699
701
  if include_surface_effects:
@@ -707,6 +709,9 @@ def _estimate_current_impl(
707
709
  for i in range(len(dt)):
708
710
  t = np.asarray(dt[i])
709
711
  e = np.asarray(edep[i])
712
+ r_tmp = np.asarray(r[i])
713
+ z_tmp = np.asarray(z[i])
714
+
710
715
  dist = np.asarray(dist_to_nplus[i])
711
716
 
712
717
  # get the expected maximum
@@ -720,7 +725,6 @@ def _estimate_current_impl(
720
725
  for j, d in enumerate(dist):
721
726
  dtmp = int(d / surface_step_in_um)
722
727
 
723
- # Use branchless selection
724
728
  use_offset = dtmp <= ncols
725
729
  offset_val = offsets[dtmp] if use_offset else 0.0
726
730
  time_tmp = t[j] + offset_val * use_offset
@@ -737,9 +741,12 @@ def _estimate_current_impl(
737
741
  t,
738
742
  e,
739
743
  dist,
740
- template,
741
- templates_surface,
742
- activeness_surface,
744
+ r=r_tmp,
745
+ z=z_tmp,
746
+ template=template,
747
+ pulse_shape_library=pulse_shape_library,
748
+ templates_surface=templates_surface,
749
+ activeness_surface=activeness_surface,
743
750
  tmin=tmin,
744
751
  tmax=tmax,
745
752
  start=start,
@@ -748,17 +755,73 @@ def _estimate_current_impl(
748
755
  time_step=time_step,
749
756
  surface_step_in_um=surface_step_in_um,
750
757
  include_surface_effects=include_surface_effects,
758
+ use_library=use_library,
751
759
  )
752
760
 
753
761
  return A, maximum_t, energy
754
762
 
755
763
 
764
+ def prepare_surface_inputs(
765
+ dist_to_nplus: ak.Array,
766
+ edep: ak.Array,
767
+ templates_surface: ArrayLike,
768
+ activeness_surface,
769
+ template: ArrayLike,
770
+ ) -> tuple:
771
+ """Prepare the inputs needed for surface sims."""
772
+ include_surface_effects = False
773
+
774
+ # prepare surface templates
775
+ if templates_surface is not None:
776
+ if dist_to_nplus is None:
777
+ msg = "Surface effects requested but distance not provided"
778
+ raise ValueError(msg)
779
+
780
+ include_surface_effects = True
781
+ else:
782
+ # convert types to keep numba happy
783
+ templates_surface = np.zeros((1, len(template)))
784
+ dist_to_nplus = ak.full_like(edep, np.nan)
785
+
786
+ # convert types for numba
787
+ if activeness_surface is None:
788
+ activeness_surface = np.zeros(len(template))
789
+
790
+ return include_surface_effects, dist_to_nplus, templates_surface, activeness_surface
791
+
792
+
793
+ def prepare_pulse_shape_library(
794
+ template: ArrayLike | HPGePulseShapeLibrary,
795
+ times: ArrayLike,
796
+ edep: ak.Array,
797
+ r: ak.Array,
798
+ z: ak.Array,
799
+ ):
800
+ """Prepare the inputs for the full pulse shape library."""
801
+ use_library = False
802
+ if isinstance(template, HPGePulseShapeLibrary):
803
+ # convert to a form we can use
804
+ times = template.t
805
+ pulse_shape_library = (template.waveforms, template.r, template.z)
806
+ template = np.zeros_like(template.waveforms[0][0])
807
+ use_library = True
808
+
809
+ else:
810
+ pulse_shape_library = (np.zeros((1, 1, len(template))), np.zeros(1), np.zeros(1))
811
+ r = ak.full_like(edep, np.nan)
812
+ z = ak.full_like(edep, np.nan)
813
+
814
+ return use_library, pulse_shape_library, template, times, r, z
815
+
816
+
756
817
  def maximum_current(
757
818
  edep: ArrayLike,
758
819
  drift_time: ArrayLike,
759
820
  dist_to_nplus: ArrayLike | None = None,
821
+ r: ArrayLike | None = None,
822
+ z: ArrayLike | None = None,
760
823
  *,
761
- template: np.array,
824
+ template: np.array | HPGePulseShapeLibrary,
762
825
  times: np.array,
763
826
  fccd_in_um: float = 0,
764
827
  templates_surface: ArrayLike | None = None,
@@ -776,16 +839,22 @@ def maximum_current(
776
839
  Array of drift times for each step.
777
840
  dist_to_nplus
778
841
  Distance to n-plus electrode, only needed if surface heuristics are enabled.
842
+ r
843
+ Radial coordinate (only needed if a full PSS library is used)
844
+ z
845
+ z coordinate (only needed if a full PSS library is used).
779
846
  template
780
- array of the bulk pulse template
847
+ array of the bulk pulse template, can also be a :class:`HPGePulseShapeLibrary`.
781
848
  times
782
849
  time-stamps for the bulk pulse template
783
- fccd
850
+ fccd_in_um
784
851
  Value of the full-charge-collection depth, if `None` no surface corrections are performed.
785
- surface_library
852
+ templates_surface
786
853
  2D array (distance, time) of the rate of charge arriving at the p-n junction. Each row
787
854
  should be an array of length 10000 giving the charge arriving at the p-n junction for each timestep
788
855
  (in ns). This is produced by :func:`.hpge.surface.get_surface_response` or other libraries.
856
+ activeness_surface
857
+ An array of the activeness at each surface point.
789
858
  surface_step_in_um
790
859
  Distance step for the surface library.
791
860
  return_mode
@@ -796,40 +865,35 @@ def maximum_current(
796
865
  An Array of the maximum current/ time / energy for each hit.
797
866
  """
798
867
  # extract LGDO data and units
799
-
800
868
  drift_time, _ = units.unwrap_lgdo(drift_time)
801
869
  edep, _ = units.unwrap_lgdo(edep)
802
870
  dist_to_nplus, _ = units.unwrap_lgdo(dist_to_nplus)
871
+ r, _ = units.unwrap_lgdo(r)
872
+ z, _ = units.unwrap_lgdo(z)
803
873
 
804
- include_surface_effects = False
805
-
806
- if templates_surface is not None:
807
- if dist_to_nplus is None:
808
- msg = "Surface effects requested but distance not provided"
809
- raise ValueError(msg)
810
-
811
- include_surface_effects = True
812
- else:
813
- # convert types to keep numba happy
814
- templates_surface = np.zeros((1, len(template)))
815
- dist_to_nplus = ak.full_like(edep, np.nan)
816
-
817
- # convert types for numba
818
- if activeness_surface is None:
819
- activeness_surface = np.zeros(len(template))
874
+ # prepare inputs for surface sims
875
+ include_surface_effects, dist_to_nplus, templates_surface, activeness_surface = (
876
+ prepare_surface_inputs(dist_to_nplus, edep, templates_surface, activeness_surface, template)
877
+ )
820
878
 
821
- if not ak.all(ak.num(edep, axis=-1) == ak.num(drift_time, axis=-1)):
822
- msg = "edep and drift time must have the same shape"
823
- raise ValueError(msg)
879
+ # and for the full PS library
880
+ use_library, pulse_shape_library, template, times, r, z = prepare_pulse_shape_library(
881
+ template, times, edep, r, z
882
+ )
824
883
 
884
+ # and now compute the current
825
885
  curr, time, energy = _estimate_current_impl(
826
886
  ak.values_astype(ak.Array(edep), np.float64),
827
887
  ak.values_astype(ak.Array(drift_time), np.float64),
828
888
  ak.values_astype(ak.Array(dist_to_nplus), np.float64),
889
+ r=ak.values_astype(ak.Array(r), np.float64),
890
+ z=ak.values_astype(ak.Array(z), np.float64),
829
891
  template=template,
892
+ pulse_shape_library=pulse_shape_library,
830
893
  times=times,
831
894
  fccd=fccd_in_um,
832
895
  include_surface_effects=include_surface_effects,
896
+ use_library=use_library,
833
897
  templates_surface=templates_surface,
834
898
  activeness_surface=activeness_surface,
835
899
  surface_step_in_um=surface_step_in_um,
reboost/hpge/utils.py CHANGED
@@ -11,23 +11,105 @@ from lgdo import lh5
11
11
  from scipy.interpolate import RegularGridInterpolator
12
12
 
13
13
 
14
- class HPGeScalarRZField(NamedTuple):
15
- """A scalar field defined in the cylindrical-like (r, z) HPGe plane."""
14
+ class HPGePulseShapeLibrary(NamedTuple):
15
+ """A set of templates defined in the cylindrical-like (r, z) HPGe plane."""
16
+
17
+ waveforms: np.array
18
+ "Field, function of the coordinates (r, z)."
19
+ r_units: pint.Unit
20
+ "Physical units of the coordinate `r`."
21
+ z_units: pint.Unit
22
+ "Physical units of the coordinate `z`."
23
+ t_units: pint.Unit
24
+ "Physical units of the times."
25
+ r: np.array
26
+ "One dimensional arrays specifying the radial coordinates"
27
+ z: np.array
28
+ "One dimensional arrays specifying the z coordinates"
29
+ t: np.array
30
+ "Times used to define the waveforms"
31
+
32
+
33
+ def get_hpge_pulse_shape_library(
34
+ filename: str, obj: str, field: str, out_of_bounds_val: int | float = np.nan
35
+ ) -> HPGePulseShapeLibrary:
36
+ """Create the pulse shape library, holding simulated waveforms.
37
+
38
+ Reads from disk the following data structure: ::
39
+
40
+ FILENAME/
41
+ └── OBJ · struct{r,z,dt,t0,FIELD}
42
+ ├── r · array<1>{real} ── {'units': 'UNITS'}
43
+ ├── z · array<1>{real} ── {'units': 'UNITS'}
44
+ ├── dt · real ── {'units': 'UNITS'}
45
+ ├── t0 · real ── {'units': 'UNITS'}
46
+ └── FIELD · array<3>{real} ── {'units': 'UNITS'}
47
+
48
+ The conventions follow those used for :func:`get_hpge_rz_field`.
49
+ For the FIELD the first and second dimensions are `r` and `z`, respectively, with the last
50
+ dimension representing the waveform. dt and t0 define the timestamps for the waveforms.
51
+
52
+
53
+ Parameters
54
+ ----------
55
+ filename
56
+ name of the LH5 file containing the gridded scalar field.
57
+ obj
58
+ name of the HDF5 dataset where the data is saved.
59
+ field
60
+ name of the HDF5 dataset holding the waveforms.
61
+ out_of_bounds_val
62
+ value to use to replace NaNs in the field values.
63
+ """
64
+ data = lh5.read(obj, filename)
65
+
66
+ if not isinstance(data, lgdo.Struct):
67
+ msg = f"{obj} in {filename} is not an LGDO Struct"
68
+ raise ValueError(msg)
69
+
70
+ t0 = data["t0"].value
71
+ dt = data["dt"].value
72
+
73
+ t0_u = data["t0"].attrs["units"]
74
+ dt_u = data["dt"].attrs["units"]
75
+
76
+ if t0_u != dt_u:
77
+ msg = "t0 and dt must have the same units"
78
+ raise ValueError(msg)
79
+
80
+ tu = t0_u
81
+
82
+ data = AttrsDict(
83
+ {
84
+ k: np.nan_to_num(data[k].view_as("np", with_units=True), nan=out_of_bounds_val)
85
+ for k in ("r", "z", field)
86
+ }
87
+ )
88
+
89
+ times = t0 + np.arange(np.shape(data[field].m)[2]) * dt
90
+
91
+ return HPGePulseShapeLibrary(data[field].m, data.r.u, data.z.u, tu, data.r.m, data.z.m, times)
92
+
93
+
94
+ class HPGeRZField(NamedTuple):
95
+ """A field defined in the cylindrical-like (r, z) HPGe plane."""
16
96
 
17
97
  φ: Callable
18
- "Scalar field, function of the coordinates (r, z)."
98
+ "Field, function of the coordinates (r, z)."
19
99
  r_units: pint.Unit
20
100
  "Physical units of the coordinate `r`."
21
101
  z_units: pint.Unit
22
102
  "Physical units of the coordinate `z`."
23
103
  φ_units: pint.Unit
24
104
  "Physical units of the field."
105
+ ndim: int
106
+ "Number of dimensions for the field"
25
107
 
26
108
 
27
- def get_hpge_scalar_rz_field(
109
+ def get_hpge_rz_field(
28
110
  filename: str, obj: str, field: str, out_of_bounds_val: int | float = np.nan, **kwargs
29
- ) -> HPGeScalarRZField:
30
- """Create an interpolator for a gridded scalar HPGe field defined on `(r, z)`.
111
+ ) -> HPGeRZField:
112
+ """Create an interpolator for a gridded HPGe field defined on `(r, z)`.
31
113
 
32
114
  Reads from disk the following data structure: ::
33
115
 
@@ -35,7 +117,7 @@ def get_hpge_scalar_rz_field(
35
117
  └── OBJ · struct{r,z,FIELD}
36
118
  ├── r · array<1>{real} ── {'units': 'UNITS'}
37
119
  ├── z · array<1>{real} ── {'units': 'UNITS'}
38
- └── FIELD · array<2>{real} ── {'units': 'UNITS'}
120
+ └── FIELD · array<N+2>{real} ── {'units': 'UNITS'}
39
121
 
40
122
  where ``FILENAME``, ``OBJ`` and ``FIELD`` are provided as
41
123
  arguments to this function. `obj` is a :class:`~lgdo.types.struct.Struct`,
@@ -43,9 +125,11 @@ def get_hpge_scalar_rz_field(
43
125
  coordinates of the rectangular grid — not the coordinates of each single
44
126
  grid point. In this coordinate system, the center of the p+ contact surface
45
127
  is at `(0, 0)`, with the p+ contact facing downwards. `field` is instead a
46
- two-dimensional array specifying the field value at each grid point. The
47
- first and second dimensions are `r` and `z`, respectively. NaN values are
48
- interpreted as points outside the detector profile in the `(r, z)` plane.
128
+ ndim plus two-dimensional array specifying the field value at each grid point. The
129
+ first and second dimensions are `r` and `z`, respectively, with the latter dimensions
130
+ representing the dimensions of the output field.
131
+
132
+ NaN values are interpreted as points outside the detector profile in the `(r, z)` plane.
49
133
 
50
134
  Before returning a :class:`HPGeScalarRZField`, the gridded field is fed to
51
135
  :class:`scipy.interpolate.RegularGridInterpolator`.
@@ -73,7 +157,9 @@ def get_hpge_scalar_rz_field(
73
157
  for k in ("r", "z", field)
74
158
  }
75
159
  )
160
+ ndim = data[field].m.ndim - 2
161
+ interpolator = RegularGridInterpolator(
162
+ (data.r.m, data.z.m), data[field].m, **(kwargs | {"fill_value": out_of_bounds_val})
163
+ )
76
164
 
77
- interpolator = RegularGridInterpolator((data.r.m, data.z.m), data[field].m, **kwargs)
78
-
79
- return HPGeScalarRZField(interpolator, data.r.u, data.z.u, data[field].u)
165
+ return HPGeRZField(interpolator, data.r.u, data.z.u, data[field].u, ndim)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reboost
3
- Version: 0.8.5
3
+ Version: 0.9.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
@@ -1,6 +1,6 @@
1
1
  reboost/__init__.py,sha256=VZz9uo7i2jgAx8Zi15SptLZnE_qcnGuNWwqkD3rYHFA,278
2
2
  reboost/__main__.py,sha256=42koSxY2st4mMIRSAnKz06nP5HppMPxBVFf2jaHljGs,95
3
- reboost/_version.py,sha256=ulkPqAGMUJNjTNjZ56AYF9MmX06386otNWNjTA8opI8,704
3
+ reboost/_version.py,sha256=TvxBYkx8Rz_Q1S3JFp831BRT8Wo0Yxt6TJMtgZKenTo,704
4
4
  reboost/build_evt.py,sha256=VXIfK_pfe_Cgym6gI8dESwONZi-v_4fll0Pn09vePQY,3767
5
5
  reboost/build_glm.py,sha256=IerSLQfe51ZO7CQP2kmfPnOIVaDtcfw3byOM02Vaz6o,9472
6
6
  reboost/build_hit.py,sha256=N_nxvH69SvILVNmyvVfhQwQdD_PDW8tlsqj2ciO5nKE,17409
@@ -15,9 +15,9 @@ reboost/daq/__init__.py,sha256=rNPhxx1Yawt3tENYhmOYSum9_TdV57ZU5kjxlWFAGuo,107
15
15
  reboost/daq/core.py,sha256=Rs6Q-17fzEod2iX_2WqEmnqKnNRFoWTYURl3wYhFihU,9915
16
16
  reboost/daq/utils.py,sha256=KcH6zvlInmD2YiF6V--DSYBTYudJw3G-hp2JGOcES2o,1042
17
17
  reboost/hpge/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
18
- reboost/hpge/psd.py,sha256=qgX1KWVApd3GOIkRzUwJ5MNMIlzVavv35MGZSWTUZHo,24565
18
+ reboost/hpge/psd.py,sha256=P7dUJQPvxW6vndJ79r0j7ANZvSuV_IuauERhvWD74j0,26989
19
19
  reboost/hpge/surface.py,sha256=feH-kxRRp3HkikRRJ-LCu6zvVONEOYVd3THx12emGTM,8494
20
- reboost/hpge/utils.py,sha256=AcMS86v8s0SbeC4YA3CfH73GBZcC7Sb_RR3pRPjWAwU,2857
20
+ reboost/hpge/utils.py,sha256=0hHu5S1lDOiMMVPgfHY03R5ggyeWX2OwONHVZeFmcpU,5652
21
21
  reboost/math/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
22
  reboost/math/functions.py,sha256=OymiYTcA0NXxxm-MBDw5kqyNwHoLCmuv4J48AwnSrbU,5633
23
23
  reboost/math/stats.py,sha256=Rq4Wdzv-3aoSK7EsPZCuOEHfnOz3w0moIzCEHbC07xw,3173
@@ -36,9 +36,9 @@ reboost/shape/group.py,sha256=gOCYgir2gZqmW1JXtbNRPlQqP0gmUcbe7RVb9CbY1pU,5540
36
36
  reboost/shape/reduction.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
37
37
  reboost/spms/__init__.py,sha256=8I6WT8i_kUPqEDnSD0aCf6A26cjKjQQZSNrvwZ3o-Ac,415
38
38
  reboost/spms/pe.py,sha256=LwqrK1HOZWzGcNZnntaqI6r4rnDww4KW9Mao4xLFbDE,8226
39
- reboost-0.8.5.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
40
- reboost-0.8.5.dist-info/METADATA,sha256=4MY_lm3rUT_DfLU3hc-_U2LJIHuV_j-EPgi0SLRJYiU,3877
41
- reboost-0.8.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
- reboost-0.8.5.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
43
- reboost-0.8.5.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
44
- reboost-0.8.5.dist-info/RECORD,,
39
+ reboost-0.9.0.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
40
+ reboost-0.9.0.dist-info/METADATA,sha256=wrdKu5HVcTaoKIz6mp72uJ9ehRzyF0e1xCWUe63g7DM,3877
41
+ reboost-0.9.0.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
42
+ reboost-0.9.0.dist-info/entry_points.txt,sha256=DxhD6BidSWNot9BrejHJjQ7RRLmrMaBIl52T75oWTwM,93
43
+ reboost-0.9.0.dist-info/top_level.txt,sha256=q-IBsDepaY_AbzbRmQoW8EZrITXRVawVnNrB-_zyXZs,8
44
+ reboost-0.9.0.dist-info/RECORD,,