microlive 1.0.17__py3-none-any.whl → 1.0.18__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.
microlive/__init__.py CHANGED
@@ -23,7 +23,7 @@ Authors:
23
23
  Nathan L. Nowling, Brian Munsky, Ning Zhao
24
24
  """
25
25
 
26
- __version__ = "1.0.17"
26
+ __version__ = "1.0.18"
27
27
  __author__ = "Luis U. Aguilera, William S. Raymond, Rhiannon M. Sears, Nathan L. Nowling, Brian Munsky, Ning Zhao"
28
28
 
29
29
  # Package name (for backward compatibility)
microlive/gui/app.py CHANGED
@@ -10710,7 +10710,7 @@ class GUI(QMainWindow):
10710
10710
  }
10711
10711
 
10712
10712
  if display_crop is not None and display_flags is not None:
10713
- self.display_colocalization_results(display_crop, crop_size, display_flags, ch1, ch2)
10713
+ self.display_colocalization_results(display_crop, crop_size, display_flags, ch1, ch2, auto_columns=True)
10714
10714
  self.extract_colocalization_data(save_df=False)
10715
10715
 
10716
10716
  def _compute_coloc_flags(self, mean_crop, crop_size, ch2, method, threshold):
@@ -10795,20 +10795,34 @@ class GUI(QMainWindow):
10795
10795
 
10796
10796
 
10797
10797
 
10798
- def display_colocalization_results(self, mean_crop, crop_size, flag_vector, ch1, ch2):
10799
- """Display the colocalization result using provided crop data."""
10798
+ def display_colocalization_results(self, mean_crop, crop_size, flag_vector, ch1, ch2, auto_columns=False):
10799
+ """Display the colocalization result using provided crop data.
10800
+
10801
+ Args:
10802
+ mean_crop: Cropped spot images
10803
+ crop_size: Size of each crop
10804
+ flag_vector: Boolean vector indicating colocalization status
10805
+ ch1: Reference channel index
10806
+ ch2: Colocalize channel index
10807
+ auto_columns: If True, auto-calculate optimal columns and update spinbox.
10808
+ If False (default), use current spinbox value.
10809
+ """
10800
10810
  self.figure_colocalization.clear()
10801
10811
  title = f"Colocalization: {self.colocalization_results['colocalization_percentage']:.2f}%"
10802
10812
 
10803
- # Auto-calculate optimal number of columns based on spot count
10804
- n_spots = len(flag_vector) if flag_vector is not None else 0
10805
- optimal_cols = self._calculate_optimal_coloc_columns(n_spots)
10806
-
10807
- # Update the spinbox to reflect the auto-calculated value
10808
- if hasattr(self, 'columns_spinbox'):
10809
- self.columns_spinbox.blockSignals(True)
10810
- self.columns_spinbox.setValue(optimal_cols)
10811
- self.columns_spinbox.blockSignals(False)
10813
+ # Determine number of columns to use
10814
+ if auto_columns:
10815
+ # Auto-calculate optimal number of columns based on spot count
10816
+ n_spots = len(flag_vector) if flag_vector is not None else 0
10817
+ num_cols = self._calculate_optimal_coloc_columns(n_spots)
10818
+ # Update the spinbox to reflect the auto-calculated value
10819
+ if hasattr(self, 'columns_spinbox'):
10820
+ self.columns_spinbox.blockSignals(True)
10821
+ self.columns_spinbox.setValue(num_cols)
10822
+ self.columns_spinbox.blockSignals(False)
10823
+ else:
10824
+ # Use user's current spinbox value
10825
+ num_cols = self.columns_spinbox.value() if hasattr(self, 'columns_spinbox') else 20
10812
10826
 
10813
10827
  self.plots.plot_matrix_pair_crops(
10814
10828
  mean_crop=mean_crop,
@@ -10817,7 +10831,7 @@ class GUI(QMainWindow):
10817
10831
  selected_channels=(ch1, ch2),
10818
10832
  figure=self.figure_colocalization,
10819
10833
  crop_spacing=5,
10820
- number_columns=optimal_cols,
10834
+ number_columns=num_cols,
10821
10835
  plot_title=title
10822
10836
  )
10823
10837
  try:
@@ -10864,6 +10878,26 @@ class GUI(QMainWindow):
10864
10878
  optimal = min(200, 120 + int((n_spots - 5000) * 80 / 10000))
10865
10879
 
10866
10880
  return optimal
10881
+
10882
+ def _on_coloc_columns_changed(self, value):
10883
+ """Handle user change to the Crop Columns spinbox.
10884
+
10885
+ Redraws the colocalization display with the new column count.
10886
+ Only triggers if colocalization results exist.
10887
+ """
10888
+ if not self.colocalization_results:
10889
+ return
10890
+
10891
+ # Redraw with user's selected column count (auto_columns=False by default)
10892
+ self.display_colocalization_results(
10893
+ self.colocalization_results['mean_crop_filtered'],
10894
+ self.colocalization_results['crop_size'],
10895
+ self.colocalization_results['flag_vector'],
10896
+ self.colocalization_results['ch1_index'],
10897
+ self.colocalization_results['ch2_index'],
10898
+ auto_columns=False
10899
+ )
10900
+ self.canvas_colocalization.draw()
10867
10901
 
10868
10902
 
10869
10903
  # Note: display_colocalization_manual() removed - replaced by separate
@@ -11395,8 +11429,9 @@ class GUI(QMainWindow):
11395
11429
  columnsLayout.addWidget(QLabel("Columns:"))
11396
11430
  self.columns_spinbox = QSpinBox()
11397
11431
  self.columns_spinbox.setRange(4, 200)
11398
- self.columns_spinbox.setValue(20) # Auto-adjusted when running
11399
- self.columns_spinbox.setToolTip("Auto-adjusted based on spot count (larger = wider image)")
11432
+ self.columns_spinbox.setValue(20) # Auto-adjusted on first run, then user-controlled
11433
+ self.columns_spinbox.setToolTip("Adjust number of columns in crop display. Auto-set on first run.")
11434
+ self.columns_spinbox.valueChanged.connect(self._on_coloc_columns_changed)
11400
11435
  columnsLayout.addWidget(self.columns_spinbox)
11401
11436
  top_layout.addWidget(columnsGroup)
11402
11437
  actionsGroup = QGroupBox("Actions")
@@ -482,7 +482,7 @@ def segment_image(image_TXY, step_size=5, pretrained_model_segmentation='auto',
482
482
 
483
483
 
484
484
 
485
- def create_image_arrays(list_concatenated_images, selected_image=0, FRAP_channel_to_quantify=0,pretrained_model_segmentation='auto',frap_time=None, starting_changing_frame=40, step_size_increase=5,min_diameter=10):
485
+ def create_image_arrays(list_concatenated_images, selected_image=0, FRAP_channel_to_quantify=0,pretrained_model_segmentation='auto',frap_time=None, starting_changing_frame=40, step_size_increase=5,min_diameter=10, segmentation_step_size=5):
486
486
  image_TZXYC = list_concatenated_images[selected_image] # shape (T Z Y X C)
487
487
  print('Image with shape (T Z Y X C):\n ' ,list_concatenated_images[selected_image].shape) # TZYXC
488
488
  print('Original Image pixel ', 'min: {:.2f}, max: {:.2f}, mean: {:.2f}, std: {:.2f}'.format(np.min(image_TZXYC), np.max(image_TZXYC), np.mean(image_TZXYC), np.std(image_TZXYC)) )
@@ -499,7 +499,7 @@ def create_image_arrays(list_concatenated_images, selected_image=0, FRAP_channel
499
499
  image_TXY_stable_FRAP = image_TZXYC[:,0,:,:,stable_FRAP_channel] # shape (T X Y)
500
500
  image_TXY_stable_FRAP_8bit = (image_TXY_stable_FRAP - np.min(image_TXY_stable_FRAP)) / (np.max(image_TXY_stable_FRAP) - np.min(image_TXY_stable_FRAP)) * 255
501
501
 
502
- masks_TXY, background_mask, pseudo_cytosol_masks_TXY = segment_image(image_TXY_stable_FRAP_8bit, step_size=5, pretrained_model_segmentation=pretrained_model_segmentation,frap_time=frap_time,stable_FRAP_channel=FRAP_channel_to_quantify,min_diameter=min_diameter)
502
+ masks_TXY, background_mask, pseudo_cytosol_masks_TXY = segment_image(image_TXY_stable_FRAP_8bit, step_size=segmentation_step_size, pretrained_model_segmentation=pretrained_model_segmentation,frap_time=frap_time,stable_FRAP_channel=FRAP_channel_to_quantify,min_diameter=min_diameter)
503
503
 
504
504
  if masks_TXY is None:
505
505
  return None, None, None, None, None, None, None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microlive
3
- Version: 1.0.17
3
+ Version: 1.0.18
4
4
  Summary: Live-cell microscopy image analysis and single-molecule measurements
5
5
  Project-URL: Homepage, https://github.com/ningzhaoAnschutz/microlive
6
6
  Project-URL: Documentation, https://github.com/ningzhaoAnschutz/microlive/blob/main/docs/user_guide.md
@@ -1,4 +1,4 @@
1
- microlive/__init__.py,sha256=HO7GUobQMGh4QyPHlad9Z_SEaPNvhz2pdH-YABr7szc,1385
1
+ microlive/__init__.py,sha256=bavo-sX1UY8Tz8Ed6rfBV_W_SFQxlIMkAflf36nJVDs,1385
2
2
  microlive/imports.py,sha256=VAAMavSLIKO0LooadTXfCdZiv8LQbV_wITeIv8IHwxM,7531
3
3
  microlive/microscopy.py,sha256=OFqf0JXJW4-2cLHvXnwwp_SfMFsUXwp5lDKbkCRR4ok,710841
4
4
  microlive/ml_spot_detection.py,sha256=pVbOSGNJ0WWMuPRML42rFwvjKVZ0B1fJux1179OIbAg,10603
@@ -7,12 +7,12 @@ microlive/data/icons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hS
7
7
  microlive/data/icons/icon_micro.png,sha256=b5tFv4E6vUmLwYmYeM4PJuxLV_XqEzN14ueolekTFW0,370236
8
8
  microlive/data/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
9
  microlive/gui/__init__.py,sha256=tB-CdDC7x5OwYFAQxLOUvfVnUThaXKXVRsB68YP0Y6Q,28
10
- microlive/gui/app.py,sha256=sUz8MBQ4bpiNsZAhyZ7lhneY_hF45KORgepXShCCFYE,805899
10
+ microlive/gui/app.py,sha256=lTi6YLINdDU5rfwwsPrOb6Rj9MqXLq4h7fqDc63NhEU,807540
11
11
  microlive/gui/main.py,sha256=b66W_2V-pclGKOozfs75pwrCGbL_jkVU3kFt8RFMZIc,2520
12
12
  microlive/gui/micro_mac.command,sha256=TkxYOO_5A2AiNJMz3_--1geBYfl77THpOLFZnV4J2ac,444
13
13
  microlive/gui/micro_windows.bat,sha256=DJUKPhDbCO4HToLwSMT-QTYRe9Kr1wn5A2Ijy2klIrw,773
14
14
  microlive/pipelines/__init__.py,sha256=VimchYrIWalFs_edRmjR1zBHIg2CcpRceZoRmB1e8kA,764
15
- microlive/pipelines/pipeline_FRAP.py,sha256=jBGzb7m3RzbuKtmD-KCrpSZCbypuLHeUacm88-XlUUU,62691
15
+ microlive/pipelines/pipeline_FRAP.py,sha256=tx5MnqAK68cApkAddpi-OFvJk3X0e18eTYw7WQoNXy8,62738
16
16
  microlive/pipelines/pipeline_folding_efficiency.py,sha256=0PTogfXHRtO2kXOeQXb5-VBb46DQsj6namGVEkMGI0g,22550
17
17
  microlive/pipelines/pipeline_particle_tracking.py,sha256=euPTLH6O9I66HkUb4Izah8ZF_aOdQLRyyR8vo1jSkFA,28245
18
18
  microlive/pipelines/pipeline_spot_detection_no_tracking.py,sha256=t-p1xCQvThnVKMJZgk3Xhk3k6cvp1VgwTJ0ZIbfzNG0,19087
@@ -21,8 +21,8 @@ microlive/utils/device.py,sha256=tcPMU8UiXL-DuGwhudUgrbjW1lgIK_EUKIOeOn0U6q4,253
21
21
  microlive/utils/model_downloader.py,sha256=EruviTEh75YBekpznn1RZ1Nj8lnDmeC4TKEnFLOow6Y,9448
22
22
  microlive/utils/resources.py,sha256=Jz7kPI75xMLCBJMyX7Y_3ixKi_UgydfQkF0BlFtLCKs,1753
23
23
  microlive/data/models/spot_detection_cnn.pth,sha256=Np7vpPJIbKQmuKY0Hx-4IkeEDsnks_QEgs7TqaYgZmI,8468580
24
- microlive-1.0.17.dist-info/METADATA,sha256=e75rIP8Kpz7nB8DoIEyBHuNqTHm8MV4i6blG9QHgt6c,12462
25
- microlive-1.0.17.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
26
- microlive-1.0.17.dist-info/entry_points.txt,sha256=Zqp2vixyD8lngcfEmOi8fkCj7vPhesz5xlGBI-EubRw,54
27
- microlive-1.0.17.dist-info/licenses/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
28
- microlive-1.0.17.dist-info/RECORD,,
24
+ microlive-1.0.18.dist-info/METADATA,sha256=8uWSvVb6juErtB3x1-GHWqvY7Uekha0Fy5CFZifikRk,12462
25
+ microlive-1.0.18.dist-info/WHEEL,sha256=WLgqFyCfm_KASv4WHyYy0P3pM_m7J5L9k2skdKLirC8,87
26
+ microlive-1.0.18.dist-info/entry_points.txt,sha256=Zqp2vixyD8lngcfEmOi8fkCj7vPhesz5xlGBI-EubRw,54
27
+ microlive-1.0.18.dist-info/licenses/LICENSE,sha256=ixuiBLtpoK3iv89l7ylKkg9rs2GzF9ukPH7ynZYzK5s,35148
28
+ microlive-1.0.18.dist-info/RECORD,,