pyIntensityFeatures 0.1.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.
Files changed (30) hide show
  1. pyIntensityFeatures/__init__.py +30 -0
  2. pyIntensityFeatures/_main.py +500 -0
  3. pyIntensityFeatures/instruments/__init__.py +9 -0
  4. pyIntensityFeatures/instruments/satellites.py +137 -0
  5. pyIntensityFeatures/proc/__init__.py +10 -0
  6. pyIntensityFeatures/proc/boundaries.py +420 -0
  7. pyIntensityFeatures/proc/fitting.py +374 -0
  8. pyIntensityFeatures/proc/intensity.py +251 -0
  9. pyIntensityFeatures/tests/__init__.py +1 -0
  10. pyIntensityFeatures/tests/test_instruments_satellites.py +210 -0
  11. pyIntensityFeatures/tests/test_main.py +734 -0
  12. pyIntensityFeatures/tests/test_proc_boundaries.py +613 -0
  13. pyIntensityFeatures/tests/test_proc_fitting.py +218 -0
  14. pyIntensityFeatures/tests/test_proc_intensity.py +205 -0
  15. pyIntensityFeatures/tests/test_utils_checks.py +933 -0
  16. pyIntensityFeatures/tests/test_utils_coords.py +197 -0
  17. pyIntensityFeatures/tests/test_utils_distributions.py +236 -0
  18. pyIntensityFeatures/tests/test_utils_grids.py +189 -0
  19. pyIntensityFeatures/tests/test_utils_output.py +433 -0
  20. pyIntensityFeatures/utils/__init__.py +13 -0
  21. pyIntensityFeatures/utils/checks.py +420 -0
  22. pyIntensityFeatures/utils/coords.py +157 -0
  23. pyIntensityFeatures/utils/distributions.py +199 -0
  24. pyIntensityFeatures/utils/grids.py +113 -0
  25. pyIntensityFeatures/utils/output.py +276 -0
  26. pyintensityfeatures-0.1.0.dist-info/METADATA +360 -0
  27. pyintensityfeatures-0.1.0.dist-info/RECORD +30 -0
  28. pyintensityfeatures-0.1.0.dist-info/WHEEL +5 -0
  29. pyintensityfeatures-0.1.0.dist-info/licenses/LICENSE +28 -0
  30. pyintensityfeatures-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,360 @@
