dendrotweaks 0.4.4__py3-none-any.whl → 0.4.6__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.
dendrotweaks/utils.py CHANGED
@@ -26,24 +26,41 @@ SWC_ID_TO_DOMAIN = {
26
26
  8: 'reduced',
27
27
  }
28
28
 
29
+ POPULATIONS = {'AMPA': {}, 'NMDA': {}, 'AMPA_NMDA': {}, 'GABAa': {}}
30
+
31
+ INDEPENDENT_PARAMS = {
32
+ 'cm': 1, # uF/cm2
33
+ 'Ra': 100, # Ohm cm
34
+ 'ena': 50, # mV
35
+ 'ek': -77, # mV
36
+ 'eca': 140 # mV
37
+ }
38
+
39
+ DOMAIN_TO_GROUP = {
40
+ 'soma': 'somatic',
41
+ 'axon': 'axonal',
42
+ 'dend': 'dendritic',
43
+ 'apic': 'apical',
44
+ }
45
+
29
46
  DOMAIN_TO_SWC_ID = {
30
47
  v: k for k, v in SWC_ID_TO_DOMAIN.items()
31
48
  }
32
49
 
33
- def get_swc_idx(domain_name):
34
- base_domain, _, idx = domain_name.partition('_')
35
- if base_domain == 'reduced':
36
- return int(f'8{idx}')
37
- elif base_domain == 'custom':
38
- return int(f'5{idx}')
39
- return DOMAIN_TO_SWC_ID.get(base_domain, 0)
40
-
41
- def get_domain_name(swc_idx):
42
- if str(swc_idx).startswith('8'):
43
- return 'reduced_' + str(swc_idx)[1:]
44
- elif str(swc_idx).startswith('5'):
45
- return 'custom_' + str(swc_idx)[1:]
46
- return SWC_ID_TO_DOMAIN.get(swc_idx, 'undefined')
50
+ DOMAINS_TO_NEURON = {
51
+ 'soma': 'soma',
52
+ 'perisomatic': 'dend_11',
53
+ 'axon': 'axon',
54
+ 'apic': 'apic',
55
+ 'dend': 'dend',
56
+ 'basal': 'dend_31',
57
+ 'trunk': 'dend_41',
58
+ 'tuft': 'dend_42',
59
+ 'oblique': 'dend_43',
60
+ 'custom': 'dend_5',
61
+ 'reduced': 'dend_8',
62
+ 'undefined': 'dend_0',
63
+ }
47
64
 
