teareduce 0.5.3__py3-none-any.whl → 0.5.5__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.
- teareduce/cleanest/__main__.py +57 -8
- teareduce/cleanest/centerchildparent.py +46 -0
- teareduce/cleanest/cleanest.py +16 -19
- teareduce/cleanest/cosmicraycleanerapp.py +264 -168
- teareduce/cleanest/definitions.py +30 -29
- teareduce/cleanest/imagedisplay.py +8 -9
- teareduce/cleanest/interpolation_a.py +5 -9
- teareduce/cleanest/interpolationeditor.py +156 -35
- teareduce/cleanest/modalprogressbar.py +182 -0
- teareduce/cleanest/parametereditor.py +98 -76
- teareduce/cleanest/reviewcosmicray.py +99 -66
- teareduce/version.py +1 -1
- {teareduce-0.5.3.dist-info → teareduce-0.5.5.dist-info}/METADATA +1 -1
- {teareduce-0.5.3.dist-info → teareduce-0.5.5.dist-info}/RECORD +18 -16
- {teareduce-0.5.3.dist-info → teareduce-0.5.5.dist-info}/WHEEL +0 -0
- {teareduce-0.5.3.dist-info → teareduce-0.5.5.dist-info}/entry_points.txt +0 -0
- {teareduce-0.5.3.dist-info → teareduce-0.5.5.dist-info}/licenses/LICENSE.txt +0 -0
- {teareduce-0.5.3.dist-info → teareduce-0.5.5.dist-info}/top_level.txt +0 -0
|
@@ -19,6 +19,7 @@ from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolb
|
|
|
19
19
|
import numpy as np
|
|
20
20
|
from rich import print
|
|
21
21
|
|
|
22
|
+
from .centerchildparent import center_on_parent
|
|
22
23
|
from .definitions import MAX_PIXEL_DISTANCE_TO_CR
|
|
23
24
|
from .imagedisplay import ImageDisplay
|
|
24
25
|
from .interpolation_a import interpolation_a
|
|
@@ -30,15 +31,27 @@ from ..sliceregion import SliceRegion2D
|
|
|
30
31
|
from ..zscale import zscale
|
|
31
32
|
|
|
32
33
|
import matplotlib
|
|
34
|
+
|
|
33
35
|
matplotlib.use("TkAgg")
|
|
34
36
|
|
|
35
37
|
|
|
36
38
|
class ReviewCosmicRay(ImageDisplay):
|
|
37
39
|
"""Class to review suspected cosmic ray pixels."""
|
|
38
40
|
|
|
39
|
-
def __init__(
|
|
40
|
-
|
|
41
|
-
|
|
41
|
+
def __init__(
|
|
42
|
+
self,
|
|
43
|
+
root,
|
|
44
|
+
data,
|
|
45
|
+
auxdata,
|
|
46
|
+
cleandata_lacosmic,
|
|
47
|
+
cr_labels,
|
|
48
|
+
num_features,
|
|
49
|
+
first_cr_index=1,
|
|
50
|
+
single_cr=False,
|
|
51
|
+
last_dilation=None,
|
|
52
|
+
last_npoints=None,
|
|
53
|
+
last_degree=None,
|
|
54
|
+
):
|
|
42
55
|
"""Initialize the review window.
|
|
43
56
|
|
|
44
57
|
Parameters
|
|
@@ -133,9 +146,13 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
133
146
|
self.root.title("Review Cosmic Rays")
|
|
134
147
|
self.auxdata = auxdata
|
|
135
148
|
if self.auxdata is not None:
|
|
136
|
-
self.root.geometry("
|
|
149
|
+
# self.root.geometry("1000x700+100+100") # This does not work in Fedora
|
|
150
|
+
self.root.minsize(1000, 700)
|
|
137
151
|
else:
|
|
138
|
-
self.root.geometry("800x700+100+100")
|
|
152
|
+
# self.root.geometry("800x700+100+100") # This does not work in Fedora
|
|
153
|
+
self.root.minsize(800, 700)
|
|
154
|
+
self.root.update_idletasks()
|
|
155
|
+
self.root.geometry("+100+100")
|
|
139
156
|
self.data = data
|
|
140
157
|
self.cleandata_lacosmic = cleandata_lacosmic
|
|
141
158
|
self.data_original = data.copy()
|
|
@@ -149,22 +166,25 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
149
166
|
self.last_dilation = last_dilation
|
|
150
167
|
# Make a copy of the original labels to allow pixel re-marking
|
|
151
168
|
self.cr_labels_original = self.cr_labels.copy()
|
|
152
|
-
|
|
153
|
-
print(f"Number of cosmic
|
|
169
|
+
sdum = str(np.sum(self.cr_labels > 0))
|
|
170
|
+
print(f"Number of cosmic ray pixels detected..: {sdum}")
|
|
171
|
+
print(f"Number of cosmic rays (grouped pixels): {self.num_features:>{len(sdum)}}")
|
|
154
172
|
if self.num_features == 0:
|
|
155
|
-
print(
|
|
173
|
+
print("No CR hits found!")
|
|
156
174
|
else:
|
|
157
175
|
self.cr_index = first_cr_index
|
|
158
176
|
self.single_cr = single_cr
|
|
159
177
|
self.create_widgets()
|
|
178
|
+
center_on_parent(child=self.root, parent=self.root.master, offset_x=50, offset_y=50)
|
|
160
179
|
|
|
161
180
|
def create_widgets(self):
|
|
162
181
|
"""Create the GUI widgets for the review window."""
|
|
163
182
|
# Row 1 of buttons
|
|
164
183
|
self.button_frame1 = tk.Frame(self.root)
|
|
165
184
|
self.button_frame1.pack(pady=5)
|
|
166
|
-
self.ndeg_label = tk.Button(
|
|
167
|
-
|
|
185
|
+
self.ndeg_label = tk.Button(
|
|
186
|
+
self.button_frame1, text=f"Npoints={self.npoints}, Degree={self.degree}", command=self.set_ndeg
|
|
187
|
+
)
|
|
168
188
|
self.ndeg_label.pack(side=tk.LEFT, padx=5)
|
|
169
189
|
self.remove_crosses_button = tk.Button(self.button_frame1, text="remove all x's", command=self.remove_crosses)
|
|
170
190
|
self.remove_crosses_button.pack(side=tk.LEFT, padx=5)
|
|
@@ -190,14 +210,13 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
190
210
|
# the function is trying to deactivate the buttons before they are created, which
|
|
191
211
|
# would lead to an error; in addition, since I have two buttons calling the same function
|
|
192
212
|
# with different arguments, using lambda allows to differentiate them)
|
|
193
|
-
self.interp_s_button = tk.Button(
|
|
194
|
-
|
|
213
|
+
self.interp_s_button = tk.Button(
|
|
214
|
+
self.button_frame2, text="[s]urface interp.", command=lambda: self.interp_a("surface")
|
|
215
|
+
)
|
|
195
216
|
self.interp_s_button.pack(side=tk.LEFT, padx=5)
|
|
196
|
-
self.interp_d_button = tk.Button(self.button_frame2, text="me[d]ian",
|
|
197
|
-
command=lambda: self.interp_a('median'))
|
|
217
|
+
self.interp_d_button = tk.Button(self.button_frame2, text="me[d]ian", command=lambda: self.interp_a("median"))
|
|
198
218
|
self.interp_d_button.pack(side=tk.LEFT, padx=5)
|
|
199
|
-
self.interp_m_button = tk.Button(self.button_frame2, text="[m]ean",
|
|
200
|
-
command=lambda: self.interp_a('mean'))
|
|
219
|
+
self.interp_m_button = tk.Button(self.button_frame2, text="[m]ean", command=lambda: self.interp_a("mean"))
|
|
201
220
|
self.interp_m_button.pack(side=tk.LEFT, padx=5)
|
|
202
221
|
self.interp_l_button = tk.Button(self.button_frame2, text="[l]acosmic", command=self.use_lacosmic)
|
|
203
222
|
self.interp_l_button.pack(side=tk.LEFT, padx=5)
|
|
@@ -225,10 +244,9 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
225
244
|
|
|
226
245
|
# Figure
|
|
227
246
|
if self.auxdata is not None:
|
|
228
|
-
self.fig, (self.ax_aux, self.ax) = plt.subplots(
|
|
229
|
-
ncols=2, figsize=(10, 5), constrained_layout=True)
|
|
247
|
+
self.fig, (self.ax_aux, self.ax) = plt.subplots(ncols=2, figsize=(11, 5.5), constrained_layout=True)
|
|
230
248
|
else:
|
|
231
|
-
self.fig, self.ax = plt.subplots(figsize=(8, 5), constrained_layout=True)
|
|
249
|
+
self.fig, self.ax = plt.subplots(figsize=(8, 5.5), constrained_layout=True)
|
|
232
250
|
self.canvas = FigureCanvasTkAgg(self.fig, master=self.root)
|
|
233
251
|
self.canvas.get_tk_widget().pack(padx=5, pady=5)
|
|
234
252
|
# The next two instructions prevent a segmentation fault when pressing "q"
|
|
@@ -236,7 +254,8 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
236
254
|
self.canvas.mpl_connect("key_press_event", self.on_key)
|
|
237
255
|
self.canvas.mpl_connect("button_press_event", self.on_click)
|
|
238
256
|
self.canvas_widget = self.canvas.get_tk_widget()
|
|
239
|
-
self.canvas_widget.pack(fill=tk.BOTH, expand=True)
|
|
257
|
+
# self.canvas_widget.pack(fill=tk.BOTH, expand=True) # This does not work in Fedora
|
|
258
|
+
self.canvas_widget.pack(expand=True)
|
|
240
259
|
|
|
241
260
|
# Matplotlib toolbar
|
|
242
261
|
self.toolbar_frame = tk.Frame(self.root)
|
|
@@ -258,16 +277,17 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
258
277
|
ycr_list, xcr_list = np.where(self.cr_labels == self.cr_index)
|
|
259
278
|
ycr_list_original, xcr_list_original = np.where(self.cr_labels_original == self.cr_index)
|
|
260
279
|
if self.first_plot:
|
|
261
|
-
print(
|
|
262
|
-
|
|
263
|
-
|
|
280
|
+
print(
|
|
281
|
+
f"Cosmic ray {self.cr_index}: "
|
|
282
|
+
f"Number of pixels = {len(xcr_list)}, "
|
|
283
|
+
f"Centroid = ({np.mean(xcr_list)+1:.2f}, {np.mean(ycr_list)+1:.2f})"
|
|
284
|
+
)
|
|
264
285
|
# Use original positions to define the region to display in order
|
|
265
286
|
# to avoid image shifts when some pixels are unmarked or new ones are marked
|
|
266
287
|
i0 = int(np.mean(ycr_list_original) + 0.5)
|
|
267
288
|
j0 = int(np.mean(xcr_list_original) + 0.5)
|
|
268
289
|
max_distance_from_center = np.max(
|
|
269
|
-
[np.max(np.abs(ycr_list_original - i0)),
|
|
270
|
-
np.max(np.abs(xcr_list_original - j0))]
|
|
290
|
+
[np.max(np.abs(ycr_list_original - i0)), np.max(np.abs(xcr_list_original - j0))]
|
|
271
291
|
)
|
|
272
292
|
semiwidth = int(np.max([max_distance_from_center, MAX_PIXEL_DISTANCE_TO_CR]))
|
|
273
293
|
jmin = j0 - semiwidth if j0 - semiwidth >= 0 else 0
|
|
@@ -283,22 +303,35 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
283
303
|
imax = np.min([2 * semiwidth, self.data.shape[0] - 1])
|
|
284
304
|
elif imax == self.data.shape[0] - 1:
|
|
285
305
|
imin = np.max([0, self.data.shape[0] - 1 - 2 * semiwidth])
|
|
286
|
-
self.region = SliceRegion2D(f
|
|
306
|
+
self.region = SliceRegion2D(f"[{jmin+1}:{jmax+1}, {imin+1}:{imax+1}]", mode="fits").python
|
|
287
307
|
self.ax.clear()
|
|
288
308
|
vmin = self.get_vmin()
|
|
289
309
|
vmax = self.get_vmax()
|
|
290
|
-
xlabel =
|
|
291
|
-
ylabel =
|
|
292
|
-
self.image, _, _ = imshow(
|
|
293
|
-
|
|
294
|
-
|
|
310
|
+
xlabel = "X pixel (from 1 to NAXIS1)"
|
|
311
|
+
ylabel = "Y pixel (from 1 to NAXIS2)"
|
|
312
|
+
self.image, _, _ = imshow(
|
|
313
|
+
self.fig,
|
|
314
|
+
self.ax,
|
|
315
|
+
self.data[self.region],
|
|
316
|
+
colorbar=False,
|
|
317
|
+
xlabel=xlabel,
|
|
318
|
+
ylabel=ylabel,
|
|
319
|
+
vmin=vmin,
|
|
320
|
+
vmax=vmax,
|
|
321
|
+
)
|
|
295
322
|
self.image.set_extent([jmin + 0.5, jmax + 1.5, imin + 0.5, imax + 1.5])
|
|
296
323
|
if self.auxdata is not None:
|
|
297
324
|
self.ax_aux.clear()
|
|
298
|
-
self.image_aux, _, _ = imshow(
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
325
|
+
self.image_aux, _, _ = imshow(
|
|
326
|
+
self.fig,
|
|
327
|
+
self.ax_aux,
|
|
328
|
+
self.auxdata[self.region],
|
|
329
|
+
colorbar=False,
|
|
330
|
+
xlabel=xlabel,
|
|
331
|
+
ylabel=ylabel,
|
|
332
|
+
vmin=vmin,
|
|
333
|
+
vmax=vmax,
|
|
334
|
+
)
|
|
302
335
|
self.image_aux.set_extent([jmin + 0.5, jmax + 1.5, imin + 0.5, imax + 1.5])
|
|
303
336
|
self.ax_aux.set_title("Auxiliary data")
|
|
304
337
|
# Overplot cosmic ray pixels
|
|
@@ -308,10 +341,10 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
308
341
|
xcr += 1 # from index to pixel
|
|
309
342
|
ycr += 1 # from index to pixel
|
|
310
343
|
if cleaned:
|
|
311
|
-
self.ax.plot(xcr, ycr,
|
|
344
|
+
self.ax.plot(xcr, ycr, "C1o", markersize=4)
|
|
312
345
|
else:
|
|
313
|
-
self.ax.plot([xcr - 0.5, xcr + 0.5], [ycr + 0.5, ycr - 0.5],
|
|
314
|
-
self.ax.plot([xcr - 0.5, xcr + 0.5], [ycr - 0.5, ycr + 0.5],
|
|
346
|
+
self.ax.plot([xcr - 0.5, xcr + 0.5], [ycr + 0.5, ycr - 0.5], "r-")
|
|
347
|
+
self.ax.plot([xcr - 0.5, xcr + 0.5], [ycr - 0.5, ycr + 0.5], "r-")
|
|
315
348
|
self.ax.set_xlim(xlim)
|
|
316
349
|
self.ax.set_ylim(ylim)
|
|
317
350
|
self.ax.set_title(f"Cosmic ray #{self.cr_index}/{self.num_features}")
|
|
@@ -321,12 +354,12 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
321
354
|
|
|
322
355
|
def set_ndeg(self):
|
|
323
356
|
"""Set the number of points and degree for interpolation."""
|
|
324
|
-
new_npoints = simpledialog.askinteger("Set Npoints", "Enter Npoints:",
|
|
325
|
-
initialvalue=self.npoints, minvalue=1)
|
|
357
|
+
new_npoints = simpledialog.askinteger("Set Npoints", "Enter Npoints:", initialvalue=self.npoints, minvalue=1)
|
|
326
358
|
if new_npoints is None:
|
|
327
359
|
return
|
|
328
|
-
new_degree = simpledialog.askinteger(
|
|
329
|
-
|
|
360
|
+
new_degree = simpledialog.askinteger(
|
|
361
|
+
"Set degree", "Enter Degree (min=0):", initialvalue=self.degree, minvalue=0
|
|
362
|
+
)
|
|
330
363
|
if new_degree is None:
|
|
331
364
|
return
|
|
332
365
|
self.degree = new_degree
|
|
@@ -357,14 +390,14 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
357
390
|
cr_labels=self.cr_labels,
|
|
358
391
|
cr_index=self.cr_index,
|
|
359
392
|
npoints=self.npoints,
|
|
360
|
-
degree=self.degree
|
|
393
|
+
degree=self.degree,
|
|
361
394
|
)
|
|
362
395
|
if interpolation_performed:
|
|
363
396
|
self.num_cr_cleaned += 1
|
|
364
397
|
self.set_buttons_after_cleaning_cr()
|
|
365
398
|
self.update_display(cleaned=interpolation_performed)
|
|
366
399
|
if len(xfit_all) > 0:
|
|
367
|
-
self.ax.plot(np.array(xfit_all) + 1, np.array(yfit_all) + 1,
|
|
400
|
+
self.ax.plot(np.array(xfit_all) + 1, np.array(yfit_all) + 1, "mo", markersize=4) # +1: from index to pixel
|
|
368
401
|
self.canvas.draw_idle()
|
|
369
402
|
|
|
370
403
|
def interp_y(self):
|
|
@@ -379,14 +412,14 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
379
412
|
cr_labels=self.cr_labels,
|
|
380
413
|
cr_index=self.cr_index,
|
|
381
414
|
npoints=self.npoints,
|
|
382
|
-
degree=self.degree
|
|
415
|
+
degree=self.degree,
|
|
383
416
|
)
|
|
384
417
|
if interpolation_performed:
|
|
385
418
|
self.num_cr_cleaned += 1
|
|
386
419
|
self.set_buttons_after_cleaning_cr()
|
|
387
420
|
self.update_display(cleaned=interpolation_performed)
|
|
388
421
|
if len(xfit_all) > 0:
|
|
389
|
-
self.ax.plot(np.array(xfit_all) + 1, np.array(yfit_all) + 1,
|
|
422
|
+
self.ax.plot(np.array(xfit_all) + 1, np.array(yfit_all) + 1, "mo", markersize=4) # +1: from index to pixel
|
|
390
423
|
self.canvas.draw_idle()
|
|
391
424
|
|
|
392
425
|
def interp_a(self, method):
|
|
@@ -404,14 +437,14 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
404
437
|
cr_labels=self.cr_labels,
|
|
405
438
|
cr_index=self.cr_index,
|
|
406
439
|
npoints=self.npoints,
|
|
407
|
-
method=method
|
|
440
|
+
method=method,
|
|
408
441
|
)
|
|
409
442
|
if interpolation_performed:
|
|
410
443
|
self.num_cr_cleaned += 1
|
|
411
444
|
self.set_buttons_after_cleaning_cr()
|
|
412
445
|
self.update_display(cleaned=interpolation_performed)
|
|
413
446
|
if len(xfit_all) > 0:
|
|
414
|
-
self.ax.plot(np.array(xfit_all) + 1, np.array(yfit_all) + 1,
|
|
447
|
+
self.ax.plot(np.array(xfit_all) + 1, np.array(yfit_all) + 1, "mo", markersize=4) # +1: from index to pixel
|
|
415
448
|
self.canvas.draw_idle()
|
|
416
449
|
|
|
417
450
|
def use_lacosmic(self):
|
|
@@ -510,39 +543,39 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
510
543
|
|
|
511
544
|
def on_key(self, event):
|
|
512
545
|
"""Handle key press events."""
|
|
513
|
-
if event.key ==
|
|
546
|
+
if event.key == "q":
|
|
514
547
|
pass # Ignore the "q" key to prevent closing the window
|
|
515
|
-
elif event.key ==
|
|
548
|
+
elif event.key == "r":
|
|
516
549
|
if self.restore_cr_button.cget("state") != "disabled":
|
|
517
550
|
self.restore_cr()
|
|
518
|
-
elif event.key ==
|
|
551
|
+
elif event.key == "x":
|
|
519
552
|
if self.interp_x_button.cget("state") != "disabled":
|
|
520
553
|
self.interp_x()
|
|
521
|
-
elif event.key ==
|
|
554
|
+
elif event.key == "y":
|
|
522
555
|
if self.interp_y_button.cget("state") != "disabled":
|
|
523
556
|
self.interp_y()
|
|
524
|
-
elif event.key ==
|
|
557
|
+
elif event.key == "s":
|
|
525
558
|
if self.interp_s_button.cget("state") != "disabled":
|
|
526
|
-
self.interp_a(
|
|
527
|
-
elif event.key ==
|
|
559
|
+
self.interp_a("surface")
|
|
560
|
+
elif event.key == "d":
|
|
528
561
|
if self.interp_d_button.cget("state") != "disabled":
|
|
529
|
-
self.interp_a(
|
|
530
|
-
elif event.key ==
|
|
562
|
+
self.interp_a("median")
|
|
563
|
+
elif event.key == "m":
|
|
531
564
|
if self.interp_m_button.cget("state") != "disabled":
|
|
532
|
-
self.interp_a(
|
|
533
|
-
elif event.key ==
|
|
565
|
+
self.interp_a("mean")
|
|
566
|
+
elif event.key == "l":
|
|
534
567
|
if self.interp_l_button.cget("state") != "disabled":
|
|
535
568
|
self.use_lacosmic()
|
|
536
|
-
elif event.key ==
|
|
569
|
+
elif event.key == "a":
|
|
537
570
|
if self.interp_aux_button.cget("state") != "disabled":
|
|
538
571
|
self.use_auxdata()
|
|
539
|
-
elif event.key ==
|
|
572
|
+
elif event.key == "right" or event.key == "c":
|
|
540
573
|
self.continue_cr()
|
|
541
|
-
elif event.key ==
|
|
574
|
+
elif event.key == ",":
|
|
542
575
|
self.set_minmax()
|
|
543
|
-
elif event.key ==
|
|
576
|
+
elif event.key == "/":
|
|
544
577
|
self.set_zscale()
|
|
545
|
-
elif event.key ==
|
|
578
|
+
elif event.key == "e":
|
|
546
579
|
self.exit_review()
|
|
547
580
|
return # important: do not remove (to avoid errors)
|
|
548
581
|
else:
|
|
@@ -552,8 +585,8 @@ class ReviewCosmicRay(ImageDisplay):
|
|
|
552
585
|
"""Handle mouse click events on the image."""
|
|
553
586
|
if event.inaxes == self.ax:
|
|
554
587
|
x, y = event.xdata, event.ydata
|
|
555
|
-
ix = int(x+0.5) - 1 # from pixel to index
|
|
556
|
-
iy = int(y+0.5) - 1 # from pixel to index
|
|
588
|
+
ix = int(x + 0.5) - 1 # from pixel to index
|
|
589
|
+
iy = int(y + 0.5) - 1 # from pixel to index
|
|
557
590
|
if int(self.cr_labels[iy, ix]) == self.cr_index:
|
|
558
591
|
self.cr_labels[iy, ix] = 0
|
|
559
592
|
print(f"Pixel ({ix+1}, {iy+1}) unmarked as cosmic ray.")
|
teareduce/version.py
CHANGED
|
@@ -15,33 +15,35 @@ teareduce/sdistortion.py,sha256=5ZsZn4vD5Sw2aoqO8-NIOH7H89Zmh7ZDkow6YbAotHU,5916
|
|
|
15
15
|
teareduce/simulateccdexposure.py,sha256=cdbpca6GVuM3d7R1LGzlIZZvjTq_jzrlkk_Cli7aouQ,24636
|
|
16
16
|
teareduce/sliceregion.py,sha256=Jdf8XvmGaY_vaY1cneTaRtSOYPxpUsJm9cXJDDMa0YM,18626
|
|
17
17
|
teareduce/statsummary.py,sha256=VTNAnBV8z6suqiyB2Lhw3YjUUOjlmwUPX3enkOKRF54,5422
|
|
18
|
-
teareduce/version.py,sha256=
|
|
18
|
+
teareduce/version.py,sha256=x8qFVHj0LWtGzf-qBtcwzyAnbALRdsIJ4c4C_GQISJc,419
|
|
19
19
|
teareduce/wavecal.py,sha256=2MewWz5Y3ms41c305UtWOM_LaLNdk1mugDXCtzf-fSw,68586
|
|
20
20
|
teareduce/write_array_to_fits.py,sha256=kWDrEH9coJ1yIu56oQJpWtDqJL4c8HGmssE9jle4e94,617
|
|
21
21
|
teareduce/zscale.py,sha256=SDgmcDD2N5GvDn46JADCgTQJPBF_N_jSKMHoeTz9Nsw,1152
|
|
22
22
|
teareduce/cleanest/__init__.py,sha256=3O-eptEAQareN504tLALMrJVQPGCuBx7YTfQGqMKjmc,205
|
|
23
|
-
teareduce/cleanest/__main__.py,sha256=
|
|
24
|
-
teareduce/cleanest/
|
|
25
|
-
teareduce/cleanest/
|
|
26
|
-
teareduce/cleanest/
|
|
23
|
+
teareduce/cleanest/__main__.py,sha256=_wXGgwq62ete5-DlNDsKkZP0kATAVFVwTVrG9EspkU8,3298
|
|
24
|
+
teareduce/cleanest/centerchildparent.py,sha256=wHxOvNrrQ-KBLZAbtQ9bJAxYhGOzqYBF4LgdIQk7UF8,1285
|
|
25
|
+
teareduce/cleanest/cleanest.py,sha256=hDC_3jF9ovHCX8IRAPe9eEGFWt_LeVI5rzS7atK7oWI,5025
|
|
26
|
+
teareduce/cleanest/cosmicraycleanerapp.py,sha256=C-lGOREVXrlaqJsjEuJ66xVNx0z8axXq5f5GQh9dpMA,41226
|
|
27
|
+
teareduce/cleanest/definitions.py,sha256=HLv41cuhUOUyEicRHea0LRTv4Wagm24miSxFt4cZN3g,2546
|
|
27
28
|
teareduce/cleanest/dilatemask.py,sha256=I5tHAv5VEO6V0Wed8Ar20uLt4F9P-tgjmLL5BAaFvgM,1276
|
|
28
29
|
teareduce/cleanest/find_closest_true.py,sha256=mWdIvhipzAXDRKfePDrP7f0lP4U48cckpHiKwiB4jHI,1320
|
|
29
|
-
teareduce/cleanest/imagedisplay.py,sha256=
|
|
30
|
-
teareduce/cleanest/interpolation_a.py,sha256=
|
|
30
|
+
teareduce/cleanest/imagedisplay.py,sha256=820Vn-Q0bJyHicOBsxDmfAZxuGOFepEEsm0LTxlPJjc,5848
|
|
31
|
+
teareduce/cleanest/interpolation_a.py,sha256=zE4VIrC41vapf0Vx9qmh1oacw2qkJwcuMnV3JpSDW8Y,4007
|
|
31
32
|
teareduce/cleanest/interpolation_x.py,sha256=D5hKbobT6lJk18XktP3PXhzEN12zqed6U18yfQ-reLQ,3744
|
|
32
33
|
teareduce/cleanest/interpolation_y.py,sha256=O6yw5nKKlTdV6qsP1Ku6CwGhXB6o3j0_YQirXyILi8c,3759
|
|
33
|
-
teareduce/cleanest/interpolationeditor.py,sha256=
|
|
34
|
-
teareduce/cleanest/
|
|
35
|
-
teareduce/cleanest/
|
|
34
|
+
teareduce/cleanest/interpolationeditor.py,sha256=EksuNwKOM79MyGlAgxb9j-v7pIFXV8QOcyZDLVQlQjU,13221
|
|
35
|
+
teareduce/cleanest/modalprogressbar.py,sha256=9anz3js_y_9JLjPyA7XxEsLpVwuMN_CTlnQnhf7m3uo,6355
|
|
36
|
+
teareduce/cleanest/parametereditor.py,sha256=IdaX6_VPicwnYw3dvRA0tKoTZYb6Gp-AZB5ksFClv1o,13390
|
|
37
|
+
teareduce/cleanest/reviewcosmicray.py,sha256=_qO9ifkAMqB4Wuvq2wIYZ8_DUniB2lWcxn9l404hXnY,28210
|
|
36
38
|
teareduce/cookbook/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
39
|
teareduce/cookbook/get_cookbook_file.py,sha256=vde-iNii2lm1QII8GmLRsFsKNxkdsd7njCBE-8Z7io0,1088
|
|
38
40
|
teareduce/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
41
|
teareduce/tests/test_cleanest.py,sha256=0uiun1Uloh3rt5ppkv1aG04KUbOJvYZ9C5BvqNizLuI,5562
|
|
40
42
|
teareduce/tests/test_sliceregion.py,sha256=S7Zoh2eEBFIEbfsXgWBEMCf7pottjw2oLhqlZJQkAwg,3785
|
|
41
43
|
teareduce/tests/test_version.py,sha256=mKLnbXyvVNc1pATq5PxR8qeoFMPAFL_GilFV6IHLOi0,172
|
|
42
|
-
teareduce-0.5.
|
|
43
|
-
teareduce-0.5.
|
|
44
|
-
teareduce-0.5.
|
|
45
|
-
teareduce-0.5.
|
|
46
|
-
teareduce-0.5.
|
|
47
|
-
teareduce-0.5.
|
|
44
|
+
teareduce-0.5.5.dist-info/licenses/LICENSE.txt,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
|
45
|
+
teareduce-0.5.5.dist-info/METADATA,sha256=MIifKnlyWPEQyuxUG3OaqqRnydUaE7JYhcBIB-XDu7Q,3113
|
|
46
|
+
teareduce-0.5.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
47
|
+
teareduce-0.5.5.dist-info/entry_points.txt,sha256=6yBvig5jTL2ugqz5SF767AiszzrHKGRASsX1II84kqA,66
|
|
48
|
+
teareduce-0.5.5.dist-info/top_level.txt,sha256=7OkwtX9zNRkGJ7ACgjk4ESgC74qUYcS5O2qcO0v-Si4,10
|
|
49
|
+
teareduce-0.5.5.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|