1
+ Metadata-Version: 2.4
2
+ Name: pyIntensityFeatures
3
+ Version: 0.1.0
4
+ Summary: Identify features, such as auroral luminosity boundaries, in imager data
5
+ Home-page: https://github.com/aburrell/pyIntensityFeatures
6
+ Author-email: Angeline Burrell <angeline.g.burrell.civ@us.navy.mil>
7
+ License: Copyright (c) 2025, Angeline G. Burrell (AGB), Gareth Chisham (GC), and
8
+ Nicola Longden (NL)
9
+ All rights reserved.
10
+
11
+ Redistribution and use in source and binary forms, with or without
12
+ modification, are permitted provided that the following conditions are met:
13
+
14
+ * Redistributions of source code must retain the above copyright notice, this
15
+ list of conditions and the following disclaimer.
16
+
17
+ * Redistributions in binary form must reproduce the above copyright notice,
18
+ this list of conditions and the following disclaimer in the documentation
19
+ and/or other materials provided with the distribution.
20
+
21
+ * Neither the name of ocbpy nor the names of its contributors may be used to
22
+ endorse or promote products derived from this software without specific
23
+ prior written permission.
24
+
25
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
26
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
28
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
29
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
30
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
31
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
33
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
34
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
35
+
36
+ Project-URL: Documentation, https://pyintensityfeatures.readthedocs.io/en/latest/
37
+ Project-URL: Source, https://github.com/aburrell/pyIntensityFeatures
38
+ Project-URL: Tracker, https://github.com/aburrell/pyIntensityFeatures/issues
39
+ Project-URL: Download, https://github.com/aburrell/pyIntensityFeatures/releases
40
+ Keywords: aurora,aurora australis,aurora borealis,boundaries,imager,ionosphere,heliophysics,magnetosphere,northern lights,southern lights,features,intensity
41
+ Classifier: Development Status :: 3 - Alpha
42
+ Classifier: Topic :: Scientific/Engineering :: Physics
43
+ Classifier: Topic :: Scientific/Engineering :: Atmospheric Science
44
+ Classifier: Intended Audience :: Science/Research
45
+ Classifier: License :: OSI Approved :: BSD License
46
+ Classifier: Natural Language :: English
47
+ Classifier: Programming Language :: Python :: 3
48
+ Classifier: Programming Language :: Python :: 3.10
49
+ Classifier: Programming Language :: Python :: 3.11
50
+ Classifier: Programming Language :: Python :: 3.12
51
+ Classifier: Programming Language :: Python :: 3.13
52
+ Classifier: Operating System :: POSIX :: Linux
53
+ Classifier: Operating System :: MacOS :: MacOS X
54
+ Classifier: Operating System :: Microsoft :: Windows
55
+ Requires-Python: >=3.9
56
+ Description-Content-Type: text/markdown
57
+ License-File: LICENSE
58
+ Requires-Dist: aacgmv2
59
+ Requires-Dist: numpy
60
+ Requires-Dist: pandas
61
+ Requires-Dist: scipy
62
+ Requires-Dist: xarray
63
+ Provides-Extra: apex
64
+ Requires-Dist: apexpy; extra == "apex"
65
+ Provides-Extra: test
66
+ Requires-Dist: coverage[toml]; extra == "test"
67
+ Requires-Dist: flake8; extra == "test"
68
+ Requires-Dist: flake8-docstrings; extra == "test"
69
+ Provides-Extra: doc
70
+ Requires-Dist: myst_parser; extra == "doc"
71
+ Requires-Dist: numpydoc; extra == "doc"
72
+ Requires-Dist: pyproject-parser; extra == "doc"
73
+ Requires-Dist: sphinx; extra == "doc"
74
+ Requires-Dist: sphinx-autoapi; extra == "doc"
75
+ Requires-Dist: sphinx_rtd_theme; extra == "doc"
76
+ Dynamic: license-file
77
+
78
+ [![Documentation Status](https://readthedocs.org/projects/pyIntensityFeatures/badge/?version=latest)](http://pyIntensityFeatures.readthedocs.io/en/latest/?badge=latest)
79
+ [DOI]
80
+ [PyPI version]
81
+ [![Test Status](https://github.com/aburrell/pyIntensityFeatures/actions/workflows/main.yml/badge.svg)](https://github.com/aburrell/pyIntensityFeatures/actions/workflows/main.yml)
82
+ [![Coverage Status](https://coveralls.io/repos/github/aburrell/pyIntensityFeatures/badge.svg?branch=main)](https://coveralls.io/github/aburrell/pyIntensityFeatures?branch=main)
83
+
84
+ <h1> <img width="128" height="128" src="https://raw.githubusercontent.com/aburrell/pyIntensityFeatures/refs/heads/main/docs/figures/pyIntensityFeatures_logo.png" alt="Snakes marking the boundaries of the auroral oval" title="pyIntensityFeatures logo" style="float:left;">
85
+ Overview </h1>
86
+
87
+ pyIntensityFeatures is a Python module that identifies features in imager
88
+ intensity data. It currently supports the identification of the Auroral
89
+ Luminosity Boundaries (ALBs). This package is designed to be data source
90
+ agnostic and uses a fitting method based on Longden et al. (2009) to identify
91
+ the poleward and equatorward ALBs. Current support focuses on satellite-based
92
+ imagers.
93
+
94
+ # Dependencies
95
+
96
+ The required dependecies encompass:
97
+ * aacgmv2
98
+ * numpy
99
+ * pandas
100
+ * scipy
101
+ * xarray
102
+
103
+ Optional dependencies include:
104
+ * apexpy
105
+
106
+ Testing is performed using the python module, unittest.
107
+
108
+ # Installation
109
+
110
+ Installation is now available through pypi
111
+
112
+ ```
113
+ $ pip install pyIntensityFeatures
114
+ ```
115
+
116
+ You may also checkout the repository and install it yourself:
117
+
118
+ ```
119
+ $ git clone git://github.com/aburrell/pyIntensityFeatures.git;
120
+ ```
121
+
122
+ Change directories into the repository folder and build the wheel.
123
+
124
+ ```
125
+ $ cd pyIntensityFeatures/
126
+ $ python -m build .
127
+ $ pip install .
128
+ ```
129
+
130
+ To run the unit tests,
131
+
132
+ ```
133
+ $ python -m unittest discover
134
+ ```
135
+
136
+ # Example
137
+
138
+ This example uses pysatNASA to obtain GUVI sdr-imaging data. You can use this
139
+ as a template to create the necessary supporting functions to identify ALBs
140
+ in your own data set. In iPython, run:
141
+
142
+ ```
143
+ import datetime as dt
144
+ import pyIntensityFeatures
145
+ import pysat
146
+ from pysatNASA.instruments import timed_guvi
147
+ ```
148
+
149
+ Obtain the data from which you want to get boundaries.
150
+
151
+ ```
152
+ stime = dt.datetime(2005, 1, 1)
153
+ guvi = pysat.Instrument(inst_module=timed_guvi, tag='sdr-imaging',
154
+ inst_id='high_res')
155
+ guvi.download(start=stime)
156
+ ```
157
+
158
+ We need to create a cleaning function to select only good intensity data using
159
+ the supplied DQI flag. Because GUVI images the ionosphere at several
160
+ wavelenghts and the satellite slice-detection function expects a 2D array for
161
+ intensity, we also need to create a function that will add a single-channel
162
+ intensity variable to the pysat GUVI Instrument.
163
+
164
+ ```
165
+ def create_channel_intensity(guvi, channel='LBHlong'):
166
+ """Create a new variable for the single-channel auroral intensity.
167
+
168
+ Parameters
169
+ ----------
170
+ guvi : pysat.Instrument
171
+ pysat Instrument for the GUVI data.
172
+ channel : str
173
+ Desired channel name. (defualt='LBHlong')
174
+
175
+ """
176
+ int_var = 'DISK_RECTIFIED_INTENSITY_DAY_AURORAL'
177
+ chan_var = 'nchan'
178
+
179
+ # Get the channel index
180
+ ichan = list(guvi[chan_var].values).index(channel)
181
+
182
+ # Create the new intensity variable
183
+ new_var = int_var.replace('DISK_RECTIFIED', channel)
184
+ guvi[new_var] = guvi[int_var][:, :, ichan]
185
+ return
186
+
187
+
188
+ def clean_guvi(guvi, int_var):
189
+ """Get a mask for clean GUVI auroral intensity.
190
+
191
+ Parameters
192
+ ----------
193
+ guvi : pysat.Instrument
194
+ pysat Instrument for the GUVI data.
195
+ int_var : str
196
+ Intensity variable name
197
+
198
+ Returns
199
+ -------
200
+ clean_mask : array-like
201
+ 2D array with a mask denoting the good data by the DQI auroral flag.
202
+
203
+ """
204
+ flag_var = 'DQI_DAY_AURORAL'
205
+
206
+ # Get the clean mask from the flag
207
+ clean_mask = np.full(shape=guvi[int_var].values.shape, fill_value=False)
208
+ clean_mask = guvi[flag_var].values <= 0
209
+
210
+ # The pyIntensityFeatures.instruments.satellites function requires time as
211
+ # the first dimension
212
+ return clean_mask.transpose()
213
+ ```
214
+
215
+ pysat allows methods that update or alter the instrument to be run when loading
216
+ the data. Attach the `create_channel_intensity` function and load the
217
+ desired day.
218
+
219
+ ```
220
+ guvi.custom_attach(create_channel_intensity, kwargs={'channel': 'LBHlong'})
221
+ guvi.load(date=stime)
222
+ ```
223
+
224
+ Then initialise an AuroralBounds class object. The `transpose` kwarg is set
225
+ to `True` to reshape the GUVI longitude, latitude, and intensity data such that
226
+ the time dimension is first.
227
+
228
+ ```
229
+ ckwargs = {'int_var': 'LBHlong_INTENSITY_DAY_AURORAL'}
230
+ guvi_alb = pyIntensityFeatures.AuroralBounds(guvi, 'time_auroral',
231
+ 'PIERCEPOINT_DAY_LONGITUDE_AURORAL',
232
+ 'PIERCEPOINT_DAY_LATITUDE_AURORAL',
233
+ 'LBHlong_INTENSITY_DAY_AURORAL',
234
+ 110.0, hemisphere=1,
235
+ opt_coords={'channel': 'LBHlong'},
236
+ transpose=True,
237
+ clean_func=clean_guvi,
238
+ clean_kwargs=ckwargs)
239
+ print(guvi_alb)
240
+ ```
241
+
242
+ The output should be as follows, with the start and end times set to reflect
243
+ the times at which data was provided:
244
+
245
+ ```
246
+ Auroral Boundary object
247
+ =======================
248
+ Instrument Data: pysat Instrument object
249
+ -----------------------
250
+ Platform: 'timed'
251
+ Name: 'guvi'
252
+ Tag: 'sdr-imaging'
253
+ Instrument id: 'high_res'
254
+
255
+ Data Processing
256
+ ---------------
257
+ Cleaning Level: 'clean'
258
+ Data Padding: None
259
+ Custom Functions: 1 applied
260
+ 0: <function create_channel_intensity>
261
+ : Kwargs={'channel': 'LBHlong'}
262
+
263
+ Local File Statistics
264
+ ---------------------
265
+ Number of files: 711
266
+ Date Range: 01 January 2005 --- 01 March 2005
267
+
268
+ Loaded Data Statistics
269
+ ----------------------
270
+ Date: 01 January 2005
271
+ DOY: 001
272
+ Time range: 01 January 2005 00:12:38 --- 01 January 2005 23:59:59
273
+ Number of Times: 23989
274
+ Number of variables: 70
275
+
276
+ Variable Names:
277
+ ORBIT_DAY LATITUDE_DAY LONGITUDE_DAY
278
+ ...
279
+ nCross nCrossDayAur LBHlong_INTENSITY_DAY_AURORAL
280
+
281
+ pysat Meta object
282
+ -----------------
283
+ Tracking 8 metadata values
284
+ Metadata for 90 standard variables
285
+ Metadata for 40 global attributes
286
+
287
+
288
+ Data Variables
289
+ --------------
290
+ Time: time_auroral
291
+ Geo Lon: PIERCEPOINT_DAY_LONGITUDE_AURORAL
292
+ Geo Lat: PIERCEPOINT_DAY_LATITUDE_AURORAL
293
+ Intensity: LBHlong_INTENSITY_DAY_AURORAL
294
+ Transpose: {'PIERCEPOINT_DAY_LONGITUDE_AURORAL': True,
295
+ 'PIERCEPOINT_DAY_LATITUDE_AURORAL': True,
296
+ 'LBHlong_INTENSITY_DAY_AURORAL': True}
297
+
298
+ Coordinate Attributes
299
+ ---------------------
300
+ Hemisphere: 1
301
+ Altitude: 110.00 km
302
+ Optional coords: {'channel': 'LBHlong', 'hemisphere': 1}
303
+ Start time: 2005-01-01T00:12:38.575362000
304
+ End time: 2005-01-01T23:59:59.722748000
305
+
306
+ Instrument Functions
307
+ --------------------
308
+ Slicing: functools.partial(<function get_auroral_slice>, transpose=True)
309
+ Cleaning: functools.partial(<function clean_guvi>,
310
+ int_var='LBHlong_INTENSITY_DAY_AURORAL')
311
+ ```
312
+
313
+ Now, get the ALBs for the loaded data using the method defaults. This will
314
+ update the `boundaries` attribute from `None` to a filled or empty xarray
315
+ Dataset. We will update the end time to be shorter than the amount of loaded
316
+ data to limit the processing time.
317
+
318
+ ```
319
+ guvi_alb.etime = dt.datetime(2005, 1, 1, 0, 25)
320
+ guvi_alb.set_boundaries()
321
+ print(guvi_alb.boundaries)
322
+ ```
323
+
324
+ This will yield one slice of intensity data in the Northern hemisphere with
325
+ ALBs:
326
+
327
+ ```
328
+ <xarray.Dataset>
329
+ Dimensions: (sweep_start: 1, mlt: 48, coeff: 12, lat: 31, sweep_end: 1)
330
+ Coordinates:
331
+ * sweep_start (sweep_start) datetime64[ns] 2005-01-01T00:24:35.572131
332
+ * sweep_end (sweep_end) datetime64[ns] 2005-01-01T00:49:11.295639
333
+ * mlt (mlt) float64 0.25 0.75 1.25 1.75 ... 22.75 23.25 23.75
334
+ channel <U7 'LBHlong'
335
+ hemisphere int64 1
336
+ * lat (lat) float64 59.5 60.5 61.5 62.5 ... 86.5 87.5 88.5 89.5
337
+ Dimensions without coordinates: coeff
338
+ Data variables:
339
+ eq_bounds (sweep_start, mlt) float64 63.5 64.03 nan ... nan 62.98 nan
340
+ eq_uncert (sweep_start, mlt) float64 0.741 0.8169 nan ... 2.219 nan
341
+ po_bounds (sweep_start, mlt) float64 73.96 76.12 nan ... nan 71.24 nan
342
+ po_uncert (sweep_start, mlt) float64 0.97 2.213 nan ... nan 0.6226 nan
343
+ eq_params (sweep_start, mlt, coeff) float64 67.87 -2.033 ... nan nan
344
+ po_params (sweep_start, mlt, coeff) float64 67.87 -2.033 ... nan nan
345
+ mean_intensity (sweep_start, lat, mlt) float64 0.2494 0.8067 ... nan nan
346
+ std_intensity (sweep_start, lat, mlt) float64 10.72 9.089 ... nan nan
347
+ num_intensity (sweep_start, lat, mlt) float64 10.72 9.089 ... nan nan
348
+ Attributes:
349
+ min_mlat_base: 59.0
350
+ mag_method: ALLOWTRACE
351
+ mlat_inc: 1.0
352
+ mlt_inc: 0.5
353
+ un_threshold: 1.25
354
+ lt_out_bin: 5.0
355
+ max_iqr: 1.5
356
+ ```
357
+
358
+ You can then save the data as a NetCDF using the built-in xarray Dataset method.
359
+ All the kwargs from the `set_boundaries` method have been added as attributes to
360
+ ensure reproducibility of the identified boundaries.
@@ -0,0 +1,30 @@
1
+ pyIntensityFeatures/__init__.py,sha256=YIDH9ou5u18AE1jDDM752pUVxtrMNswkfr6UJzFCIXE,990
2
+ pyIntensityFeatures/_main.py,sha256=tU2fi_GPJ8T7Mqt4iliU7EP7HJwKJHpofu_lc4QJbvI,19250
3
+ pyIntensityFeatures/instruments/__init__.py,sha256=0Ta2X4OCTwTRD9RBe-smdFsXhtP7uDSOtkJjRb_8Jq8,329
4
+ pyIntensityFeatures/instruments/satellites.py,sha256=9YARPRv9ABLswiXkPEC-4PjZUCojwCzKVOk_GvWXDzs,4731
5
+ pyIntensityFeatures/proc/__init__.py,sha256=VivAhUaNzxHRKGvoZWZdVBHM51J30BCueoxSsEWiCaE,382
6
+ pyIntensityFeatures/proc/boundaries.py,sha256=QcBfudrYHqskMBQvnk-10mX51_pb2rzzMu9kgBgfW8s,16772
7
+ pyIntensityFeatures/proc/fitting.py,sha256=u9FmNujlGvHB_3Ylnes2byejWy_MtyakgQig4FpzKao,14327
8
+ pyIntensityFeatures/proc/intensity.py,sha256=P6Z3mVvv68Oef8sJ37v7VnlE8UqT2-EpzrEHhMNzL2Q,10979
9
+ pyIntensityFeatures/tests/__init__.py,sha256=XIqU5yPIoD3TVB4SnBDT6vUO5FL_bsFWcUCyVlAwK1Y,62
10
+ pyIntensityFeatures/tests/test_instruments_satellites.py,sha256=bfzTkjovSy3DJLdjYLYAW1dmxTUOP_8dQaXr-6IUS4U,8986
11
+ pyIntensityFeatures/tests/test_main.py,sha256=-Bf-akD6SP_FeAMh9FPDqTHMxZbwA4LI1pdjCNoVouo,29490
12
+ pyIntensityFeatures/tests/test_proc_boundaries.py,sha256=CDWxUz8f-QqEI1PrBCi1Xo9knxdEJp_PoTUastwNr2I,26466
13
+ pyIntensityFeatures/tests/test_proc_fitting.py,sha256=Iy1QrzhFMKS7m4aR1GTEFUyuKCy2yskHewAfD38N0Rg,9010
14
+ pyIntensityFeatures/tests/test_proc_intensity.py,sha256=nk7qy85z5npfpLvwZGoj22MqzGuf-L85iXprXrXw9Bw,9377
15
+ pyIntensityFeatures/tests/test_utils_checks.py,sha256=CMFy_NYS-Lqp26c7IDP5HfSLyOat0YOc-ymOYoCTqXk,38841
16
+ pyIntensityFeatures/tests/test_utils_coords.py,sha256=bUnceqTjf2ZCQeMFSlfoHueGjebQGI0ipxpJCdYz8kM,7952
17
+ pyIntensityFeatures/tests/test_utils_distributions.py,sha256=TNluwLfCrughn7RJqweK0n8XgKWHow92iiaxQPlmbww,8198
18
+ pyIntensityFeatures/tests/test_utils_grids.py,sha256=K0AB3aeObNyp6wag1VGU2sgjFFc3xH5TT2TXdF7NWEE,7678
19
+ pyIntensityFeatures/tests/test_utils_output.py,sha256=7EGS7VkLNAvhECMC_CWcThSj3K5JzDQoc4Ilabti4qs,19030
20
+ pyIntensityFeatures/utils/__init__.py,sha256=LiltYUk8UPuziwpYlOVBkEizU7RclwVzMQwsOmUl-pk,548
21
+ pyIntensityFeatures/utils/checks.py,sha256=RqHri9p9tnzBkiyEQOZuMaAuApE5G4kArchVxmNa5HQ,15265
22
+ pyIntensityFeatures/utils/coords.py,sha256=NohKRfGBEuoLjx60UDCVV97_Jlt88VucJbvbxxQcsac,4885
23
+ pyIntensityFeatures/utils/distributions.py,sha256=T-X_VcP_KZSDo-aOyUyyZ2VvFYx18OWcl__ei_CxMlw,4883
24
+ pyIntensityFeatures/utils/grids.py,sha256=LHSGXuqErJUyC1mjS9wrd_AiZeQx3vBaCui8grd2KgU,3850
25
+ pyIntensityFeatures/utils/output.py,sha256=eyuHGzOk7e_Hb3PYEMpMK8p_xnEClSCGxpcgeoZ8COc,9452
26
+ pyintensityfeatures-0.1.0.dist-info/licenses/LICENSE,sha256=2rqvPCo5G2RAFaDXYvLH4sHIljYOaif3Cs_1NoQxPxg,1534
27
+ pyintensityfeatures-0.1.0.dist-info/METADATA,sha256=dhxEd6IkvwunK5tNyZVkB2-vIvuQOqdRB8AMgzPDfM4,13211
28
+ pyintensityfeatures-0.1.0.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
29
+ pyintensityfeatures-0.1.0.dist-info/top_level.txt,sha256=FO-XctjFafctEgZ7Py9YE0NH3DSfA5h4sDdJnKnBeOI,20
30
+ pyintensityfeatures-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (78.1.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,28 @@
1
+ Copyright (c) 2025, Angeline G. Burrell (AGB), Gareth Chisham (GC), and
2
+ Nicola Longden (NL)
3
+ All rights reserved.
4
+
5
+ Redistribution and use in source and binary forms, with or without
6
+ modification, are permitted provided that the following conditions are met:
7
+
8
+ * Redistributions of source code must retain the above copyright notice, this
9
+ list of conditions and the following disclaimer.
10
+
11
+ * Redistributions in binary form must reproduce the above copyright notice,
12
+ this list of conditions and the following disclaimer in the documentation
13
+ and/or other materials provided with the distribution.
14
+
15
+ * Neither the name of ocbpy nor the names of its contributors may be used to
16
+ endorse or promote products derived from this software without specific
17
+ prior written permission.
18
+
19
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
22
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
23
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
25
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
26
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
27
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -0,0 +1 @@
1
+ pyIntensityFeatures