48
65
  DOMAINS_TO_COLORS = {
49
66
  'soma': '#E69F00',
@@ -60,11 +77,24 @@ DOMAINS_TO_COLORS = {
60
77
  'undefined': '#7F7F7F',
61
78
  }
62
79
 
63
- def get_domain_color(domain_name):
80
+ def get_swc_idx(domain_name):
64
81
  base_domain, _, idx = domain_name.partition('_')
65
- return DOMAINS_TO_COLORS.get(base_domain, '#7F7F7F')
82
+ if base_domain == 'reduced':
83
+ return int(f'8{idx}')
84
+ elif base_domain == 'custom':
85
+ return int(f'5{idx}')
86
+ return DOMAIN_TO_SWC_ID.get(base_domain, 0)
66
87
 
88
+ def get_domain_name(swc_idx):
89
+ if str(swc_idx).startswith('8'):
90
+ return 'reduced_' + str(swc_idx)[1:]
91
+ elif str(swc_idx).startswith('5'):
92
+ return 'custom_' + str(swc_idx)[1:]
93
+ return SWC_ID_TO_DOMAIN.get(swc_idx, 'undefined')
67
94
 
95
+ def get_domain_color(domain_name):
96
+ base_domain, _, idx = domain_name.partition('_')
97
+ return DOMAINS_TO_COLORS.get(base_domain, '#7F7F7F')
68
98
 
69
99
  def timeit(func):
70
100
  def wrapper(*args, **kwargs):
@@ -75,7 +105,6 @@ def timeit(func):
75
105
  return result
76
106
  return wrapper
77
107
 
78
-
79
108
  def calculate_lambda_f(distances, diameters, Ra=35.4, Cm=1, frequency=100):
80
109
  """
81
110
  Calculate the frequency-dependent length constant (lambda_f) according to NEURON's implementation,
@@ -118,10 +147,6 @@ def calculate_lambda_f(distances, diameters, Ra=35.4, Cm=1, frequency=100):
118
147
  # Return section_L/lam (electrotonic length of the section)
119
148
  return section_L / lam
120
149
 
121
- if (__name__ == '__main__'):
122
- print('Executing as standalone script')
123
-
124
-
125
150
  def dynamic_import(module_name, class_name):
126
151
  """
127
152
  Dynamically import a class from a module.
@@ -142,20 +167,17 @@ def dynamic_import(module_name, class_name):
142
167
  module = import_module(module_name)
143
168
  return getattr(module, class_name)
144
169
 
145
-
146
170
  def list_folders(path_to_folder):
147
171
  folders = [f for f in os.listdir(path_to_folder)
148
172
  if os.path.isdir(os.path.join(path_to_folder, f))]
149
173
  sorted_folders = sorted(folders, key=lambda x: x.lower())
150
174
  return sorted_folders
151
175
 
152
-
153
176
  def list_files(path_to_folder, extension):
154
177
  files = [f for f in os.listdir(path_to_folder)
155
178
  if f.endswith(extension)]
156
179
  return files
157
180
 
158
-
159
181
  def write_file(content: str, path_to_file: str, verbose: bool = True) -> None:
160
182
  """
161
183
  Write content to a file.
@@ -175,38 +197,59 @@ def write_file(content: str, path_to_file: str, verbose: bool = True) -> None:
175
197
  f.write(content)
176
198
  print(f"Saved content to {path_to_file}")
177
199
 
178
-
179
200
  def read_file(path_to_file):
180
201
  with open(path_to_file, 'r') as f:
181
202
  content = f.read()
182
203
  return content
183
204
 
184
-
185
- def download_example_data(path_to_destination):
205
+ def download_example_data(path_to_destination, include_templates=True, include_modfiles=True):
186
206
  """
187
- Download the examples subfolder from the DendroTweaks GitHub repository.
207
+ Download and extract specific folders from the DendroTweaks GitHub repository:
208
+ - examples/ <- from examples subfolder (always included)
209
+ - examples/Templates/ <- from src/dendrotweaks/biophys/default_templates (optional)
210
+ - examples/Default/ <- from src/dendrotweaks/biophys/default_mod (optional)
188
211
 
189
212
  Parameters
190
213
  ----------
191
214
  path_to_destination : str
192
- The path to the destination folder where the examples will be downloaded.
215
+ The path to the destination folder where the data will be downloaded and extracted.
216
+
217
+ include_templates : bool, optional
218
+ If True, also extract default_templates/ into examples/Templates/.
219
+
220
+ include_modfiles : bool, optional
221
+ If True, also extract default_mod/ into examples/Default/.
193
222
  """
194
223
  if not os.path.exists(path_to_destination):
195
224
  os.makedirs(path_to_destination)
196
225
 
197
226
  repo_url = "https://github.com/Poirazi-Lab/DendroTweaks/archive/refs/heads/main.zip"
198
- zip_path = os.path.join(path_to_destination, "examples.zip")
227
+ zip_path = os.path.join(path_to_destination, "dendrotweaks_repo.zip")
199
228
 
200
- print(f"Downloading examples from {repo_url}...")
229
+ print(f"Downloading data from {repo_url}...")
201
230
  urllib.request.urlretrieve(repo_url, zip_path)
202
231
 
203
- print(f"Extracting examples to {path_to_destination}")
232
+ print(f"Extracting relevant folders to {path_to_destination}...")
204
233
  with zipfile.ZipFile(zip_path, 'r') as zip_ref:
205
234
  for member in zip_ref.namelist():
235
+ target_path = None
236
+
237
+ # === Always extract examples/ folder ===
206
238
  if member.startswith("DendroTweaks-main/examples/"):
207
- # Extract the file with the correct path
208
- member_path = os.path.relpath(member, "DendroTweaks-main/examples")
209
- target_path = os.path.join(path_to_destination, member_path)
239
+ rel_path = os.path.relpath(member, "DendroTweaks-main/examples")
240
+ target_path = os.path.join(path_to_destination, rel_path)
241
+
242
+ # === Optionally extract Templates/ folder ===
243
+ elif include_templates and member.startswith("DendroTweaks-main/src/dendrotweaks/biophys/default_templates/"):
244
+ rel_path = os.path.relpath(member, "DendroTweaks-main/src/dendrotweaks/biophys/default_templates")
245
+ target_path = os.path.join(path_to_destination, "Templates", rel_path)
246
+
247
+ # === Optionally extract Default/ folder ===
248
+ elif include_modfiles and member.startswith("DendroTweaks-main/src/dendrotweaks/biophys/default_mod/"):
249
+ rel_path = os.path.relpath(member, "DendroTweaks-main/src/dendrotweaks/biophys/default_mod")
250
+ target_path = os.path.join(path_to_destination, "Default", rel_path)
251
+
252
+ if target_path:
210
253
  if member.endswith('/'):
211
254
  os.makedirs(target_path, exist_ok=True)
212
255
  else:
@@ -214,10 +257,8 @@ def download_example_data(path_to_destination):
214
257
  with zip_ref.open(member) as source, open(target_path, 'wb') as target:
215
258
  target.write(source.read())
216
259
 
217
- os.remove(zip_path) # Clean up the zip file
218
- print(f"Examples downloaded successfully to {path_to_destination}/.")
219
-
220
-
260
+ os.remove(zip_path)
261
+ print(f"Data downloaded and extracted successfully to {path_to_destination}/.")
221
262
 
222
263
  def apply_dark_theme():
223
264
  """
@@ -236,4 +277,71 @@ def apply_dark_theme():
236
277
  'ytick.color': 'white',
237
278
  'text.color': 'white',
238
279
  'axes.prop_cycle': plt.cycler(color=plt.cm.tab10.colors), # use standard matplotlib colors
239
- })
280
+ })
281
+
282
+ def mse(y_true, y_pred):
283
+ return np.mean((np.array(y_true) - np.array(y_pred)) ** 2)
284
+
285
+ def poly_fit(x, y, max_degree=6, tolerance=1e-6):
286
+ """
287
+ Fit a polynomial to the data and return the coefficients and predicted values.
288
+ """
289
+ for degree in range(max_degree + 1):
290
+ coeffs = np.polyfit(x, y, degree)
291
+ y_pred = np.polyval(coeffs, x)
292
+ if np.all(np.abs(np.array(y) - y_pred) < tolerance):
293
+ break
294
+ return coeffs, y_pred
295
+
296
+ def step_fit(x, y):
297
+ """
298
+ Fit a single step function with variable-width transition zone.
299
+ Returns (high_val, low_val, start, end), and predicted y-values.
300
+ """
301
+ x = np.array(x)
302
+ y = np.array(y)
303
+
304
+ sort_idx = np.argsort(x)
305
+ x = x[sort_idx]
306
+ y = y[sort_idx]
307
+
308
+ best_mse = float('inf')
309
+ best_params = None
310
+ best_pred = None
311
+
312
+ n = len(x)
313
+ for i in range(n - 1):
314
+ for j in range(i + 1, n):
315
+ start = x[i]
316
+ end = x[j]
317
+ inside = (x > start) & (x < end)
318
+ outside = ~inside
319
+
320
+ if not np.any(inside) or not np.any(outside):
321
+ continue
322
+
323
+ high_val = np.nanmean(y[inside])
324
+ low_val = np.nanmean(y[outside])
325
+
326
+ pred = np.where(inside, high_val, low_val)
327
+ score = mse(y, pred)
328
+
329
+ if score < best_mse:
330
+ best_mse = score
331
+ best_params = (start, end, low_val, high_val)
332
+ best_pred = pred
333
+
334
+ return best_params, best_pred
335
+
336
+ DEFAULT_FIT_MODELS = {
337
+ 'poly': {
338
+ 'fit': poly_fit,
339
+ 'score': mse,
340
+ 'complexity': lambda coeffs: len(coeffs) - 1 # degree of polynomial
341
+ },
342
+ 'step': {
343
+ 'fit': step_fit,
344
+ 'score': mse,
345
+ 'complexity': lambda params: 4
346
+ }
347
+ }
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dendrotweaks
3
- Version: 0.4.4
3
+ Version: 0.4.6
4
4
  Summary: A toolbox for exploring dendritic dynamics
