Skip to content

Commit

Permalink
disconnecting bkgr ROIs when going to next pos
Browse files Browse the repository at this point in the history
  • Loading branch information
ElpadoCan committed Oct 1, 2021
1 parent 3b93401 commit aa8f2ec
Show file tree
Hide file tree
Showing 2 changed files with 139 additions and 26 deletions.
9 changes: 7 additions & 2 deletions src/dataPrep.py
Original file line number Diff line number Diff line change
Expand Up @@ -486,13 +486,18 @@ def updateBkgrROIs(self):
if roi not in self.ax1.items:
self.ax1.addItem(roi.label)
self.ax1.addItem(roi)
roi.sigRegionChanged.connect(self.bkgrROIMoving)
roi.sigRegionChangeFinished.connect(self.bkgrROImovingFinished)

def removeBkgrROIs(self):
PosData = self.data[self.pos_i]
for roi in PosData.bkgrROIs:
self.ax1.removeItem(roi.label)
self.ax1.removeItem(roi)

roi.sigRegionChanged.disconnect()
roi.sigRegionChangeFinished.disconnect()

def init_attr(self):
PosData = self.data[0]
self.navigateScrollbar.setEnabled(True)
Expand Down Expand Up @@ -1232,8 +1237,8 @@ def setBkgrROIprops(self, bkgrROI):
bkgrROI.addScaleHandle([1, 0], [0, 1])
bkgrROI.addScaleHandle([0, 1], [1, 0])

bkgrROI.sigRegionChanged.connect(self.bkgrROIMoving)
bkgrROI.sigRegionChangeFinished.connect(self.bkgrROImovingFinished)
# bkgrROI.sigRegionChanged.connect(self.bkgrROIMoving)
# bkgrROI.sigRegionChangeFinished.connect(self.bkgrROImovingFinished)


def addDefaultBkgrROI(self, checked=False):
Expand Down
156 changes: 132 additions & 24 deletions src/gui.py
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ def __init__(self, app, parent=None, buttonToRestore=None, mainWin=None):

self.gui_createImg1Widgets()

self.set_metrics_func()

mainContainer = QtGui.QWidget()
self.setCentralWidget(mainContainer)

Expand Down Expand Up @@ -8855,6 +8857,41 @@ def zSliceAbsent(self, filename, PosData):
dataPrepWin.loop = loop
loop.exec_()

def set_metrics_func(self):
self.metrics_func = {
'mean': lambda arr: arr.mean(),
'sum': lambda arr: arr.sum(),
'amount_autoBkgr': lambda arr, bkgr, area: (arr.mean()-bkgr)*area,
'amount_dataPrepBkgr': lambda arr, bkgr, area: (arr.mean()-bkgr)*area,
'median': lambda arr: np.median(arr),
'min': lambda arr: arr.min(),
'max': lambda arr: arr.max(),
'q25': lambda arr: np.quantile(arr, q=0.25),
'q75': lambda arr: np.quantile(arr, q=0.75),
'q05': lambda arr: np.quantile(arr, q=0.05),
'q95': lambda arr: np.quantile(arr, q=0.95)
}

self.total_metrics = len(self.metrics_func)

bkgr_val_names = (
'autoBkgr_val_median',
'autoBkgr_val_mean',
'autoBkgr_val_q75',
'autoBkgr_val_q25',
'autoBkgr_val_q95',
'autoBkgr_val_q05',
'dataPrepBkgr_val_median',
'dataPrepBkgr_val_mean',
'dataPrepBkgr_val_q75',
'dataPrepBkgr_val_q25',
'dataPrepBkgr_val_q95',
'dataPrepBkgr_val_q05',
)

self.all_metrics_names = list(self.metrics_func.keys())
self.all_metrics_names.extend(bkgr_val_names)