5
5
  Home-page: https://dendrotweaks.dendrites.gr
6
6
  Author: Roman Makarov
@@ -1,32 +1,35 @@
1
- dendrotweaks/__init__.py,sha256=Z2JpwnO9nBPrkR1w0u_6gWnCJetIhTx_27PehYlfTRM,384
2
- dendrotweaks/model.py,sha256=IjmLrp-Ooh1WLdTb7Xg_9q2KUO7Xuokll26NQyVITlk,70965
3
- dendrotweaks/model_io.py,sha256=xwXKMcUle-Y0HoWFYVZu3G8v4pdQXmeaDfl2Xi65eHw,2137
4
- dendrotweaks/path_manager.py,sha256=dai5o6UA0nk-ubwKWRu4LFdDBO77zW_SsMf6k0MLBiI,8703
1
+ dendrotweaks/__init__.py,sha256=Dnklmfnnm_8cpcM-cKp-DUOhwFhG3wYFg9FGNORWbqg,384
2
+ dendrotweaks/model.py,sha256=nj_VjIRCK2z6wx-V-hUS4KDIuYkbg9wUrk-ux8twghA,38351
3
+ dendrotweaks/model_io.py,sha256=qY9qBs3bxsuvQSokPH_JUpT71KpYbIiLyjIDavTLtzA,27562
4
+ dendrotweaks/model_simulation.py,sha256=sXYWTgbBOWy0dZfxjmqc_YsOgfn5y5oAfGzLsUK6u9k,9958
5
+ dendrotweaks/path_manager.py,sha256=Bij2MMHqaBL-s9ckG0Nie5j735DTgApHRx3-ETMxUmA,8783
6
+ dendrotweaks/prerun.py,sha256=aMNe4xh14gztkw4oCAuiJEBIgckke9oNL8vQjOEQf8s,2451
5
7
  dendrotweaks/simulators.py,sha256=OscZ4H6z9YiNloDtMAgpPx9n2e-9WJyLEWtcSD1YZR8,7411
6
- dendrotweaks/utils.py,sha256=jaUJNb39Bsevg3WJByP56bO7CLj1wzlh-uGZl-lxi1I,7131
7
- dendrotweaks/analysis/__init__.py,sha256=SEYpoQ5iXiQXyHB20-IAdDHYI-7CR5GYFXIwr-O05Ug,858
8
- dendrotweaks/analysis/ephys_analysis.py,sha256=PqT3aBCuxQbvdm9jnXjlTJ3R5n7_Vwp4fLrHGgtfoWw,14362
8
+ dendrotweaks/utils.py,sha256=bZnxiQAUuc1BufBO7f3J2KGvyFCKQMDSFpfrM8_bVEo,10782
9
+ dendrotweaks/analysis/__init__.py,sha256=tDi4BHtW1fX5iiZVk1OM3gmLo69VFmUN8AEK_F8tDq4,927
10
+ dendrotweaks/analysis/ephys_analysis.py,sha256=v-T6IxQ48IoK6eEYcyImi9KoFrzAQU5n8k6kFyEAivc,17389
9
11
  dendrotweaks/analysis/morphometric_analysis.py,sha256=5zohjGssyx-wezI-yY3Q-kYM_wzAQLLFBJ9Xk950_JY,3571
10
12
  dendrotweaks/biophys/__init__.py,sha256=k0o2xwyoaJUb1lfO9OHtqxheNP6R-Ya5o0g-bJOdCZg,360
11
- dendrotweaks/biophys/distributions.py,sha256=XGczxBYJ0-vkIfXbfzvlIqlH9OpBuT9J95Kzyd2zL5A,10325
13
+ dendrotweaks/biophys/distributions.py,sha256=m3BHHQ-iHrRLQuimIHMY4NdJCTC9cc3JT2KvLaxn28M,10324
12
14
  dendrotweaks/biophys/groups.py,sha256=Q4kBIqL1-piIgrpsVq6ojinAWHiEJ1GzMjSAQ7Ni_E8,3212
13
- dendrotweaks/biophys/mechanisms.py,sha256=IxKcyYftEbupJWPqGAV20Ox5a3uPbnXs3gYSlC3z-E0,18520
15
+ dendrotweaks/biophys/mechanisms.py,sha256=ZlLTMLY53fmxwIfjEcN6Gg6S82SHXYY3EuLqiY6bGgg,18771
14
16
  dendrotweaks/biophys/default_mod/AMPA.mod,sha256=HY_pWzYvaSDV-w7qruenG2mnll8v79s40HFHjUCIi4U,980
15
17
  dendrotweaks/biophys/default_mod/AMPA_NMDA.mod,sha256=ztv2ePUiEQZ93-23FTkGO2DC91rehQuqo0NUIbHZ368,2318