def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
"""
Expand All @@ -8871,11 +8908,13 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):

yx_pxl_to_um2 = PhysicalSizeY*PhysicalSizeX
numCells = len(rp)
IDs = [0]*numCells
IDs_vol_vox = [0]*numCells
IDs_area_pxl = [0]*numCells
IDs_vol_fl = [0]*numCells
IDs_area_um2 = [0]*numCells

list_0s = [0]*numCells
IDs = list_0s.copy()
IDs_vol_vox = list_0s.copy()
IDs_area_pxl = list_0s.copy()
IDs_vol_fl = list_0s.copy()
IDs_area_um2 = list_0s.copy()

# Initialize fluo metrics arrays
fluo_keys = list(PosData.fluo_data_dict.keys())
Expand All @@ -8885,30 +8924,26 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
n = len(how_3Dto2D)
numFluoChannels = len(fluo_keys)

metrics_func = {
'mean': lambda arr: arr.mean(),
'sum': lambda arr: arr.sum(),
'amount_autoBkgr': lambda arr, bkgr, area: (arr.mean()-bkgr)*area,
'amount_dataPrepBkgr': lambda arr, bkgr, area: (arr.mean()-bkgr)*area,
'median': lambda arr: np.median(arr),
'min': lambda arr: arr.min(),
'max': lambda arr: arr.max(),
'q25': lambda arr: np.quantile(arr, q=0.25),
'q75': lambda arr: np.quantile(arr, q=0.75),
'q05': lambda arr: np.quantile(arr, q=0.05),
'q95': lambda arr: np.quantile(arr, q=0.95)
}
# Defined in function set_metrics_func
metrics_func = self.metrics_func

# Dictionary where values is a list of 0s with len=numCells
# and key is 'channelName_metrics_how' (e.g. 'GFP_mean_zSlice')
list_0s = [0]*numCells
metrics_values = {
f'{ch}_{metric}{how}':list_0s.copy()
for metric in metrics_func.keys()
for ch in PosData.loadedChNames
f'{chName}_{metric}{how}':list_0s.copy()
for metric in self.all_metrics_names
for chName in PosData.loadedChNames
for how in how_3Dto2D
}

tot_iter = (
self.total_metrics
*len(PosData.loadedChNames)
*len(how_3Dto2D)
*numCells
)
pbar = tqdm(total=tot_iter, ncols=100, unit='metric')

outCellsMask = lab==0

# Compute ROI bkgrMask
Expand All @@ -8928,6 +8963,11 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
bkgrArchive = PosData.fluo_bkgrData_dict[filename]
fluo_data_projs = []
bkgrData_medians = []
bkgrData_means = []
bkgrData_q75s = []
bkgrData_q25s = []
bkgrData_q95s = []
bkgrData_q05s = []
if PosData.SizeZ > 1:
idx = (filename, frame_i)
try:
Expand Down Expand Up @@ -8979,6 +9019,26 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
bkgrData_medians.append(np.median(bkgrVals_z_maxP))
bkgrData_medians.append(np.median(bkgrVals_z_sumP))
bkgrData_medians.append(np.median(bkgrVals_zSlice))

bkgrData_means.append(bkgrVals_z_maxP.mean())
bkgrData_means.append(bkgrVals_z_sumP.mean())
bkgrData_means.append(bkgrVals_zSlice.mean())

bkgrData_q75s.append(np.quantile(bkgrVals_z_maxP, q=0.75))
bkgrData_q75s.append(np.quantile(bkgrVals_z_sumP, q=0.75))
bkgrData_q75s.append(np.quantile(bkgrVals_zSlice, q=0.75))

bkgrData_q25s.append(np.quantile(bkgrVals_z_maxP, q=0.25))
bkgrData_q25s.append(np.quantile(bkgrVals_z_sumP, q=0.25))
bkgrData_q25s.append(np.quantile(bkgrVals_zSlice, q=0.25))

bkgrData_q95s.append(np.quantile(bkgrVals_z_maxP, q=0.95))
bkgrData_q95s.append(np.quantile(bkgrVals_z_sumP, q=0.95))
bkgrData_q95s.append(np.quantile(bkgrVals_zSlice, q=0.95))

bkgrData_q05s.append(np.quantile(bkgrVals_z_maxP, q=0.05))
bkgrData_q05s.append(np.quantile(bkgrVals_z_sumP, q=0.05))
bkgrData_q05s.append(np.quantile(bkgrVals_zSlice, q=0.05))
else:
fluo_data_2D = fluo_data
fluo_data_projs.append(fluo_data_2D)
Expand All @@ -8990,6 +9050,11 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
roiData = bkgrArchive[roi_key][frame_i]
bkgrVals_2D.extend(roiData[roiData!=0])
bkgrData_medians.append(np.median(bkgrVals_2D))
bkgrData_means.append(bkgrVals_2D.mean())
bkgrData_q75s.append(np.quantile(bkgrVals_2D, q=0.75))
bkgrData_q25s.append(np.quantile(bkgrVals_2D, q=0.25))
bkgrData_q95s.append(np.quantile(bkgrVals_2D, q=0.95))
bkgrData_q05s.append(np.quantile(bkgrVals_2D, q=0.05))

# Iterate cells
for i, obj in enumerate(rp):
Expand All @@ -9004,14 +9069,34 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
IDs_area_um2[i] = obj.area*yx_pxl_to_um2

# Iterate method of 3D to 2D
for how, fluo_2D in zip(how_3Dto2D, fluo_data_projs):
how_iterable = enumerate(zip(how_3Dto2D, fluo_data_projs))
for k, (how, fluo_2D) in how_iterable:
fluo_data_ID = fluo_2D[obj.slice][obj.image]

# fluo_2D!=0 is required because when we align we pad with 0s
# instead of np.roll and we don't want to include those
# exact 0s in the backgrMask
backgrMask = np.logical_and(outCellsMask, fluo_2D!=0)
fluo_backgr = np.median(fluo_2D[backgrMask])
bkgr_arr = fluo_2D[backgrMask]
fluo_backgr = np.median(bkgr_arr)

bkgr_key = f'{chName}_autoBkgr_val_median{how}'
metrics_values[bkgr_key][i] = fluo_backgr

bkgr_key = f'{chName}_autoBkgr_val_mean{how}'
metrics_values[bkgr_key][i] = bkgr_arr.mean()

bkgr_key = f'{chName}_autoBkgr_val_q75{how}'
metrics_values[bkgr_key][i] = np.quantile(bkgr_arr, q=0.75)

bkgr_key = f'{chName}_autoBkgr_val_q25{how}'
metrics_values[bkgr_key][i] = np.quantile(bkgr_arr, q=0.25)

bkgr_key = f'{chName}_autoBkgr_val_q95{how}'
metrics_values[bkgr_key][i] = np.quantile(bkgr_arr, q=0.95)

bkgr_key = f'{chName}_autoBkgr_val_q05{how}'
metrics_values[bkgr_key][i] = np.quantile(bkgr_arr, q=0.05)

# Calculate metrics for each cell
for func_name, func in metrics_func.items():
Expand All @@ -9030,10 +9115,31 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):
ROI_bkgrVal = bkgrData_medians[k]
val = func(fluo_data_ID, ROI_bkgrVal, obj.area)
metrics_values[key][i] = val

bkgr_key = f'{chName}_dataPrepBkgr_val_median{how}'
metrics_values[bkgr_key][i] = ROI_bkgrVal

bkgr_key = f'{chName}_dataPrepBkgr_val_mean{how}'
metrics_values[bkgr_key][i] = bkgrData_means[k]

bkgr_key = f'{chName}_dataPrepBkgr_val_q75{how}'
metrics_values[bkgr_key][i] = bkgrData_q75s[k]

bkgr_key = f'{chName}_dataPrepBkgr_val_q25{how}'
metrics_values[bkgr_key][i] = bkgrData_q25s[k]

bkgr_key = f'{chName}_dataPrepBkgr_val_q95{how}'
metrics_values[bkgr_key][i] = bkgrData_q95s[k]

bkgr_key = f'{chName}_dataPrepBkgr_val_q05{how}'
metrics_values[bkgr_key][i] = bkgrData_q05s[k]

elif func_name.find('amount') == -1:
val = func(fluo_data_ID)
metrics_values[key][i] = val

pbar.update()

df['cell_area_pxl'] = pd.Series(data=IDs_area_pxl, index=IDs, dtype=float)
df['cell_vol_vox'] = pd.Series(data=IDs_vol_vox, index=IDs, dtype=float)
df['cell_area_um2'] = pd.Series(data=IDs_area_um2, index=IDs, dtype=float)
Expand All @@ -9043,6 +9149,8 @@ def addMetrics_acdc_df(self, df, rp, frame_i, lab, PosData):

df = df.join(df_metrics)

pbar.close()

# Join with regionprops_table
props = (
'label',
Expand Down

0 comments on commit aa8f2ec

Please sign in to comment.