16
18
  dendrotweaks/biophys/default_mod/CaDyn.mod,sha256=gwc69K_rxu2w_mV7CnOSOnVaCMc8Z-MfdBFf6lAj4kg,1298
17
19
  dendrotweaks/biophys/default_mod/GABAa.mod,sha256=jdGRid-Wzw4y9kHvq74oSMogLhSiS-Ac2DDaLOrxVi8,983
18
20
  dendrotweaks/biophys/default_mod/Leak.mod,sha256=u0lwMYGgl5kNZN5W4N6YHgRSeVxb-z2oM9fqou5rCV8,420
19
21
  dendrotweaks/biophys/default_mod/NMDA.mod,sha256=tT4Q5UPoeztXcQ45uZc2PUO3-8OkDLCmrS7WDsn1yQQ,1185
20
- dendrotweaks/biophys/default_mod/vecstim.mod,sha256=iSpJgR96O2Z3pLNUFIsZ7YJ529ncKUBaZqDJvA0_oV0,965
22
+ dendrotweaks/biophys/default_mod/vecstim.mod,sha256=dcDzI3H_WeB-bO9b3NQuF16CtCaUMymPrTayZGVwRhM,826
21
23
  dendrotweaks/biophys/default_templates/NEURON_template.py,sha256=MWSv2fLKGJxdt2zfSO0b74peuBC8U9j_S6AwM5URXts,14945
22
24
  dendrotweaks/biophys/default_templates/default.py,sha256=7HEbR2GJEOhgiox1QtZUEuHi5ihNAHDLsXQiQk980tI,2201
25
+ dendrotweaks/biophys/default_templates/jaxley.py,sha256=RFmWyLOwa0GCjkuaT-gBbjVrniu99DD3PPAs3J9os3E,4599
23
26
  dendrotweaks/biophys/default_templates/standard_channel.mod,sha256=sw80c-JyqfXNA7c7v7pZGLY-0MgFUvd3bPvJcAGXNSk,2923
24
27
  dendrotweaks/biophys/default_templates/template_jaxley.py,sha256=t-GsCSUyQ7rDoaLmyuWd9bIxB8W3bCqJdnikD59EVvI,3676
25
28
  dendrotweaks/biophys/default_templates/template_jaxley_new.py,sha256=I62KhnOYNV1bT-nPsDTxjIISYmDcso2X8rnsos28nYs,3631
26
29
  dendrotweaks/biophys/io/__init__.py,sha256=kkmQ4L0SatI3lWd3qE8KqOIKd7x3G2OnqAAW93sWWCU,575
27
30
  dendrotweaks/biophys/io/ast.py,sha256=7x_Kxz1qoQHZeIjovUNyVuKgUo4vAFKm-bd4hn9n1CI,6078
28
31
  dendrotweaks/biophys/io/code_generators.py,sha256=RX0nw5-0CyWR3KOrTZUabKuPAQg2ysQ_nQi2iu9TxiE,11978
29
- dendrotweaks/biophys/io/converter.py,sha256=5yrPJhyZbuwV7tTGoacnNOvmRdVgXPIyGfiR0PyOVzg,3371
32
+ dendrotweaks/biophys/io/converter.py,sha256=-BfVFahiwlPLfM7MQiuSS8CyfZ5-PDtAHzya8a8dr3k,3567
30
33
  dendrotweaks/biophys/io/factories.py,sha256=j1Hi2u-NTFFL8ElRYlgGVNHRcfKWH6o5GfKvraMTlwM,5020
31
34
  dendrotweaks/biophys/io/grammar.py,sha256=TJLTDlr8Ajp3J9DJ4IvulOCcpUkYr7HnoI0TGnNuEPc,11677
32
35
  dendrotweaks/biophys/io/loader.py,sha256=Wv9ZkEDyA3MkCdV0sMeRnBffg2WAI7yTV3r6C412GiY,6378
@@ -34,13 +37,13 @@ dendrotweaks/biophys/io/parser.py,sha256=boT27lFrn5LYrJnkZFs0SwrZZrkSkwO8efqGPJ4
34
37
  dendrotweaks/biophys/io/reader.py,sha256=JWm5WM9illvSfDkhWEmWBcj8Y7PSi8zeZX9j1ARUHVU,6576
35
38
  dendrotweaks/morphology/__init__.py,sha256=JwXmSmdn9e_jqslITEdiU9kWvzxcxT9Aw_kUkXLbm5o,353
36
39
  dendrotweaks/morphology/domains.py,sha256=l57KVR5eo1LlH_fCd1AOMiG_SsYLBPBTGQ5R78BHfdM,2545
37
- dendrotweaks/morphology/point_trees.py,sha256=5dUPaQXYPdJbWoD3pFI2DV2XnuFRhB5d0wTBlfmmIeI,21600
40
+ dendrotweaks/morphology/point_trees.py,sha256=aZl5p6FGn6mph9xNo-3L_HC7mIvLhvi3BLJuhuihssk,21605
38
41
  dendrotweaks/morphology/sec_trees.py,sha256=eKLC-yNhsn_rPdTE7w7p6STa1onYkBTGcpBKBpEWZUI,36957
39
42
  dendrotweaks/morphology/seg_trees.py,sha256=-XeSJuD7ZixBJYQDzvmSEiNvOWbVmX_DanyAPkkR-NA,4042
40
43
  dendrotweaks/morphology/trees.py,sha256=NrNvPMR-U0clt63eqwVJqU0H8NJgY53QGA_BkdcwkQI,16033
41
44
  dendrotweaks/morphology/io/__init__.py,sha256=gAZqZdf5VKPb6ksK8Lwt7MbTAq8TDP8uq3Vs_ebNFEY,324
42
- dendrotweaks/morphology/io/factories.py,sha256=DCE37QCloiYVro5HGihJbxPz91BB3y5NNf-oRaQ-M2g,6383
43
- dendrotweaks/morphology/io/reader.py,sha256=hW3c541WtG1rNag_YreEhvrLzm8-OTtw0fQREeHDthM,1913
45
+ dendrotweaks/morphology/io/factories.py,sha256=YkTCXWuJ6bwUW0kjcV2TSzu43EvkE8N5yC3q-B02kxc,6372
46
+ dendrotweaks/morphology/io/reader.py,sha256=ApfDdA-L61HLIqGbjOwiIntzO4P0_x3n4wYt8lsQzyU,2127
44
47
  dendrotweaks/morphology/io/validation.py,sha256=lVkYw9y9yG5QpRh_N0YQ3FbZwuSUsQfSqJTMumMcDdc,7872
45
48
  dendrotweaks/morphology/reduce/__init__.py,sha256=p6Mg3KDHxTt8S4DtI0m7L7MqV6dS2pdIYAwB7B-toVw,921
46
49
  dendrotweaks/morphology/reduce/reduce.py,sha256=5czZDrG3xsvHn3c_tbYhUOlXgST989-RS-ntbhlvvA0,6361
@@ -49,8 +52,8 @@ dendrotweaks/stimuli/__init__.py,sha256=bFfSEZhCVpwOVEBgLe65iiY3SdpjKPhyLemC1z5O
49
52
  dendrotweaks/stimuli/iclamps.py,sha256=NjkhhwZKJR1f_g3N9BVxMVoO9ubBk5WkQ6h9Bnf9xgA,1681
50
53
  dendrotweaks/stimuli/populations.py,sha256=vq2NUOaxaltUwlcT7wuCe8z1JWc8rk6HfPmfEd1kK68,8335
51
54
  dendrotweaks/stimuli/synapses.py,sha256=g4MgWTske2TZ2i9FIIOE8-KXNx_3dWa3zEhB2rcqYig,5470
52
- dendrotweaks-0.4.4.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
53
- dendrotweaks-0.4.4.dist-info/METADATA,sha256=2eqzr1zuEY9kyPT0X0ggJ5m_lAqV2_sQKEtSX9TA9PQ,2740
54
- dendrotweaks-0.4.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
55
- dendrotweaks-0.4.4.dist-info/top_level.txt,sha256=OzT_2BSI5j5zxC447K6Y-0W-GHbued7iX-_hFGAKMxY,13
56
- dendrotweaks-0.4.4.dist-info/RECORD,,
55
+ dendrotweaks-0.4.6.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
56
+ dendrotweaks-0.4.6.dist-info/METADATA,sha256=OXESFIO9zc6MW9dmNJLg4dY-DrPqF6haGWPf8ut2kSg,2740
57
+ dendrotweaks-0.4.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
58
+ dendrotweaks-0.4.6.dist-info/top_level.txt,sha256=OzT_2BSI5j5zxC447K6Y-0W-GHbued7iX-_hFGAKMxY,13
59
+ dendrotweaks-0.4.6.dist-info/RECORD,,