From 94cc6a582dd2b284d848975e75a03cb09860781e Mon Sep 17 00:00:00 2001 From: Austin Epiphane Yann Tung-Shan Lefebvre Date: Wed, 2 Oct 2024 20:03:06 -0700 Subject: [PATCH] more docs for hierarchical --- docs/_build/doctrees/environment.pickle | Bin 454816 -> 471622 bytes .../nellie.feature_extraction.doctree | Bin 35550 -> 119388 bytes .../feature_extraction/hierarchical.html | 510 ++++++++++++++++++ docs/_build/html/modules.html | 14 + .../html/nellie.feature_extraction.html | 344 +++++++++++- docs/_build/html/nellie_napari.html | 16 + docs/_build/html/searchindex.js | 2 +- nellie/feature_extraction/hierarchical.py | 37 ++ 8 files changed, 914 insertions(+), 9 deletions(-) diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index b54548e846812fcfcfddc7d0c8e327c903e67677..05a771bc46b292a1f0c60ce20889946d90ca780b 100644 GIT binary patch delta 80392 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 M1Oz)xP0O7B4>E&)z5oCK delta 40724 zcmbt-cVHF8_CGVXrFYVMLK^7=2tA?0<%Zsc5JQk$0tqP~HQ106AhLn+sR&rGOA(0u z!T0$db_k*yz!SmcC&M4&gYynXU?>}v;X@da@)BG;|kLz z!*1h`Nx9~EWfc|WWlasH@_94MZf|PvZhyppPt>hh)rFO@}IZFxnFvNgF- zNlW!mE+qS+%6Y*_PstK2)AgNkAVc@2A9~lgbY%ap+UUKQ#=UP&%hZqmPu~sS))@X~8e( z@+|4}kCCXbR# zxyEvO^P4QEYU?$Yil;@5mqMH!XbNtu)ti~1==U6Pf+>~Q7h>{#X1yi5lDP zijC5g%iRK%PqV|6(Yc8zhN^FzT{*W*S=BvSIoB;rA>Dn=+#br7ZkoD%l#rZgU*;AY znwUkYw6A9+D5-hT%9~xH75BW@PK~T~fzl8LR%9(8i#Cib%_`Kw%4^+|x;EA|xRuW< zt*Dz>HnYiINF8G!T&SlvcvqKImzB&cE~!{pvZ$sB*m0NoNXg3|YG!%+zi?;%Dx?g4 zEmFzqSxPn-kef2?-Rr>bKLA{mvJ>r$Q zeG{>#QOW7q7xiHYJ9@V*I3@$d2dyBj-nsJXSo zz7xb;1|ns^^Ry;=7Qf~2TNi%o%5HV`SEydw;Zk=iScWnt-yTM>83TdtGB2gDpFOiT z<>U#)?0x8eq4Yo2ZadNcSc{_q^42v_`J~@@benRZpc>t(+&3U!nNt|%b_>u!jtR={ zfuU%svip1vnnnLtekkmV*HP`eDP{frl)(dXmDriV%4_{Q85cqsWzB&6jrT=+E~osT zr|5Swp7jI#Q9b-;#kUw0w5q%39!G|WklfwJ{t`#*M$2fhInU%W*c@~iXzpu9I?kRF1M@kVOzM-lUq+e`y$)lIv8mw;LJ)940Hj zzTQz_Ft7~PcJoaDYGNET8(xLw<5a%uB+`vb~Ul98Lrk2b_;uOgX^@WI=cr= zwAel2*3eDK*`KaN9`r}kHSxV@b#j{&nrMXw=oQ`<%7Aa_UKK?;x1dn82JA6cu*JO^ zGr^ng*3#PIr@2d%((f%dWyOC&&~wbhFTUj$Tv|~MQnNOuSJ%@HZn{4`!KIs^@al4S zK578}k5WE=BMuz_uB?_lA8=^-9? zp@4Yse?8H)Hqfq8H0Az7@dD75Hh_NCfV@N?S|36MJ@Jf4kV!5xwFyA({Bgh31$c<-Mw^Mjx{UiiY6(O-wE~7 z>uMBmzPHFruP7UX5)>QG6LinZFyGws4*oA%iCrCu8+66yyeDF=<{Wj*l`>{uW;?-{ z@hm|IZ!uaGc&iaEzs;E9=$7yssx(XeS#%LhaFC%3#(iBguCuT5_Jlvz7zL0mEhtD} zbXL~u6z8lv$qCL`3s=nnoUC!+U#&h4dd5Alb!_=Y6Hze1`M)*+ZQbRkBXO9Un-TQohirz3H=Hf%7g|;N014JVusgq$mw(4B}p??E2iKoIK|yh&4hL zOVECp+g}FPlD*N&(a%EhQWm4eL9CssSc3M?-dy`GUxnf`GS*2EOVvI$vZ!)qSxsh}9oi=M!x{r}2jXlS;DtV^3wpcNPJoH^mUt?E%kn6zJwi(|cQArEp2U zFf4P#Jz)q%?%0E(l}_KMpe2%6w`*dNtXXPcPWc^$D;YnCveiklRcmtm4K5qHSue$) zCnea&HCW}L=iL>*%VMAQhy=FPRj|Sz3t=tAxmu5EK%}aZs$bs$xT7-dCsDt{66CwC zLekn^@^duC9#XKoq2VgKPNXWuzXS_4{ilTXyM`tVs-jqA6TG{F9O@iH1zykEpeo

)Fw4#ltdbBy7f|n`rmLG#$D%LG5>)*=uT3_Ju!2 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 I?$*rz2RjOQ*8l(j diff --git a/docs/_build/doctrees/nellie.feature_extraction.doctree b/docs/_build/doctrees/nellie.feature_extraction.doctree index 8885523befa3570a994ed1c67289cea45970b713..767eec9e15dc4dc1fe14d2a12f5abae9c5a7d456 100644 GIT binary patch literal 119388 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 fi8@@W z&N=s-@4Jux-JRZlJSIGkxF0*!e8oYJai#p}@v+jFu--_7E3S~RK3h&M9S=W~nOCLB z?WF;+7-V@F_r5CYfrpkY zZMSw&)wg76&Eim9mfuv*o~r!4kSHI?jwekXdHdv|iN7PuhpE^@#Stp@I?_IrnylY* zxu44eTpr}|4_tPFELbUOxIbvF|5JJw%OQl#wcB;y?Fi1}S_70ImBhuuA>51Yh zp%R{e91+jILz05MO|`-6g0HaAOEt%DT45LhGj{mIV9;53jj}LXc2{^uQ;*KXB$BB5 zXuCBCePfwauEI?AlCwHLCpkYkvaan0Q7+{Ewx5VOLOwMkMck_Wzkc%waf^_@$P36l zaVcVvP)8@g=s4CtMJrZNiW%O1^A;$V1<6C@_DNoIIhwXjOct`@c&XgAveB4~t&Fw* zt|}3moB)YtA@f&lm;TkoW;0FHfa?$pxK~zZ(EtKmgOEKZW+(D8j@j@AqQqmXrL z3eAqN-3_82=wV|BdWp9&a{fXp7&)(!#K>W3V8}sqQCREP=M;-p7=cl*z!0NJ8>jC$ z*3LNASQ?nM&VqHn0r9CIjEb)`eh{RH#De5>xu_vd^oY*t1`|Yri{QuL9NdGZ?3l*8 zbY5z!f`{ZUXXlG_9>*|^7^Y!5Z$pO|LnAay3tTd{@kTMpB}-cZvbAwgOd07*u?k$O zv>1kqIeIMd2FJRa%EVpNk}bFQxn*6`uSAs#p)`mv4+Zk6q2#kqp4@1NT$ikAo-10z z#u{DH)lw`v$XG$lQRnl4^UUpQ)9>Za^Rn`;uBhymL|n&c3r zLwQ9V7Z~?UX<2lAygb}CT4Wf+X&534Mx;rkGz8@4ymV&t^@e6Nt7k@Mx-_HRQi()E zRo;&CdY1d*(7sLSK?YL#Wn&PwFr81oR1EW2Hys_f8gjIHU?%T7F`PPy z$+HY*GOv!AyoOfChsXv)&i(TkGZ;2E8=bi95W&VMCT}4X%;c>kF_T#u7`LLBOpA+R zGDbGcvOnu8Qx4pg$-lO>H z!{&K3Xh-&4L*90BB%BWg-;C%BpEcliNc^>-&zg(;8*$b|OlGKFKvVrg72Tsmb{P&- zX{=7+2scVp4MCOU5LDkq*~ZZ!POLtCM!EU)DRJ}Zb0hhiN>CN!-OlMV)vdA0`WdSi z42{(nPD>aiKPc9x&mCyrHj(e<)8|a@Y9k+88Ln4n=sgU+K7rnL zci!`L42Ul|!Wyw}qd7aS7v1v6HzVcR(qc2BHH_7O$HD3~9*xyR{*AzD#AL>*-}7Bq zeVY>qr{%)3Iebx~p*nNZNTO;8sw9V?dXe1L7p1>(J~dQldKjwnJPg%4$z2WA+dU3c z@A7Ddid3*{HxSf~-254@II~TO!PE z_7G-OTt39Ao&qQ_HL+#Mc5t~xjphQMYytKu5b;$h_Ssu{V5aI{|kQIDEC3UbXI zVJ9}CZ_(Q=Y(z!Lvb#Q0-4N8@geMLN6{YM~w0ki6Y1o z;Wm*cB@4amf1~eX2z}yl_IVnr!Lx%Ts)ooza)>;MDBG~^WkhN6?Di6Q;Go<-BUN)+{Bxpi>V*ojR{mpv|MLb6$G;tiwnD2_? z7dno;;W*M*9mg3YnK3G<6^5C9tk`kg0s>9i9w`&pEi*TN^*ND#a&w`p5eQk|# zSU_WS_P!yhF-GNVgB-H~D|YslVMH!t0X9Zu&-90~cO^-jJ(hkz_P*Q;cYw(9J4dY; z>c`JOZ7R4Afjx3Rl*$*E2Y8zqibm{hW{h8>|MmT_QcS1G`qRV|zus&n`qjPzFjp)I zcP$Ec-F*2udGh^u{nm; zp|_h1T*qaB#>S{XKS$GqOB diff --git a/docs/_build/html/_modules/nellie/feature_extraction/hierarchical.html b/docs/_build/html/_modules/nellie/feature_extraction/hierarchical.html index 43b6d12..abf7329 100644 --- a/docs/_build/html/_modules/nellie/feature_extraction/hierarchical.html +++ b/docs/_build/html/_modules/nellie/feature_extraction/hierarchical.html @@ -47,6 +47,53 @@

Source code for nellie.feature_extraction.hierarchical

[docs] class Hierarchy: + """ + A class to handle the hierarchical structure of image data, including voxel, node, branch, and component features. + + Parameters + ---------- + im_info : ImInfo + Object containing metadata and pathways related to the image. + skip_nodes : bool, optional + Whether to skip node processing (default is True). + viewer : optional + Viewer for updating status messages (default is None). + + Attributes + ---------- + im_info : ImInfo + The ImInfo object containing the image metadata. + num_t : int + Number of time frames in the image. + spacing : tuple + Spacing between dimensions (Z, Y, X) or (Y, X) depending on the presence of Z. + im_raw : memmap + Raw image data loaded from disk. + im_struct : memmap + Preprocessed structural image data. + im_distance : memmap + Distance-transformed image data. + im_skel : memmap + Skeletonized image data. + label_components : memmap + Instance-labeled image data of components. + label_branches : memmap + Re-labeled skeleton data of branches. + im_border_mask : memmap + Image data with border mask. + im_pixel_class : memmap + Image data classified by pixel types. + im_obj_reassigned : memmap + Object reassigned labels across time. + im_branch_reassigned : memmap + Branch reassigned labels across time. + flow_interpolator_fw : FlowInterpolator + Forward flow interpolator. + flow_interpolator_bw : FlowInterpolator + Backward flow interpolator. + viewer : optional + Viewer to display status updates. + """ def __init__(self, im_info: ImInfo, skip_nodes=True, viewer=None): self.im_info = im_info @@ -84,6 +131,14 @@

Source code for nellie.feature_extraction.hierarchical

self.viewer = viewer def _get_t(self): + """ + Retrieves the number of time frames from image metadata, raising an error if the information is insufficient. + + Returns + ------- + int + Number of time frames. + """ if self.num_t is None and not self.im_info.no_t: # if self.im_info.no_t: # raise ValueError("No time dimension in image.") @@ -93,6 +148,10 @@

Source code for nellie.feature_extraction.hierarchical

return self.num_t def _allocate_memory(self): + """ + Loads the required image data into memory using memory-mapped arrays. This includes raw image data, structural + data, skeletons, component labels, and other features related to the image pipeline. + """ # getting reshaped image will load the image into memory.. should probably do this case by case self.im_raw = self.im_info.get_memmap(self.im_info.im_path) self.im_struct = self.im_info.get_memmap(self.im_info.pipeline_paths['im_preprocessed']) @@ -123,6 +182,10 @@

Source code for nellie.feature_extraction.hierarchical

# self.im_info.shape = self.shape def _get_hierarchies(self): + """ + Executes the hierarchical feature extraction process, which includes running voxel, node, branch, component, + and image analyses. + """ self.voxels = Voxels(self) logger.info("Running voxel analysis") start = time.time() @@ -165,6 +228,10 @@

Source code for nellie.feature_extraction.hierarchical

logger.debug(f"Image analysis took {i_time} seconds") def _save_dfs(self): + """ + Saves the extracted features to CSV files, including voxel, node, branch, component, and image features. + """ + if self.viewer is not None: self.viewer.status = f'Saving features to csv files.' voxel_features, voxel_headers = create_feature_array(self.voxels) @@ -189,6 +256,9 @@

Source code for nellie.feature_extraction.hierarchical

image_df.to_csv(self.im_info.pipeline_paths['features_image'], index=True) def _save_adjacency_maps(self): + """ + Constructs adjacency maps for voxels, nodes, branches, and components and saves them as a pickle file. + """ # edge list: v_n = [] v_b = [] @@ -279,6 +349,10 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def run(self): + """ + Main function to run the entire hierarchical feature extraction process, which includes memory allocation, + hierarchical analysis, and saving the results. + """ self._get_t() self._allocate_memory() self._get_hierarchies() @@ -295,6 +369,21 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def append_to_array(to_append): + """ + Converts feature dictionaries into lists of arrays and headers for saving to a CSV. + + Parameters + ---------- + to_append : dict + Dictionary containing feature names and values to append. + + Returns + ------- + list + List of feature arrays. + list + List of corresponding feature headers. + """ new_array = [] new_headers = [] for feature, stats in to_append.items(): @@ -317,6 +406,23 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def create_feature_array(level, labels=None): + """ + Creates a 2D feature array and corresponding headers for saving features to CSV. + + Parameters + ---------- + level : object + The level (e.g., voxel, node, branch, etc.) from which features are extracted. + labels : array-like, optional + Array of labels to use for the first column of the output (default is None). + + Returns + ------- + numpy.ndarray + 2D array of features. + list + List of corresponding feature headers. + """ full_array = None headers = None all_attr = [] @@ -367,6 +473,55 @@

Source code for nellie.feature_extraction.hierarchical

[docs] class Voxels: + """ + A class to extract and store voxel-level features from hierarchical image data. + + Parameters + ---------- + hierarchy : Hierarchy + The Hierarchy object containing the image data and metadata. + + Attributes + ---------- + hierarchy : Hierarchy + The Hierarchy object. + time : list + List of time frames associated with the extracted voxel features. + coords : list + List of voxel coordinates. + intensity : list + List of voxel intensity values. + structure : list + List of voxel structural values. + vec01 : list + List of vectors from frame t-1 to t. + vec12 : list + List of vectors from frame t to t+1. + lin_vel : list + List of linear velocity vectors. + ang_vel : list + List of angular velocity vectors. + directionality_rel : list + List of directionality features. + node_labels : list + List of node labels assigned to voxels. + branch_labels : list + List of branch labels assigned to voxels. + component_labels : list + List of component labels assigned to voxels. + node_dim0_lims : list + List of node bounding box limits in dimension 0 (Z or Y). + node_dim1_lims : list + List of node bounding box limits in dimension 1 (Y or X). + node_dim2_lims : list + List of node bounding box limits in dimension 2 (X). + node_voxel_idxs : list + List of voxel indices associated with each node. + stats_to_aggregate : list + List of statistics to aggregate for features. + features_to_save : list + List of voxel features to save. + """ def __init__(self, hierarchy: Hierarchy): self.hierarchy = hierarchy @@ -450,6 +605,16 @@

Source code for nellie.feature_extraction.hierarchical

self.features_to_save = self.stats_to_aggregate + ["x", "y", "z"] def _get_node_info(self, t, frame_coords): + """ + Gathers node-related information for each frame, including pixel classes, skeleton radii, and bounding boxes. + + Parameters + ---------- + t : int + The time frame index. + frame_coords : array-like + The coordinates of the voxels in the current frame. + """ # get all network pixels skeleton_pixels = np.argwhere(self.hierarchy.im_pixel_class[t] > 0) skeleton_radius = self.hierarchy.im_distance[t][tuple(skeleton_pixels.T)] @@ -527,6 +692,21 @@

Source code for nellie.feature_extraction.hierarchical

self.node_voxel_idxs.append(chunk_node_voxel_idxs) def _get_min_euc_dist(self, t, vec): + """ + Calculates the minimum Euclidean distance for voxels to their nearest branch. + + Parameters + ---------- + t : int + The time frame index. + vec : array-like + The vector field for the current time frame. + + Returns + ------- + pandas.Series + The indices of the minimum distance for each branch. + """ euc_dist = np.linalg.norm(vec, axis=1) branch_labels = self.branch_labels[t] @@ -541,6 +721,25 @@

Source code for nellie.feature_extraction.hierarchical

return idxmin def _get_ref_coords(self, coords_a, coords_b, idxmin, t): + """ + Retrieves the reference coordinates for calculating relative velocity and acceleration. + + Parameters + ---------- + coords_a : array-like + The coordinates in frame A. + coords_b : array-like + The coordinates in frame B. + idxmin : pandas.Series + Indices of minimum Euclidean distances. + t : int + The time frame index. + + Returns + ------- + tuple + The reference coordinates for frames A and B. + """ vals_a = idxmin[self.branch_labels[t]].values vals_a_no_nan = vals_a.copy() vals_a_no_nan[np.isnan(vals_a_no_nan)] = 0 @@ -559,6 +758,17 @@

Source code for nellie.feature_extraction.hierarchical

return ref_a, ref_b def _get_motility_stats(self, t, coords_1_px): + """ + Computes motility-related features for each voxel, including linear and angular velocities, accelerations, + and directionality. + + Parameters + ---------- + t : int + The time frame index. + coords_1_px : array-like + Coordinates of the voxels in pixel space for frame t. + """ coords_1_px = coords_1_px.astype('float32') if self.hierarchy.im_info.no_z: dims = 2 @@ -755,6 +965,21 @@

Source code for nellie.feature_extraction.hierarchical

# self.directionality_acc_rel.append(directionality_acc_rel) def _get_linear_velocity(self, ra, rb): + """ + Computes the linear velocity, its magnitude, and orientation between two sets of coordinates. + + Parameters + ---------- + ra : array-like + Coordinates in the earlier frame (frame t-1 or t). + rb : array-like + Coordinates in the later frame (frame t or t+1). + + Returns + ------- + tuple + Tuple containing linear velocity vectors, magnitudes, and orientations. + """ lin_disp = rb - ra lin_vel = lin_disp / self.hierarchy.im_info.dim_res['T'] lin_vel_mag = np.linalg.norm(lin_vel, axis=1) @@ -767,6 +992,22 @@

Source code for nellie.feature_extraction.hierarchical

return lin_vel, lin_vel_mag, lin_vel_orient def _get_angular_velocity_2d(self, ra, rb): + """ + Computes the angular velocity, its magnitude, and orientation between two sets of coordinates. + Uses either 2D or 3D calculations depending on the image dimensionality. + + Parameters + ---------- + ra : array-like + Coordinates in the earlier frame (frame t-1 or t). + rb : array-like + Coordinates in the later frame (frame t or t+1). + + Returns + ------- + tuple + Tuple containing angular velocity vectors, magnitudes, and orientations. + """ # calculate angles of ra and rb relative to x-axis theta_a = np.arctan2(ra[:, 1], ra[:, 0]) theta_b = np.arctan2(rb[:, 1], rb[:, 0]) @@ -846,6 +1087,10 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def run(self): + """ + Main function to run the extraction of voxel features over all time frames. + Iterates over each frame to extract coordinates, intensity, structural features, and motility statistics. + """ if self.hierarchy.num_t is None: self.hierarchy.num_t = 1 for t in range(self.hierarchy.num_t): @@ -920,6 +1165,47 @@

Source code for nellie.feature_extraction.hierarchical

[docs] class Nodes: + """ + A class to extract and store node-level features from hierarchical image data. + + Parameters + ---------- + hierarchy : Hierarchy + The Hierarchy object containing the image data and metadata. + + Attributes + ---------- + hierarchy : Hierarchy + The Hierarchy object. + time : list + List of time frames associated with the extracted node features. + nodes : list + List of node coordinates for each frame. + z, x, y : list + List of node coordinates in 3D or 2D space. + node_thickness : list + List of node thickness values. + divergence : list + List of divergence values for nodes. + convergence : list + List of convergence values for nodes. + vergere : list + List of vergere values (convergence + divergence). + aggregate_voxel_metrics : list + List of aggregated voxel metrics for each node. + voxel_idxs : list + List of voxel indices associated with each node. + branch_label : list + List of branch labels assigned to nodes. + component_label : list + List of component labels assigned to nodes. + image_name : list + List of image file names. + stats_to_aggregate : list + List of statistics to aggregate for nodes. + features_to_save : list + List of node features to save. + """ def __init__(self, hierarchy): self.hierarchy = hierarchy @@ -960,10 +1246,26 @@

Source code for nellie.feature_extraction.hierarchical

self.node_x_lims = self.hierarchy.voxels.node_dim2_lims def _get_aggregate_voxel_stats(self, t): + """ + Aggregates voxel-level statistics for each node in the frame. + + Parameters + ---------- + t : int + The time frame index. + """ frame_agg = aggregate_stats_for_class(self.hierarchy.voxels, t, self.hierarchy.voxels.node_voxel_idxs[t]) self.aggregate_voxel_metrics.append(frame_agg) def _get_node_stats(self, t): + """ + Computes node-level statistics, including thickness, divergence, convergence, and vergere. + + Parameters + ---------- + t : int + The time frame index. + """ radius = distance_check(self.hierarchy.im_border_mask[t], self.nodes[t], self.hierarchy.spacing) self.node_thickness.append(radius * 2) @@ -1043,6 +1345,14 @@

Source code for nellie.feature_extraction.hierarchical

self.x.append(x) def _run_frame(self, t): + """ + Extracts node features for a single time frame, including voxel metrics, node coordinates, and node statistics. + + Parameters + ---------- + t : int + The time frame index. + """ frame_skel_coords = np.argwhere(self.hierarchy.im_pixel_class[t] > 0) self.nodes.append(frame_skel_coords) @@ -1064,6 +1374,10 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def run(self): + """ + Main function to run the extraction of node features over all time frames. + Iterates over each frame to extract node features and calculate metrics. + """ if self.hierarchy.skip_nodes: return for t in range(self.hierarchy.num_t): @@ -1087,6 +1401,51 @@

Source code for nellie.feature_extraction.hierarchical

[docs] class Branches: + """ + A class to extract and store branch-level features from hierarchical image data. + + Parameters + ---------- + hierarchy : Hierarchy + The Hierarchy object containing the image data and metadata. + + Attributes + ---------- + hierarchy : Hierarchy + The Hierarchy object. + time : list + List of time frames associated with the extracted branch features. + branch_label : list + List of branch labels for each frame. + aggregate_voxel_metrics : list + List of aggregated voxel metrics for each branch. + aggregate_node_metrics : list + List of aggregated node metrics for each branch. + z, x, y : list + List of branch centroid coordinates in 3D or 2D space. + branch_length : list + List of branch length values. + branch_thickness : list + List of branch thickness values. + branch_aspect_ratio : list + List of aspect ratios for branches. + branch_tortuosity : list + List of tortuosity values for branches. + branch_area : list + List of branch area values. + branch_axis_length_maj, branch_axis_length_min : list + List of major and minor axis lengths for branches. + branch_extent : list + List of extent values for branches. + branch_solidity : list + List of solidity values for branches. + reassigned_label : list + List of reassigned branch labels across time. + stats_to_aggregate : list + List of statistics to aggregate for branches. + features_to_save : list + List of branch features to save. + """ def __init__(self, hierarchy): self.hierarchy = hierarchy @@ -1122,6 +1481,14 @@

Source code for nellie.feature_extraction.hierarchical

self.features_to_save = self.stats_to_aggregate + ["x", "y", "z"] def _get_aggregate_stats(self, t): + """ + Aggregates voxel and node-level statistics for each branch in the frame. + + Parameters + ---------- + t : int + The time frame index. + """ voxel_labels = self.hierarchy.voxels.branch_labels[t] grouped_vox_idxs = [np.argwhere(voxel_labels == label).flatten() for label in np.unique(voxel_labels) if label != 0] @@ -1136,6 +1503,14 @@

Source code for nellie.feature_extraction.hierarchical

self.aggregate_node_metrics.append(node_agg) def _get_branch_stats(self, t): + """ + Computes branch-level statistics, including length, thickness, aspect ratio, tortuosity, and solidity. + + Parameters + ---------- + t : int + The time frame index. + """ branch_idx_array_1 = np.array(self.branch_idxs[t]) branch_idx_array_2 = np.array(self.branch_idxs[t])[:, None, :] dist = np.linalg.norm(branch_idx_array_1 - branch_idx_array_2, axis=-1) @@ -1264,6 +1639,15 @@

Source code for nellie.feature_extraction.hierarchical

self.x.append(x) def _run_frame(self, t): + """ + Extracts branch features for a single time frame, including voxel and node metrics, branch coordinates, and + branch statistics. + + Parameters + ---------- + t : int + The time frame index. + """ frame_branch_idxs = np.argwhere(self.hierarchy.im_skel[t] > 0) self.branch_idxs.append(frame_branch_idxs) @@ -1300,6 +1684,10 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def run(self): + """ + Main function to run the extraction of branch features over all time frames. + Iterates over each frame to extract branch features and calculate metrics. + """ for t in range(self.hierarchy.num_t): if self.hierarchy.viewer is not None: self.hierarchy.viewer.status = f'Extracting branch features. Frame: {t + 1} of {self.hierarchy.num_t}.' @@ -1311,6 +1699,45 @@

Source code for nellie.feature_extraction.hierarchical

[docs] class Components: + """ + A class to extract and store component-level features from hierarchical image data. + + Parameters + ---------- + hierarchy : Hierarchy + The Hierarchy object containing the image data and metadata. + + Attributes + ---------- + hierarchy : Hierarchy + The Hierarchy object. + time : list + List of time frames associated with the extracted component features. + component_label : list + List of component labels for each frame. + aggregate_voxel_metrics : list + List of aggregated voxel metrics for each component. + aggregate_node_metrics : list + List of aggregated node metrics for each component. + aggregate_branch_metrics : list + List of aggregated branch metrics for each component. + z, x, y : list + List of component centroid coordinates in 3D or 2D space. + organelle_area : list + List of component area values. + organelle_axis_length_maj, organelle_axis_length_min : list + List of major and minor axis lengths for components. + organelle_extent : list + List of extent values for components. + organelle_solidity : list + List of solidity values for components. + reassigned_label : list + List of reassigned component labels across time. + stats_to_aggregate : list + List of statistics to aggregate for components. + features_to_save : list + List of component features to save. + """ def __init__(self, hierarchy): self.hierarchy = hierarchy @@ -1339,6 +1766,14 @@

Source code for nellie.feature_extraction.hierarchical

self.features_to_save = self.stats_to_aggregate + ["x", "y", "z"] def _get_aggregate_stats(self, t): + """ + Aggregates voxel, node, and branch-level statistics for each component in the frame. + + Parameters + ---------- + t : int + The time frame index. + """ voxel_labels = self.hierarchy.voxels.component_labels[t] grouped_vox_idxs = [np.argwhere(voxel_labels == label).flatten() for label in np.unique(voxel_labels) if label != 0] @@ -1359,6 +1794,14 @@

Source code for nellie.feature_extraction.hierarchical

self.aggregate_branch_metrics.append(branch_agg) def _get_component_stats(self, t): + """ + Computes component-level statistics, including area, axis lengths, extent, and solidity. + + Parameters + ---------- + t : int + The time frame index. + """ regions = regionprops(self.hierarchy.label_components[t], spacing=self.hierarchy.spacing) areas = [] axis_length_maj = [] @@ -1406,6 +1849,15 @@

Source code for nellie.feature_extraction.hierarchical

self.x.append(x) def _run_frame(self, t): + """ + Extracts component features for a single time frame, including voxel, node, and branch metrics, and component + statistics. + + Parameters + ---------- + t : int + The time frame index. + """ smallest_label = int(np.min(self.hierarchy.label_components[t][self.hierarchy.label_components[t] > 0])) largest_label = int(np.max(self.hierarchy.label_components[t])) frame_component_labels = np.arange(smallest_label, largest_label + 1) @@ -1424,6 +1876,10 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def run(self): + """ + Main function to run the extraction of component features over all time frames. + Iterates over each frame to extract component features and calculate metrics. + """ for t in range(self.hierarchy.num_t): if self.hierarchy.viewer is not None: self.hierarchy.viewer.status = f'Extracting organelle features. Frame: {t + 1} of {self.hierarchy.num_t}.' @@ -1435,6 +1891,35 @@

Source code for nellie.feature_extraction.hierarchical

[docs] class Image: + """ + A class to extract and store global image-level features from hierarchical image data. + + Parameters + ---------- + hierarchy : Hierarchy + The Hierarchy object containing the image data and metadata. + + Attributes + ---------- + hierarchy : Hierarchy + The Hierarchy object. + time : list + List of time frames associated with the extracted image-level features. + image_name : list + List of image file names. + aggregate_voxel_metrics : list + List of aggregated voxel metrics for the entire image. + aggregate_node_metrics : list + List of aggregated node metrics for the entire image. + aggregate_branch_metrics : list + List of aggregated branch metrics for the entire image. + aggregate_component_metrics : list + List of aggregated component metrics for the entire image. + stats_to_aggregate : list + List of statistics to aggregate for the entire image. + features_to_save : list + List of image-level features to save. + """ def __init__(self, hierarchy): self.hierarchy = hierarchy @@ -1448,6 +1933,14 @@

Source code for nellie.feature_extraction.hierarchical

self.features_to_save = [] def _get_aggregate_stats(self, t): + """ + Aggregates voxel, node, branch, and component-level statistics for the entire image in the frame. + + Parameters + ---------- + t : int + The time frame index. + """ voxel_agg = aggregate_stats_for_class(self.hierarchy.voxels, t, [np.arange(len(self.hierarchy.voxels.coords[t]))]) self.aggregate_voxel_metrics.append(voxel_agg) @@ -1465,6 +1958,15 @@

Source code for nellie.feature_extraction.hierarchical

self.aggregate_component_metrics.append(component_agg) def _run_frame(self, t): + """ + Extracts image-level features for a single time frame, including aggregated voxel, node, branch, and + component metrics. + + Parameters + ---------- + t : int + The time frame index. + """ self.time.append(t) self.image_name.append(self.hierarchy.im_info.file_info.filename_no_ext) @@ -1473,6 +1975,10 @@

Source code for nellie.feature_extraction.hierarchical

[docs] def run(self): + """ + Main function to run the extraction of image-level features over all time frames. + Iterates over each frame to extract and aggregate voxel, node, branch, and component-level features. + """ for t in range(self.hierarchy.num_t): if self.hierarchy.viewer is not None: self.hierarchy.viewer.status = f'Extracting image features. Frame: {t + 1} of {self.hierarchy.num_t}.' @@ -1508,6 +2014,10 @@

Nellie

Navigation

+

Contents:

+

Related Topics

diff --git a/docs/_build/html/modules.html b/docs/_build/html/modules.html index e505b71..bacd88f 100644 --- a/docs/_build/html/modules.html +++ b/docs/_build/html/modules.html @@ -13,6 +13,8 @@ + + @@ -249,11 +251,23 @@

Nellie

Navigation

+

Contents:

+

Related Topics

diff --git a/docs/_build/html/nellie.feature_extraction.html b/docs/_build/html/nellie.feature_extraction.html index d9744f5..56168ca 100644 --- a/docs/_build/html/nellie.feature_extraction.html +++ b/docs/_build/html/nellie.feature_extraction.html @@ -13,6 +13,8 @@ + + @@ -41,66 +43,340 @@

Submodules class nellie.feature_extraction.hierarchical.Branches(hierarchy)[source]

Bases: object

+

A class to extract and store branch-level features from hierarchical image data.

+
+

Parameters

+
+
hierarchyHierarchy

The Hierarchy object containing the image data and metadata.

+
+
+
+
+

Attributes

+
+
hierarchyHierarchy

The Hierarchy object.

+
+
timelist

List of time frames associated with the extracted branch features.

+
+
branch_labellist

List of branch labels for each frame.

+
+
aggregate_voxel_metricslist

List of aggregated voxel metrics for each branch.

+
+
aggregate_node_metricslist

List of aggregated node metrics for each branch.

+
+
z, x, ylist

List of branch centroid coordinates in 3D or 2D space.

+
+
branch_lengthlist

List of branch length values.

+
+
branch_thicknesslist

List of branch thickness values.

+
+
branch_aspect_ratiolist

List of aspect ratios for branches.

+
+
branch_tortuositylist

List of tortuosity values for branches.

+
+
branch_arealist

List of branch area values.

+
+
branch_axis_length_maj, branch_axis_length_minlist

List of major and minor axis lengths for branches.

+
+
branch_extentlist

List of extent values for branches.

+
+
branch_soliditylist

List of solidity values for branches.

+
+
reassigned_labellist

List of reassigned branch labels across time.

+
+
stats_to_aggregatelist

List of statistics to aggregate for branches.

+
+
features_to_savelist

List of branch features to save.

+
+
run()[source]
-
+

Main function to run the extraction of branch features over all time frames. +Iterates over each frame to extract branch features and calculate metrics.

+
+
class nellie.feature_extraction.hierarchical.Components(hierarchy)[source]

Bases: object

+

A class to extract and store component-level features from hierarchical image data.

+
+

Parameters

+
+
hierarchyHierarchy

The Hierarchy object containing the image data and metadata.

+
+
+
+
+

Attributes

+
+
hierarchyHierarchy

The Hierarchy object.

+
+
timelist

List of time frames associated with the extracted component features.

+
+
component_labellist

List of component labels for each frame.

+
+
aggregate_voxel_metricslist

List of aggregated voxel metrics for each component.

+
+
aggregate_node_metricslist

List of aggregated node metrics for each component.

+
+
aggregate_branch_metricslist

List of aggregated branch metrics for each component.

+
+
z, x, ylist

List of component centroid coordinates in 3D or 2D space.

+
+
organelle_arealist

List of component area values.

+
+
organelle_axis_length_maj, organelle_axis_length_minlist

List of major and minor axis lengths for components.

+
+
organelle_extentlist

List of extent values for components.

+
+
organelle_soliditylist

List of solidity values for components.

+
+
reassigned_labellist

List of reassigned component labels across time.

+
+
stats_to_aggregatelist

List of statistics to aggregate for components.

+
+
features_to_savelist

List of component features to save.

+
+
run()[source]
-
+

Main function to run the extraction of component features over all time frames. +Iterates over each frame to extract component features and calculate metrics.

+
+
class nellie.feature_extraction.hierarchical.Hierarchy(im_info: ImInfo, skip_nodes=True, viewer=None)[source]

Bases: object

+

A class to handle the hierarchical structure of image data, including voxel, node, branch, and component features.

+
+

Parameters

+
+
im_infoImInfo

Object containing metadata and pathways related to the image.

+
+
skip_nodesbool, optional

Whether to skip node processing (default is True).

+
+
vieweroptional

Viewer for updating status messages (default is None).

+
+
+
+
+

Attributes

+
+
im_infoImInfo

The ImInfo object containing the image metadata.

+
+
num_tint

Number of time frames in the image.

+
+
spacingtuple

Spacing between dimensions (Z, Y, X) or (Y, X) depending on the presence of Z.

+
+
im_rawmemmap

Raw image data loaded from disk.

+
+
im_structmemmap

Preprocessed structural image data.

+
+
im_distancememmap

Distance-transformed image data.

+
+
im_skelmemmap

Skeletonized image data.

+
+
label_componentsmemmap

Instance-labeled image data of components.

+
+
label_branchesmemmap

Re-labeled skeleton data of branches.

+
+
im_border_maskmemmap

Image data with border mask.

+
+
im_pixel_classmemmap

Image data classified by pixel types.

+
+
im_obj_reassignedmemmap

Object reassigned labels across time.

+
+
im_branch_reassignedmemmap

Branch reassigned labels across time.

+
+
flow_interpolator_fwFlowInterpolator

Forward flow interpolator.

+
+
flow_interpolator_bwFlowInterpolator

Backward flow interpolator.

+
+
vieweroptional

Viewer to display status updates.

+
+
run()[source]
-
+

Main function to run the entire hierarchical feature extraction process, which includes memory allocation, +hierarchical analysis, and saving the results.

+
+
class nellie.feature_extraction.hierarchical.Image(hierarchy)[source]

Bases: object

+

A class to extract and store global image-level features from hierarchical image data.

+
+

Parameters

+
+
hierarchyHierarchy

The Hierarchy object containing the image data and metadata.

+
+
+
+
+

Attributes

+
+
hierarchyHierarchy

The Hierarchy object.

+
+
timelist

List of time frames associated with the extracted image-level features.

+
+
image_namelist

List of image file names.

+
+
aggregate_voxel_metricslist

List of aggregated voxel metrics for the entire image.

+
+
aggregate_node_metricslist

List of aggregated node metrics for the entire image.

+
+
aggregate_branch_metricslist

List of aggregated branch metrics for the entire image.

+
+
aggregate_component_metricslist

List of aggregated component metrics for the entire image.

+
+
stats_to_aggregatelist

List of statistics to aggregate for the entire image.

+
+
features_to_savelist

List of image-level features to save.

+
+
run()[source]
-
+

Main function to run the extraction of image-level features over all time frames. +Iterates over each frame to extract and aggregate voxel, node, branch, and component-level features.

+
+
class nellie.feature_extraction.hierarchical.Nodes(hierarchy)[source]

Bases: object

+

A class to extract and store node-level features from hierarchical image data.

+
+

Parameters

+
+
hierarchyHierarchy

The Hierarchy object containing the image data and metadata.

+
+
+
+
+

Attributes

+
+
hierarchyHierarchy

The Hierarchy object.

+
+
timelist

List of time frames associated with the extracted node features.

+
+
nodeslist

List of node coordinates for each frame.

+
+
z, x, ylist

List of node coordinates in 3D or 2D space.

+
+
node_thicknesslist

List of node thickness values.

+
+
divergencelist

List of divergence values for nodes.

+
+
convergencelist

List of convergence values for nodes.

+
+
vergerelist

List of vergere values (convergence + divergence).

+
+
aggregate_voxel_metricslist

List of aggregated voxel metrics for each node.

+
+
voxel_idxslist

List of voxel indices associated with each node.

+
+
branch_labellist

List of branch labels assigned to nodes.

+
+
component_labellist

List of component labels assigned to nodes.

+
+
image_namelist

List of image file names.

+
+
stats_to_aggregatelist

List of statistics to aggregate for nodes.

+
+
features_to_savelist

List of node features to save.

+
+
run()[source]
-
+

Main function to run the extraction of node features over all time frames. +Iterates over each frame to extract node features and calculate metrics.

+
+
class nellie.feature_extraction.hierarchical.Voxels(hierarchy: Hierarchy)[source]

Bases: object

+

A class to extract and store voxel-level features from hierarchical image data.

+
+

Parameters

+
+
hierarchyHierarchy

The Hierarchy object containing the image data and metadata.

+
+
+
+
+

Attributes

+
+
hierarchyHierarchy

The Hierarchy object.

+
+
timelist

List of time frames associated with the extracted voxel features.

+
+
coordslist

List of voxel coordinates.

+
+
intensitylist

List of voxel intensity values.

+
+
structurelist

List of voxel structural values.

+
+
vec01list

List of vectors from frame t-1 to t.

+
+
vec12list

List of vectors from frame t to t+1.

+
+
lin_vellist

List of linear velocity vectors.

+
+
ang_vellist

List of angular velocity vectors.

+
+
directionality_rellist

List of directionality features.

+
+
node_labelslist

List of node labels assigned to voxels.

+
+
branch_labelslist

List of branch labels assigned to voxels.

+
+
component_labelslist

List of component labels assigned to voxels.

+
+
node_dim0_limslist

List of node bounding box limits in dimension 0 (Z or Y).

+
+
node_dim1_limslist

List of node bounding box limits in dimension 1 (Y or X).

+
+
node_dim2_limslist

List of node bounding box limits in dimension 2 (X).

+
+
node_voxel_idxslist

List of voxel indices associated with each node.

+
+
stats_to_aggregatelist

List of statistics to aggregate for features.

+
+
features_to_savelist

List of voxel features to save.

+
+
run()[source]
-
+

Main function to run the extraction of voxel features over all time frames. +Iterates over each frame to extract coordinates, intensity, structural features, and motility statistics.

+
+
@@ -111,12 +387,48 @@

Submodules
nellie.feature_extraction.hierarchical.append_to_array(to_append)[source]
-

+

Converts feature dictionaries into lists of arrays and headers for saving to a CSV.

+
+

Parameters

+
+
to_appenddict

Dictionary containing feature names and values to append.

+
+
+
+
+

Returns

+
+
list

List of feature arrays.

+
+
list

List of corresponding feature headers.

+
+
+
+
nellie.feature_extraction.hierarchical.create_feature_array(level, labels=None)[source]
-
+

Creates a 2D feature array and corresponding headers for saving features to CSV.

+
+

Parameters

+
+
levelobject

The level (e.g., voxel, node, branch, etc.) from which features are extracted.

+
+
labelsarray-like, optional

Array of labels to use for the first column of the output (default is None).

+
+
+
+
+

Returns

+
+
numpy.ndarray

2D array of features.

+
+
list

List of corresponding feature headers.

+
+
+
+
@@ -146,11 +458,27 @@

Nellie

Navigation

+

Contents:

+ diff --git a/docs/_build/html/nellie_napari.html b/docs/_build/html/nellie_napari.html index 5744dcd..59e11eb 100644 --- a/docs/_build/html/nellie_napari.html +++ b/docs/_build/html/nellie_napari.html @@ -13,6 +13,8 @@ + + @@ -485,11 +487,25 @@

Nellie

Navigation

+

Contents:

+

Related Topics

diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index f6e62c9..c2d3538 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"alltitles": {"Contents:": [[0, null]], "Module contents": [[3, "module-nellie"], [4, "module-nellie.feature_extraction"], [5, "module-nellie.im_info"], [6, "module-nellie.segmentation"], [7, "module-nellie.tracking"], [8, "module-nellie.utils"], [9, "module-nellie_napari"], [10, "module-tests"], [11, "module-tests.unit"]], "Nellie documentation": [[0, null]], "Submodules": [[3, "submodules"], [4, "submodules"], [5, "submodules"], [6, "submodules"], [7, "submodules"], [8, "submodules"], [9, "submodules"], [11, "submodules"]], "Subpackages": [[3, "subpackages"], [10, "subpackages"]], "main module": [[1, null]], "nellie": [[2, null]], "nellie package": [[3, null]], "nellie.cli module": [[3, "module-nellie.cli"]], "nellie.feature_extraction package": [[4, null]], "nellie.feature_extraction.hierarchical module": [[4, "module-nellie.feature_extraction.hierarchical"]], "nellie.im_info package": [[5, null]], "nellie.im_info.verifier module": [[5, "module-nellie.im_info.verifier"]], "nellie.run module": [[3, "module-nellie.run"]], "nellie.segmentation package": [[6, null]], "nellie.segmentation.filtering module": [[6, "module-nellie.segmentation.filtering"]], "nellie.segmentation.labelling module": [[6, "module-nellie.segmentation.labelling"]], "nellie.segmentation.mocap_marking module": [[6, "module-nellie.segmentation.mocap_marking"]], "nellie.segmentation.networking module": [[6, "module-nellie.segmentation.networking"]], "nellie.tracking package": [[7, null]], "nellie.tracking.all_tracks_for_label module": [[7, "module-nellie.tracking.all_tracks_for_label"]], "nellie.tracking.flow_interpolation module": [[7, "module-nellie.tracking.flow_interpolation"]], "nellie.tracking.hu_tracking module": [[7, "module-nellie.tracking.hu_tracking"]], "nellie.tracking.voxel_reassignment module": [[7, "module-nellie.tracking.voxel_reassignment"]], "nellie.utils package": [[8, null]], "nellie.utils.base_logger module": [[8, "module-nellie.utils.base_logger"]], "nellie.utils.general module": [[8, "module-nellie.utils.general"]], "nellie.utils.gpu_functions module": [[8, "module-nellie.utils.gpu_functions"]], "nellie.utils.torch_xp module": [[8, "nellie-utils-torch-xp-module"]], "nellie_napari package": [[9, null]], "nellie_napari.nellie_analysis module": [[9, "module-nellie_napari.nellie_analysis"]], "nellie_napari.nellie_fileselect module": [[9, "module-nellie_napari.nellie_fileselect"]], "nellie_napari.nellie_home module": [[9, "module-nellie_napari.nellie_home"]], "nellie_napari.nellie_loader module": [[9, "module-nellie_napari.nellie_loader"]], "nellie_napari.nellie_processor module": [[9, "module-nellie_napari.nellie_processor"]], "nellie_napari.nellie_settings module": [[9, "module-nellie_napari.nellie_settings"]], "nellie_napari.nellie_visualizer module": [[9, "module-nellie_napari.nellie_visualizer"]], "tests package": [[10, null]], "tests.unit package": [[11, null]], "tests.unit.test_frangi_filter module": [[11, "module-tests.unit.test_frangi_filter"]], "tests.unit.test_im_info module": [[11, "tests-unit-test-im-info-module"]]}, "docnames": ["index", "main", "modules", "nellie", "nellie.feature_extraction", "nellie.im_info", "nellie.segmentation", "nellie.tracking", "nellie.utils", "nellie_napari", "tests", "tests.unit"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["index.rst", "main.rst", "modules.rst", "nellie.rst", "nellie.feature_extraction.rst", "nellie.im_info.rst", "nellie.segmentation.rst", "nellie.tracking.rst", "nellie.utils.rst", "nellie_napari.rst", "tests.rst", "tests.unit.rst"], "indexentries": {"bbox() (in module nellie.utils.general)": [[8, "nellie.utils.general.bbox", false]], "get_reshaped_image() (in module nellie.utils.general)": [[8, "nellie.utils.general.get_reshaped_image", false]], "module": [[3, "module-nellie", false], [3, "module-nellie.cli", false], [3, "module-nellie.run", false], [8, "module-nellie.utils", false], [8, "module-nellie.utils.base_logger", false], [8, "module-nellie.utils.general", false], [8, "module-nellie.utils.gpu_functions", false], [10, "module-tests", false], [11, "module-tests.unit", false], [11, "module-tests.unit.test_frangi_filter", false]], "nellie": [[3, "module-nellie", false]], "nellie.cli": [[3, "module-nellie.cli", false]], "nellie.run": [[3, "module-nellie.run", false]], "nellie.utils": [[8, "module-nellie.utils", false]], "nellie.utils.base_logger": [[8, "module-nellie.utils.base_logger", false]], "nellie.utils.general": [[8, "module-nellie.utils.general", false]], "nellie.utils.gpu_functions": [[8, "module-nellie.utils.gpu_functions", false]], "otsu_effectiveness() (in module nellie.utils.gpu_functions)": [[8, "nellie.utils.gpu_functions.otsu_effectiveness", false]], "otsu_threshold() (in module nellie.utils.gpu_functions)": [[8, "nellie.utils.gpu_functions.otsu_threshold", false]], "process_directory() (in module nellie.cli)": [[3, "nellie.cli.process_directory", false]], "process_files() (in module nellie.cli)": [[3, "nellie.cli.process_files", false]], "run() (in module nellie.run)": [[3, "nellie.run.run", false]], "tests": [[10, "module-tests", false]], "tests.unit": [[11, "module-tests.unit", false]], "tests.unit.test_frangi_filter": [[11, "module-tests.unit.test_frangi_filter", false]], "triangle_threshold() (in module nellie.utils.gpu_functions)": [[8, "nellie.utils.gpu_functions.triangle_threshold", false]]}, "objects": {"": [[1, 0, 0, "-", "main"], [3, 0, 0, "-", "nellie"], [9, 0, 0, "-", "nellie_napari"], [10, 0, 0, "-", "tests"]], "main": [[1, 1, 1, "", "main"]], "nellie": [[3, 0, 0, "-", "cli"], [4, 0, 0, "-", "feature_extraction"], [5, 0, 0, "-", "im_info"], [3, 0, 0, "-", "run"], [6, 0, 0, "-", "segmentation"], [7, 0, 0, "-", "tracking"], [8, 0, 0, "-", "utils"]], "nellie.cli": [[3, 1, 1, "", "process_directory"], [3, 1, 1, "", "process_files"]], "nellie.feature_extraction": [[4, 0, 0, "-", "hierarchical"]], "nellie.feature_extraction.hierarchical": [[4, 2, 1, "", "Branches"], [4, 2, 1, "", "Components"], [4, 2, 1, "", "Hierarchy"], [4, 2, 1, "", "Image"], [4, 2, 1, "", "Nodes"], [4, 2, 1, "", "Voxels"], [4, 1, 1, "", "aggregate_stats_for_class"], [4, 1, 1, "", "append_to_array"], [4, 1, 1, "", "create_feature_array"], [4, 1, 1, "", "distance_check"]], "nellie.feature_extraction.hierarchical.Branches": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Components": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Hierarchy": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Image": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Nodes": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Voxels": [[4, 3, 1, "", "run"]], "nellie.im_info": [[5, 0, 0, "-", "verifier"]], "nellie.im_info.verifier": [[5, 2, 1, "", "FileInfo"], [5, 2, 1, "", "ImInfo"]], "nellie.im_info.verifier.FileInfo": [[5, 3, 1, "", "change_axes"], [5, 3, 1, "", "change_dim_res"], [5, 3, 1, "", "change_selected_channel"], [5, 3, 1, "", "find_metadata"], [5, 3, 1, "", "load_metadata"], [5, 3, 1, "", "read_file"], [5, 3, 1, "", "save_ome_tiff"], [5, 3, 1, "", "select_temporal_range"]], "nellie.im_info.verifier.ImInfo": [[5, 3, 1, "", "allocate_memory"], [5, 3, 1, "", "create_output_path"], [5, 3, 1, "", "get_memmap"], [5, 3, 1, "", "remove_intermediates"]], "nellie.run": [[3, 1, 1, "", "run"]], "nellie.segmentation": [[6, 0, 0, "-", "filtering"], [6, 0, 0, "-", "labelling"], [6, 0, 0, "-", "mocap_marking"], [6, 0, 0, "-", "networking"]], "nellie.segmentation.filtering": [[6, 2, 1, "", "Filter"]], "nellie.segmentation.filtering.Filter": [[6, 3, 1, "", "run"]], "nellie.segmentation.labelling": [[6, 2, 1, "", "Label"]], "nellie.segmentation.labelling.Label": [[6, 3, 1, "", "run"]], "nellie.segmentation.mocap_marking": [[6, 2, 1, "", "Markers"]], "nellie.segmentation.mocap_marking.Markers": [[6, 3, 1, "", "run"]], "nellie.segmentation.networking": [[6, 2, 1, "", "Network"]], "nellie.segmentation.networking.Network": [[6, 3, 1, "", "run"]], "nellie.tracking": [[7, 0, 0, "-", "all_tracks_for_label"], [7, 0, 0, "-", "flow_interpolation"], [7, 0, 0, "-", "hu_tracking"], [7, 0, 0, "-", "voxel_reassignment"]], "nellie.tracking.all_tracks_for_label": [[7, 2, 1, "", "LabelTracks"]], "nellie.tracking.all_tracks_for_label.LabelTracks": [[7, 3, 1, "", "initialize"], [7, 3, 1, "", "run"]], "nellie.tracking.flow_interpolation": [[7, 2, 1, "", "FlowInterpolator"], [7, 1, 1, "", "interpolate_all_backward"], [7, 1, 1, "", "interpolate_all_forward"]], "nellie.tracking.flow_interpolation.FlowInterpolator": [[7, 3, 1, "", "interpolate_coord"]], "nellie.tracking.hu_tracking": [[7, 2, 1, "", "HuMomentTracking"]], "nellie.tracking.hu_tracking.HuMomentTracking": [[7, 3, 1, "", "run"]], "nellie.tracking.voxel_reassignment": [[7, 2, 1, "", "VoxelReassigner"]], "nellie.tracking.voxel_reassignment.VoxelReassigner": [[7, 3, 1, "", "match_voxels"], [7, 3, 1, "", "run"]], "nellie.utils": [[8, 0, 0, "-", "base_logger"], [8, 0, 0, "-", "general"], [8, 0, 0, "-", "gpu_functions"]], "nellie.utils.general": [[8, 1, 1, "", "bbox"], [8, 1, 1, "", "get_reshaped_image"]], "nellie.utils.gpu_functions": [[8, 1, 1, "", "otsu_effectiveness"], [8, 1, 1, "", "otsu_threshold"], [8, 1, 1, "", "triangle_threshold"]], "nellie_napari": [[9, 0, 0, "-", "nellie_analysis"], [9, 0, 0, "-", "nellie_fileselect"], [9, 0, 0, "-", "nellie_home"], [9, 0, 0, "-", "nellie_loader"], [9, 0, 0, "-", "nellie_processor"], [9, 0, 0, "-", "nellie_settings"], [9, 0, 0, "-", "nellie_visualizer"]], "nellie_napari.nellie_analysis": [[9, 2, 1, "", "NellieAnalysis"]], "nellie_napari.nellie_analysis.NellieAnalysis": [[9, 3, 1, "", "check_for_adjacency_map"], [9, 3, 1, "", "draw_stats"], [9, 3, 1, "", "export_data"], [9, 3, 1, "", "get_csvs"], [9, 3, 1, "", "get_index"], [9, 3, 1, "", "get_stats"], [9, 3, 1, "", "on_attr_selected"], [9, 3, 1, "", "on_hist_change"], [9, 3, 1, "", "on_level_selected"], [9, 3, 1, "", "on_log_scale"], [9, 3, 1, "", "on_t_change"], [9, 3, 1, "", "overlay"], [9, 3, 1, "", "plot_data"], [9, 3, 1, "", "post_init"], [9, 3, 1, "", "reset"], [9, 3, 1, "", "rewrite_dropdown"], [9, 3, 1, "", "save_graph"], [9, 3, 1, "", "set_default_dropdowns"], [9, 3, 1, "", "set_ui"], [9, 3, 1, "", "toggle_match_t"], [9, 3, 1, "", "toggle_mean_med"]], "nellie_napari.nellie_fileselect": [[9, 2, 1, "", "NellieFileSelect"]], "nellie_napari.nellie_fileselect.NellieFileSelect": [[9, 3, 1, "", "change_channel"], [9, 3, 1, "", "change_time"], [9, 3, 1, "", "check_available_dims"], [9, 3, 1, "", "handle_dim_order_changed"], [9, 3, 1, "", "handle_t_changed"], [9, 3, 1, "", "handle_xy_changed"], [9, 3, 1, "", "handle_z_changed"], [9, 3, 1, "", "init_ui"], [9, 3, 1, "", "initialize_folder"], [9, 3, 1, "", "initialize_single_file"], [9, 3, 1, "", "on_change"], [9, 3, 1, "", "on_confirm"], [9, 3, 1, "", "on_preview"], [9, 3, 1, "", "on_process"], [9, 3, 1, "", "select_filepath"], [9, 3, 1, "", "select_folder"], [9, 3, 1, "", "validate_path"]], "nellie_napari.nellie_home": [[9, 2, 1, "", "Home"]], "nellie_napari.nellie_home.Home": [[9, 3, 1, "", "screenshot"]], "nellie_napari.nellie_loader": [[9, 2, 1, "", "NellieLoader"]], "nellie_napari.nellie_loader.NellieLoader": [[9, 3, 1, "", "add_tabs"], [9, 3, 1, "", "go_process"], [9, 3, 1, "", "on_tab_change"], [9, 3, 1, "", "reset"]], "nellie_napari.nellie_processor": [[9, 2, 1, "", "NellieProcessor"]], "nellie_napari.nellie_processor.NellieProcessor": [[9, 3, 1, "", "check_file_existence"], [9, 3, 1, "", "open_directory"], [9, 3, 1, "", "post_init"], [9, 3, 1, "", "reset_status"], [9, 3, 1, "", "run_feature_export"], [9, 3, 1, "", "run_mocap"], [9, 3, 1, "", "run_nellie"], [9, 3, 1, "", "run_preprocessing"], [9, 3, 1, "", "run_reassign"], [9, 3, 1, "", "run_segmentation"], [9, 3, 1, "", "run_tracking"], [9, 3, 1, "", "set_status"], [9, 3, 1, "", "set_ui"], [9, 3, 1, "", "turn_off_buttons"], [9, 3, 1, "", "turn_off_pipeline"], [9, 3, 1, "", "update_status"]], "nellie_napari.nellie_settings": [[9, 2, 1, "", "Settings"]], "nellie_napari.nellie_settings.Settings": [[9, 3, 1, "", "post_init"], [9, 3, 1, "", "set_ui"]], "nellie_napari.nellie_visualizer": [[9, 2, 1, "", "NellieVisualizer"]], "nellie_napari.nellie_visualizer.NellieVisualizer": [[9, 3, 1, "", "check_3d"], [9, 3, 1, "", "check_file_existence"], [9, 3, 1, "", "on_track_selected"], [9, 3, 1, "", "open_mocap_image"], [9, 3, 1, "", "open_preprocess_image"], [9, 3, 1, "", "open_raw"], [9, 3, 1, "", "open_reassign_image"], [9, 3, 1, "", "open_segment_image"], [9, 3, 1, "", "post_init"], [9, 3, 1, "", "set_scale"], [9, 3, 1, "", "set_ui"], [9, 3, 1, "", "track_all"]], "tests": [[11, 0, 0, "-", "unit"]], "tests.unit": [[11, 0, 0, "-", "test_frangi_filter"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method"}, "terms": {"0": [5, 6, 7], "1": [6, 7], "2": 6, "256": 8, "5": [6, 7], "No": 5, "add": 0, "add_tab": [2, 9], "aggregate_stats_for_class": [3, 4], "all_tracks_for_label": [2, 3], "allocate_memori": [3, 5], "alpha_sq": 6, "append_to_arrai": [3, 4], "base": [4, 5, 6, 7, 9], "base_logg": [2, 3], "bbox": [3, 8], "beta_sq": 6, "border_mask": 4, "branch": [3, 4], "ch": [3, 5], "change_ax": [3, 5], "change_channel": [2, 9], "change_dim_r": [3, 5], "change_selected_channel": [3, 5], "change_tim": [2, 9], "check_3d": [2, 9], "check_available_dim": [2, 9], "check_coord": 4, "check_file_exist": [2, 9], "check_for_adjacency_map": [2, 9], "child_class": 4, "class": [4, 5, 6, 7, 9], "clean_skel": 6, "cli": 2, "compon": [3, 4], "content": 2, "coord": 7, "create_feature_arrai": [3, 4], "create_output_path": [3, 5], "data": 5, "descript": 5, "detail": 0, "dim": 5, "directori": 3, "distanc": 6, "distance_check": [3, 4], "draw_stat": [2, 9], "dtype": 5, "end": 5, "end_fram": 7, "end_t": 7, "event": 9, "export_data": [2, 9], "ext": 5, "fals": [3, 5, 6], "feature_extract": [2, 3], "file": 3, "file_info": [3, 5], "file_path": 5, "fileinfo": [3, 5], "filepath": [5, 9], "filter": [2, 3], "find_metadata": [3, 5], "float": 5, "flow_interpol": [2, 3], "flowinterpol": [3, 7], "for_nelli": 5, "forward": 7, "frob_thresh": 6, "gener": [2, 3], "get_csv": [2, 9], "get_index": [2, 9], "get_memmap": [3, 5], "get_reshaped_imag": [3, 8], "get_stat": [2, 9], "go_process": [2, 9], "gpu_funct": [2, 3], "handle_dim_order_chang": [2, 9], "handle_t_chang": [2, 9], "handle_xy_chang": [2, 9], "handle_z_chang": [2, 9], "hierarch": [2, 3], "hierarchi": [3, 4], "home": [2, 9], "hu_track": [2, 3], "humomenttrack": [3, 7], "im": 8, "im_info": [2, 3, 4, 6, 7, 8], "imag": [3, 4, 8], "iminfo": [3, 4, 5, 6, 7], "index": 9, "init_ui": [2, 9], "initi": [3, 7], "initialize_fold": [2, 9], "initialize_single_fil": [2, 9], "int": 7, "inter_vari": 8, "interpolate_all_backward": [3, 7], "interpolate_all_forward": [3, 7], "interpolate_coord": [3, 7], "label": [2, 3, 4], "label_im_path": 7, "label_num": 7, "labeltrack": [3, 7], "layer": 9, "level": 4, "list_of_idx": 4, "load_metadata": [3, 5], "main": [0, 2], "marker": [3, 6], "mask": 6, "match_voxel": [3, 7], "matrix": 8, "max_distance_um": 7, "max_radius_um": 6, "min_radius_um": 6, "min_track_num": 7, "mocap_mark": [2, 3], "modul": [0, 2], "napari": 9, "napari_view": 9, "nbin": 8, "nelli": 9, "nellie_analysi": 2, "nellie_fileselect": 2, "nellie_hom": 2, "nellie_load": 2, "nellie_napari": [0, 2], "nellie_processor": 2, "nellie_set": 2, "nellie_visu": 2, "nellieanalysi": [2, 9], "nelliefileselect": [2, 9], "nellieload": [2, 9], "nellieprocessor": [2, 9], "nellievisu": [2, 9], "network": [2, 3], "new_ax": 5, "new_siz": 5, "node": [3, 4], "none": [3, 4, 5, 6, 7, 8, 9], "num_sigma": 6, "num_t": [3, 6, 7, 8], "object": [4, 5, 6, 7], "om": 5, "on_attr_select": [2, 9], "on_chang": [2, 9], "on_confirm": [2, 9], "on_hist_chang": [2, 9], "on_level_select": [2, 9], "on_log_scal": [2, 9], "on_preview": [2, 9], "on_process": [2, 9], "on_t_chang": [2, 9], "on_tab_chang": [2, 9], "on_track_select": [2, 9], "open_directori": [2, 9], "open_mocap_imag": [2, 9], "open_preprocess_imag": [2, 9], "open_raw": [2, 9], "open_reassign_imag": [2, 9], "open_segment_imag": [2, 9], "otsu_effect": [3, 8], "otsu_thresh_intens": [3, 6], "otsu_threshold": [3, 8], "output_dir": [3, 5], "output_path": 5, "overlai": [2, 9], "packag": [0, 2], "parent": 9, "pipeline_path": 5, "plot_data": [2, 9], "post_init": [2, 9], "process_directori": [2, 3], "process_fil": [2, 3], "qtabwidget": 9, "qwidget": 9, "r": 5, "read_fil": [3, 5], "read_mod": 5, "remove_edg": [3, 6], "remove_intermedi": [3, 5], "reset": [2, 9], "reset_statu": [2, 9], "restructuredtext": 0, "return_memmap": 5, "rewrite_dropdown": [2, 9], "run": [2, 4, 6, 7], "run_feature_export": [2, 9], "run_mocap": [2, 9], "run_nelli": [2, 9], "run_preprocess": [2, 9], "run_reassign": [2, 9], "run_segment": [2, 9], "run_track": [2, 9], "save_graph": [2, 9], "save_ome_tiff": [3, 5], "screenshot": [2, 9], "see": 0, "segment": [2, 3], "select_filepath": [2, 9], "select_fold": [2, 9], "select_temporal_rang": [3, 5], "set": [2, 9], "set_default_dropdown": [2, 9], "set_scal": [2, 9], "set_statu": [2, 9], "set_ui": [2, 9], "skip_coord": 7, "skip_nod": 4, "snr_clean": 6, "sourc": [1, 3, 4, 5, 6, 7, 8, 9], "space": 4, "start": 5, "start_fram": 7, "start_t": 7, "state": 9, "str": [5, 7], "submodul": [2, 10], "subpackag": 2, "substr": 3, "syntax": 0, "t": [4, 7], "t_slice": 8, "test": [0, 2], "test_frangi_filt": [2, 10], "test_im_info": [2, 10], "text": 9, "threshold": [3, 6], "tif": 5, "titl": 9, "to_append": 4, "toggle_match_t": [2, 9], "toggle_mean_m": [2, 9], "torch_xp": [2, 3], "track": [2, 3], "track_al": [2, 9], "triangle_threshold": [3, 8], "true": [4, 5, 6, 7], "turn_off_button": [2, 9], "turn_off_pipelin": [2, 9], "unit": [2, 10], "update_statu": [2, 9], "us": 0, "use_im": 6, "util": [2, 3], "validate_path": [2, 9], "verifi": [2, 3], "viewer": [4, 6, 7, 9], "vox_next": 7, "vox_prev": 7, "voxel": [3, 4], "voxel_reassign": [2, 3], "voxelreassign": [3, 7], "your": 0}, "titles": ["Nellie documentation", "main module", "nellie", "nellie package", "nellie.feature_extraction package", "nellie.im_info package", "nellie.segmentation package", "nellie.tracking package", "nellie.utils package", "nellie_napari package", "tests package", "tests.unit package"], "titleterms": {"all_tracks_for_label": 7, "base_logg": 8, "cli": 3, "content": [0, 3, 4, 5, 6, 7, 8, 9, 10, 11], "document": 0, "feature_extract": 4, "filter": 6, "flow_interpol": 7, "gener": 8, "gpu_funct": 8, "hierarch": 4, "hu_track": 7, "im_info": 5, "label": 6, "main": 1, "mocap_mark": 6, "modul": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11], "nelli": [0, 2, 3, 4, 5, 6, 7, 8], "nellie_analysi": 9, "nellie_fileselect": 9, "nellie_hom": 9, "nellie_load": 9, "nellie_napari": 9, "nellie_processor": 9, "nellie_set": 9, "nellie_visu": 9, "network": 6, "packag": [3, 4, 5, 6, 7, 8, 9, 10, 11], "run": 3, "segment": 6, "submodul": [3, 4, 5, 6, 7, 8, 9, 11], "subpackag": [3, 10], "test": [10, 11], "test_frangi_filt": 11, "test_im_info": 11, "torch_xp": 8, "track": 7, "unit": 11, "util": 8, "verifi": 5, "voxel_reassign": 7}}) \ No newline at end of file +Search.setIndex({"alltitles": {"Attributes": [[4, "attributes"], [4, "id2"], [4, "id4"], [4, "id6"], [4, "id8"], [4, "id10"]], "Contents:": [[0, null]], "Module contents": [[3, "module-nellie"], [4, "module-nellie.feature_extraction"], [5, "module-nellie.im_info"], [6, "module-nellie.segmentation"], [7, "module-nellie.tracking"], [8, "module-nellie.utils"], [9, "module-nellie_napari"], [10, "module-tests"], [11, "module-tests.unit"]], "Nellie documentation": [[0, null]], "Parameters": [[4, "parameters"], [4, "id1"], [4, "id3"], [4, "id5"], [4, "id7"], [4, "id9"], [4, "id11"], [4, "id12"]], "Returns": [[4, "returns"], [4, "id13"]], "Submodules": [[3, "submodules"], [4, "submodules"], [5, "submodules"], [6, "submodules"], [7, "submodules"], [8, "submodules"], [9, "submodules"], [11, "submodules"]], "Subpackages": [[3, "subpackages"], [10, "subpackages"]], "main module": [[1, null]], "nellie": [[2, null]], "nellie package": [[3, null]], "nellie.cli module": [[3, "module-nellie.cli"]], "nellie.feature_extraction package": [[4, null]], "nellie.feature_extraction.hierarchical module": [[4, "module-nellie.feature_extraction.hierarchical"]], "nellie.im_info package": [[5, null]], "nellie.im_info.verifier module": [[5, "module-nellie.im_info.verifier"]], "nellie.run module": [[3, "module-nellie.run"]], "nellie.segmentation package": [[6, null]], "nellie.segmentation.filtering module": [[6, "module-nellie.segmentation.filtering"]], "nellie.segmentation.labelling module": [[6, "module-nellie.segmentation.labelling"]], "nellie.segmentation.mocap_marking module": [[6, "module-nellie.segmentation.mocap_marking"]], "nellie.segmentation.networking module": [[6, "module-nellie.segmentation.networking"]], "nellie.tracking package": [[7, null]], "nellie.tracking.all_tracks_for_label module": [[7, "module-nellie.tracking.all_tracks_for_label"]], "nellie.tracking.flow_interpolation module": [[7, "module-nellie.tracking.flow_interpolation"]], "nellie.tracking.hu_tracking module": [[7, "module-nellie.tracking.hu_tracking"]], "nellie.tracking.voxel_reassignment module": [[7, "module-nellie.tracking.voxel_reassignment"]], "nellie.utils package": [[8, null]], "nellie.utils.base_logger module": [[8, "module-nellie.utils.base_logger"]], "nellie.utils.general module": [[8, "module-nellie.utils.general"]], "nellie.utils.gpu_functions module": [[8, "module-nellie.utils.gpu_functions"]], "nellie.utils.torch_xp module": [[8, "nellie-utils-torch-xp-module"]], "nellie_napari package": [[9, null]], "nellie_napari.nellie_analysis module": [[9, "module-nellie_napari.nellie_analysis"]], "nellie_napari.nellie_fileselect module": [[9, "module-nellie_napari.nellie_fileselect"]], "nellie_napari.nellie_home module": [[9, "module-nellie_napari.nellie_home"]], "nellie_napari.nellie_loader module": [[9, "module-nellie_napari.nellie_loader"]], "nellie_napari.nellie_processor module": [[9, "module-nellie_napari.nellie_processor"]], "nellie_napari.nellie_settings module": [[9, "module-nellie_napari.nellie_settings"]], "nellie_napari.nellie_visualizer module": [[9, "module-nellie_napari.nellie_visualizer"]], "tests package": [[10, null]], "tests.unit package": [[11, null]], "tests.unit.test_frangi_filter module": [[11, "module-tests.unit.test_frangi_filter"]], "tests.unit.test_im_info module": [[11, "tests-unit-test-im-info-module"]]}, "docnames": ["index", "main", "modules", "nellie", "nellie.feature_extraction", "nellie.im_info", "nellie.segmentation", "nellie.tracking", "nellie.utils", "nellie_napari", "tests", "tests.unit"], "envversion": {"sphinx": 63, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1}, "filenames": ["index.rst", "main.rst", "modules.rst", "nellie.rst", "nellie.feature_extraction.rst", "nellie.im_info.rst", "nellie.segmentation.rst", "nellie.tracking.rst", "nellie.utils.rst", "nellie_napari.rst", "tests.rst", "tests.unit.rst"], "indexentries": {"add_tabs() (nellie_napari.nellie_loader.nellieloader method)": [[9, "nellie_napari.nellie_loader.NellieLoader.add_tabs", false]], "aggregate_stats_for_class() (in module nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.aggregate_stats_for_class", false]], "append_to_array() (in module nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.append_to_array", false]], "bbox() (in module nellie.utils.general)": [[8, "nellie.utils.general.bbox", false]], "branches (class in nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.Branches", false]], "change_channel() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.change_channel", false]], "change_time() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.change_time", false]], "check_3d() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.check_3d", false]], "check_available_dims() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.check_available_dims", false]], "check_file_existence() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.check_file_existence", false]], "check_file_existence() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.check_file_existence", false]], "check_for_adjacency_map() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.check_for_adjacency_map", false]], "components (class in nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.Components", false]], "create_feature_array() (in module nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.create_feature_array", false]], "distance_check() (in module nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.distance_check", false]], "draw_stats() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.draw_stats", false]], "export_data() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.export_data", false]], "get_csvs() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.get_csvs", false]], "get_index() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.get_index", false]], "get_reshaped_image() (in module nellie.utils.general)": [[8, "nellie.utils.general.get_reshaped_image", false]], "get_stats() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.get_stats", false]], "go_process() (nellie_napari.nellie_loader.nellieloader method)": [[9, "nellie_napari.nellie_loader.NellieLoader.go_process", false]], "handle_dim_order_changed() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.handle_dim_order_changed", false]], "handle_t_changed() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.handle_t_changed", false]], "handle_xy_changed() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.handle_xy_changed", false]], "handle_z_changed() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.handle_z_changed", false]], "hierarchy (class in nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.Hierarchy", false]], "home (class in nellie_napari.nellie_home)": [[9, "nellie_napari.nellie_home.Home", false]], "image (class in nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.Image", false]], "init_ui() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.init_ui", false]], "initialize_folder() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.initialize_folder", false]], "initialize_single_file() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.initialize_single_file", false]], "module": [[3, "module-nellie", false], [3, "module-nellie.cli", false], [3, "module-nellie.run", false], [4, "module-nellie.feature_extraction", false], [4, "module-nellie.feature_extraction.hierarchical", false], [8, "module-nellie.utils", false], [8, "module-nellie.utils.base_logger", false], [8, "module-nellie.utils.general", false], [8, "module-nellie.utils.gpu_functions", false], [9, "module-nellie_napari", false], [9, "module-nellie_napari.nellie_analysis", false], [9, "module-nellie_napari.nellie_fileselect", false], [9, "module-nellie_napari.nellie_home", false], [9, "module-nellie_napari.nellie_loader", false], [9, "module-nellie_napari.nellie_processor", false], [9, "module-nellie_napari.nellie_settings", false], [9, "module-nellie_napari.nellie_visualizer", false], [10, "module-tests", false], [11, "module-tests.unit", false], [11, "module-tests.unit.test_frangi_filter", false]], "nellie": [[3, "module-nellie", false]], "nellie.cli": [[3, "module-nellie.cli", false]], "nellie.feature_extraction": [[4, "module-nellie.feature_extraction", false]], "nellie.feature_extraction.hierarchical": [[4, "module-nellie.feature_extraction.hierarchical", false]], "nellie.run": [[3, "module-nellie.run", false]], "nellie.utils": [[8, "module-nellie.utils", false]], "nellie.utils.base_logger": [[8, "module-nellie.utils.base_logger", false]], "nellie.utils.general": [[8, "module-nellie.utils.general", false]], "nellie.utils.gpu_functions": [[8, "module-nellie.utils.gpu_functions", false]], "nellie_napari": [[9, "module-nellie_napari", false]], "nellie_napari.nellie_analysis": [[9, "module-nellie_napari.nellie_analysis", false]], "nellie_napari.nellie_fileselect": [[9, "module-nellie_napari.nellie_fileselect", false]], "nellie_napari.nellie_home": [[9, "module-nellie_napari.nellie_home", false]], "nellie_napari.nellie_loader": [[9, "module-nellie_napari.nellie_loader", false]], "nellie_napari.nellie_processor": [[9, "module-nellie_napari.nellie_processor", false]], "nellie_napari.nellie_settings": [[9, "module-nellie_napari.nellie_settings", false]], "nellie_napari.nellie_visualizer": [[9, "module-nellie_napari.nellie_visualizer", false]], "nellieanalysis (class in nellie_napari.nellie_analysis)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis", false]], "nelliefileselect (class in nellie_napari.nellie_fileselect)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect", false]], "nellieloader (class in nellie_napari.nellie_loader)": [[9, "nellie_napari.nellie_loader.NellieLoader", false]], "nellieprocessor (class in nellie_napari.nellie_processor)": [[9, "nellie_napari.nellie_processor.NellieProcessor", false]], "nellievisualizer (class in nellie_napari.nellie_visualizer)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer", false]], "nodes (class in nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.Nodes", false]], "on_attr_selected() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.on_attr_selected", false]], "on_change() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.on_change", false]], "on_confirm() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.on_confirm", false]], "on_hist_change() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.on_hist_change", false]], "on_level_selected() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.on_level_selected", false]], "on_log_scale() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.on_log_scale", false]], "on_preview() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.on_preview", false]], "on_process() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.on_process", false]], "on_t_change() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.on_t_change", false]], "on_tab_change() (nellie_napari.nellie_loader.nellieloader method)": [[9, "nellie_napari.nellie_loader.NellieLoader.on_tab_change", false]], "on_track_selected() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.on_track_selected", false]], "open_directory() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.open_directory", false]], "open_mocap_image() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.open_mocap_image", false]], "open_preprocess_image() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.open_preprocess_image", false]], "open_raw() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.open_raw", false]], "open_reassign_image() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.open_reassign_image", false]], "open_segment_image() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.open_segment_image", false]], "otsu_effectiveness() (in module nellie.utils.gpu_functions)": [[8, "nellie.utils.gpu_functions.otsu_effectiveness", false]], "otsu_threshold() (in module nellie.utils.gpu_functions)": [[8, "nellie.utils.gpu_functions.otsu_threshold", false]], "overlay() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.overlay", false]], "plot_data() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.plot_data", false]], "post_init() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.post_init", false]], "post_init() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.post_init", false]], "post_init() (nellie_napari.nellie_settings.settings method)": [[9, "nellie_napari.nellie_settings.Settings.post_init", false]], "post_init() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.post_init", false]], "process_directory() (in module nellie.cli)": [[3, "nellie.cli.process_directory", false]], "process_files() (in module nellie.cli)": [[3, "nellie.cli.process_files", false]], "reset() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.reset", false]], "reset() (nellie_napari.nellie_loader.nellieloader method)": [[9, "nellie_napari.nellie_loader.NellieLoader.reset", false]], "reset_status() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.reset_status", false]], "rewrite_dropdown() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.rewrite_dropdown", false]], "run() (in module nellie.run)": [[3, "nellie.run.run", false]], "run() (nellie.feature_extraction.hierarchical.branches method)": [[4, "nellie.feature_extraction.hierarchical.Branches.run", false]], "run() (nellie.feature_extraction.hierarchical.components method)": [[4, "nellie.feature_extraction.hierarchical.Components.run", false]], "run() (nellie.feature_extraction.hierarchical.hierarchy method)": [[4, "nellie.feature_extraction.hierarchical.Hierarchy.run", false]], "run() (nellie.feature_extraction.hierarchical.image method)": [[4, "nellie.feature_extraction.hierarchical.Image.run", false]], "run() (nellie.feature_extraction.hierarchical.nodes method)": [[4, "nellie.feature_extraction.hierarchical.Nodes.run", false]], "run() (nellie.feature_extraction.hierarchical.voxels method)": [[4, "nellie.feature_extraction.hierarchical.Voxels.run", false]], "run_feature_export() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_feature_export", false]], "run_mocap() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_mocap", false]], "run_nellie() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_nellie", false]], "run_preprocessing() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_preprocessing", false]], "run_reassign() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_reassign", false]], "run_segmentation() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_segmentation", false]], "run_tracking() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.run_tracking", false]], "save_graph() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.save_graph", false]], "screenshot() (nellie_napari.nellie_home.home method)": [[9, "nellie_napari.nellie_home.Home.screenshot", false]], "select_filepath() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.select_filepath", false]], "select_folder() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.select_folder", false]], "set_default_dropdowns() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.set_default_dropdowns", false]], "set_scale() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.set_scale", false]], "set_status() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.set_status", false]], "set_ui() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.set_ui", false]], "set_ui() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.set_ui", false]], "set_ui() (nellie_napari.nellie_settings.settings method)": [[9, "nellie_napari.nellie_settings.Settings.set_ui", false]], "set_ui() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.set_ui", false]], "settings (class in nellie_napari.nellie_settings)": [[9, "nellie_napari.nellie_settings.Settings", false]], "tests": [[10, "module-tests", false]], "tests.unit": [[11, "module-tests.unit", false]], "tests.unit.test_frangi_filter": [[11, "module-tests.unit.test_frangi_filter", false]], "toggle_match_t() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.toggle_match_t", false]], "toggle_mean_med() (nellie_napari.nellie_analysis.nellieanalysis method)": [[9, "nellie_napari.nellie_analysis.NellieAnalysis.toggle_mean_med", false]], "track_all() (nellie_napari.nellie_visualizer.nellievisualizer method)": [[9, "nellie_napari.nellie_visualizer.NellieVisualizer.track_all", false]], "triangle_threshold() (in module nellie.utils.gpu_functions)": [[8, "nellie.utils.gpu_functions.triangle_threshold", false]], "turn_off_buttons() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.turn_off_buttons", false]], "turn_off_pipeline() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.turn_off_pipeline", false]], "update_status() (nellie_napari.nellie_processor.nellieprocessor method)": [[9, "nellie_napari.nellie_processor.NellieProcessor.update_status", false]], "validate_path() (nellie_napari.nellie_fileselect.nelliefileselect method)": [[9, "nellie_napari.nellie_fileselect.NellieFileSelect.validate_path", false]], "voxels (class in nellie.feature_extraction.hierarchical)": [[4, "nellie.feature_extraction.hierarchical.Voxels", false]]}, "objects": {"": [[1, 0, 0, "-", "main"], [3, 0, 0, "-", "nellie"], [9, 0, 0, "-", "nellie_napari"], [10, 0, 0, "-", "tests"]], "main": [[1, 1, 1, "", "main"]], "nellie": [[3, 0, 0, "-", "cli"], [4, 0, 0, "-", "feature_extraction"], [5, 0, 0, "-", "im_info"], [3, 0, 0, "-", "run"], [6, 0, 0, "-", "segmentation"], [7, 0, 0, "-", "tracking"], [8, 0, 0, "-", "utils"]], "nellie.cli": [[3, 1, 1, "", "process_directory"], [3, 1, 1, "", "process_files"]], "nellie.feature_extraction": [[4, 0, 0, "-", "hierarchical"]], "nellie.feature_extraction.hierarchical": [[4, 2, 1, "", "Branches"], [4, 2, 1, "", "Components"], [4, 2, 1, "", "Hierarchy"], [4, 2, 1, "", "Image"], [4, 2, 1, "", "Nodes"], [4, 2, 1, "", "Voxels"], [4, 1, 1, "", "aggregate_stats_for_class"], [4, 1, 1, "", "append_to_array"], [4, 1, 1, "", "create_feature_array"], [4, 1, 1, "", "distance_check"]], "nellie.feature_extraction.hierarchical.Branches": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Components": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Hierarchy": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Image": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Nodes": [[4, 3, 1, "", "run"]], "nellie.feature_extraction.hierarchical.Voxels": [[4, 3, 1, "", "run"]], "nellie.im_info": [[5, 0, 0, "-", "verifier"]], "nellie.im_info.verifier": [[5, 2, 1, "", "FileInfo"], [5, 2, 1, "", "ImInfo"]], "nellie.im_info.verifier.FileInfo": [[5, 3, 1, "", "change_axes"], [5, 3, 1, "", "change_dim_res"], [5, 3, 1, "", "change_selected_channel"], [5, 3, 1, "", "find_metadata"], [5, 3, 1, "", "load_metadata"], [5, 3, 1, "", "read_file"], [5, 3, 1, "", "save_ome_tiff"], [5, 3, 1, "", "select_temporal_range"]], "nellie.im_info.verifier.ImInfo": [[5, 3, 1, "", "allocate_memory"], [5, 3, 1, "", "create_output_path"], [5, 3, 1, "", "get_memmap"], [5, 3, 1, "", "remove_intermediates"]], "nellie.run": [[3, 1, 1, "", "run"]], "nellie.segmentation": [[6, 0, 0, "-", "filtering"], [6, 0, 0, "-", "labelling"], [6, 0, 0, "-", "mocap_marking"], [6, 0, 0, "-", "networking"]], "nellie.segmentation.filtering": [[6, 2, 1, "", "Filter"]], "nellie.segmentation.filtering.Filter": [[6, 3, 1, "", "run"]], "nellie.segmentation.labelling": [[6, 2, 1, "", "Label"]], "nellie.segmentation.labelling.Label": [[6, 3, 1, "", "run"]], "nellie.segmentation.mocap_marking": [[6, 2, 1, "", "Markers"]], "nellie.segmentation.mocap_marking.Markers": [[6, 3, 1, "", "run"]], "nellie.segmentation.networking": [[6, 2, 1, "", "Network"]], "nellie.segmentation.networking.Network": [[6, 3, 1, "", "run"]], "nellie.tracking": [[7, 0, 0, "-", "all_tracks_for_label"], [7, 0, 0, "-", "flow_interpolation"], [7, 0, 0, "-", "hu_tracking"], [7, 0, 0, "-", "voxel_reassignment"]], "nellie.tracking.all_tracks_for_label": [[7, 2, 1, "", "LabelTracks"]], "nellie.tracking.all_tracks_for_label.LabelTracks": [[7, 3, 1, "", "initialize"], [7, 3, 1, "", "run"]], "nellie.tracking.flow_interpolation": [[7, 2, 1, "", "FlowInterpolator"], [7, 1, 1, "", "interpolate_all_backward"], [7, 1, 1, "", "interpolate_all_forward"]], "nellie.tracking.flow_interpolation.FlowInterpolator": [[7, 3, 1, "", "interpolate_coord"]], "nellie.tracking.hu_tracking": [[7, 2, 1, "", "HuMomentTracking"]], "nellie.tracking.hu_tracking.HuMomentTracking": [[7, 3, 1, "", "run"]], "nellie.tracking.voxel_reassignment": [[7, 2, 1, "", "VoxelReassigner"]], "nellie.tracking.voxel_reassignment.VoxelReassigner": [[7, 3, 1, "", "match_voxels"], [7, 3, 1, "", "run"]], "nellie.utils": [[8, 0, 0, "-", "base_logger"], [8, 0, 0, "-", "general"], [8, 0, 0, "-", "gpu_functions"]], "nellie.utils.general": [[8, 1, 1, "", "bbox"], [8, 1, 1, "", "get_reshaped_image"]], "nellie.utils.gpu_functions": [[8, 1, 1, "", "otsu_effectiveness"], [8, 1, 1, "", "otsu_threshold"], [8, 1, 1, "", "triangle_threshold"]], "nellie_napari": [[9, 0, 0, "-", "nellie_analysis"], [9, 0, 0, "-", "nellie_fileselect"], [9, 0, 0, "-", "nellie_home"], [9, 0, 0, "-", "nellie_loader"], [9, 0, 0, "-", "nellie_processor"], [9, 0, 0, "-", "nellie_settings"], [9, 0, 0, "-", "nellie_visualizer"]], "nellie_napari.nellie_analysis": [[9, 2, 1, "", "NellieAnalysis"]], "nellie_napari.nellie_analysis.NellieAnalysis": [[9, 3, 1, "", "check_for_adjacency_map"], [9, 3, 1, "", "draw_stats"], [9, 3, 1, "", "export_data"], [9, 3, 1, "", "get_csvs"], [9, 3, 1, "", "get_index"], [9, 3, 1, "", "get_stats"], [9, 3, 1, "", "on_attr_selected"], [9, 3, 1, "", "on_hist_change"], [9, 3, 1, "", "on_level_selected"], [9, 3, 1, "", "on_log_scale"], [9, 3, 1, "", "on_t_change"], [9, 3, 1, "", "overlay"], [9, 3, 1, "", "plot_data"], [9, 3, 1, "", "post_init"], [9, 3, 1, "", "reset"], [9, 3, 1, "", "rewrite_dropdown"], [9, 3, 1, "", "save_graph"], [9, 3, 1, "", "set_default_dropdowns"], [9, 3, 1, "", "set_ui"], [9, 3, 1, "", "toggle_match_t"], [9, 3, 1, "", "toggle_mean_med"]], "nellie_napari.nellie_fileselect": [[9, 2, 1, "", "NellieFileSelect"]], "nellie_napari.nellie_fileselect.NellieFileSelect": [[9, 3, 1, "", "change_channel"], [9, 3, 1, "", "change_time"], [9, 3, 1, "", "check_available_dims"], [9, 3, 1, "", "handle_dim_order_changed"], [9, 3, 1, "", "handle_t_changed"], [9, 3, 1, "", "handle_xy_changed"], [9, 3, 1, "", "handle_z_changed"], [9, 3, 1, "", "init_ui"], [9, 3, 1, "", "initialize_folder"], [9, 3, 1, "", "initialize_single_file"], [9, 3, 1, "", "on_change"], [9, 3, 1, "", "on_confirm"], [9, 3, 1, "", "on_preview"], [9, 3, 1, "", "on_process"], [9, 3, 1, "", "select_filepath"], [9, 3, 1, "", "select_folder"], [9, 3, 1, "", "validate_path"]], "nellie_napari.nellie_home": [[9, 2, 1, "", "Home"]], "nellie_napari.nellie_home.Home": [[9, 3, 1, "", "screenshot"]], "nellie_napari.nellie_loader": [[9, 2, 1, "", "NellieLoader"]], "nellie_napari.nellie_loader.NellieLoader": [[9, 3, 1, "", "add_tabs"], [9, 3, 1, "", "go_process"], [9, 3, 1, "", "on_tab_change"], [9, 3, 1, "", "reset"]], "nellie_napari.nellie_processor": [[9, 2, 1, "", "NellieProcessor"]], "nellie_napari.nellie_processor.NellieProcessor": [[9, 3, 1, "", "check_file_existence"], [9, 3, 1, "", "open_directory"], [9, 3, 1, "", "post_init"], [9, 3, 1, "", "reset_status"], [9, 3, 1, "", "run_feature_export"], [9, 3, 1, "", "run_mocap"], [9, 3, 1, "", "run_nellie"], [9, 3, 1, "", "run_preprocessing"], [9, 3, 1, "", "run_reassign"], [9, 3, 1, "", "run_segmentation"], [9, 3, 1, "", "run_tracking"], [9, 3, 1, "", "set_status"], [9, 3, 1, "", "set_ui"], [9, 3, 1, "", "turn_off_buttons"], [9, 3, 1, "", "turn_off_pipeline"], [9, 3, 1, "", "update_status"]], "nellie_napari.nellie_settings": [[9, 2, 1, "", "Settings"]], "nellie_napari.nellie_settings.Settings": [[9, 3, 1, "", "post_init"], [9, 3, 1, "", "set_ui"]], "nellie_napari.nellie_visualizer": [[9, 2, 1, "", "NellieVisualizer"]], "nellie_napari.nellie_visualizer.NellieVisualizer": [[9, 3, 1, "", "check_3d"], [9, 3, 1, "", "check_file_existence"], [9, 3, 1, "", "on_track_selected"], [9, 3, 1, "", "open_mocap_image"], [9, 3, 1, "", "open_preprocess_image"], [9, 3, 1, "", "open_raw"], [9, 3, 1, "", "open_reassign_image"], [9, 3, 1, "", "open_segment_image"], [9, 3, 1, "", "post_init"], [9, 3, 1, "", "set_scale"], [9, 3, 1, "", "set_ui"], [9, 3, 1, "", "track_all"]], "tests": [[11, 0, 0, "-", "unit"]], "tests.unit": [[11, 0, 0, "-", "test_frangi_filter"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "function", "Python function"], "2": ["py", "class", "Python class"], "3": ["py", "method", "Python method"]}, "objtypes": {"0": "py:module", "1": "py:function", "2": "py:class", "3": "py:method"}, "terms": {"0": [4, 5, 6, 7], "1": [4, 6, 7], "2": [4, 6], "256": 8, "2d": 4, "3d": 4, "5": [6, 7], "A": 4, "No": 5, "The": 4, "across": 4, "add": 0, "add_tab": [2, 9], "aggreg": 4, "aggregate_branch_metr": 4, "aggregate_component_metr": 4, "aggregate_node_metr": 4, "aggregate_stats_for_class": [3, 4], "aggregate_voxel_metr": 4, "all": 4, "all_tracks_for_label": [2, 3], "alloc": 4, "allocate_memori": [3, 5], "alpha_sq": 6, "analysi": 4, "ang_vel": 4, "angular": 4, "append": 4, "append_to_arrai": [3, 4], "ar": 4, "area": 4, "arrai": 4, "aspect": 4, "assign": 4, "associ": 4, "axi": 4, "backward": 4, "base": [4, 5, 6, 7, 9], "base_logg": [2, 3], "bbox": [3, 8], "beta_sq": 6, "between": 4, "bool": 4, "border": 4, "border_mask": 4, "bound": 4, "box": 4, "branch": [3, 4], "branch_area": 4, "branch_aspect_ratio": 4, "branch_axis_length_maj": 4, "branch_axis_length_min": 4, "branch_ext": 4, "branch_label": 4, "branch_length": 4, "branch_solid": 4, "branch_thick": 4, "branch_tortuos": 4, "calcul": 4, "centroid": 4, "ch": [3, 5], "change_ax": [3, 5], "change_channel": [2, 9], "change_dim_r": [3, 5], "change_selected_channel": [3, 5], "change_tim": [2, 9], "check_3d": [2, 9], "check_available_dim": [2, 9], "check_coord": 4, "check_file_exist": [2, 9], "check_for_adjacency_map": [2, 9], "child_class": 4, "class": [4, 5, 6, 7, 9], "classifi": 4, "clean_skel": 6, "cli": 2, "column": 4, "compon": [3, 4], "component_label": 4, "contain": 4, "content": 2, "converg": 4, "convert": 4, "coord": [4, 7], "coordin": 4, "correspond": 4, "creat": 4, "create_feature_arrai": [3, 4], "create_output_path": [3, 5], "csv": 4, "data": [4, 5], "default": 4, "depend": 4, "descript": 5, "detail": 0, "dict": 4, "dictionari": 4, "dim": 5, "dimens": 4, "direction": 4, "directionality_rel": 4, "directori": 3, "disk": 4, "displai": 4, "distanc": [4, 6], "distance_check": [3, 4], "diverg": 4, "draw_stat": [2, 9], "dtype": 5, "e": 4, "each": 4, "end": 5, "end_fram": 7, "end_t": 7, "entir": 4, "etc": 4, "event": 9, "export_data": [2, 9], "ext": 5, "extent": 4, "extract": 4, "fals": [3, 5, 6], "featur": 4, "feature_extract": [2, 3], "features_to_sav": 4, "file": [3, 4], "file_info": [3, 5], "file_path": 5, "fileinfo": [3, 5], "filepath": [5, 9], "filter": [2, 3], "find_metadata": [3, 5], "first": 4, "float": 5, "flow": 4, "flow_interpol": [2, 3], "flow_interpolator_bw": 4, "flow_interpolator_fw": 4, "flowinterpol": [3, 4, 7], "for_nelli": 5, "forward": [4, 7], "frame": 4, "frob_thresh": 6, "from": 4, "function": 4, "g": 4, "gener": [2, 3], "get_csv": [2, 9], "get_index": [2, 9], "get_memmap": [3, 5], "get_reshaped_imag": [3, 8], "get_stat": [2, 9], "global": 4, "go_process": [2, 9], "gpu_funct": [2, 3], "handl": 4, "handle_dim_order_chang": [2, 9], "handle_t_chang": [2, 9], "handle_xy_chang": [2, 9], "handle_z_chang": [2, 9], "header": 4, "hierarch": [2, 3], "hierarchi": [3, 4], "home": [2, 9], "hu_track": [2, 3], "humomenttrack": [3, 7], "i": 4, "im": 8, "im_border_mask": 4, "im_branch_reassign": 4, "im_dist": 4, "im_info": [2, 3, 4, 6, 7, 8], "im_obj_reassign": 4, "im_pixel_class": 4, "im_raw": 4, "im_skel": 4, "im_struct": 4, "imag": [3, 4, 8], "image_nam": 4, "iminfo": [3, 4, 5, 6, 7], "includ": 4, "index": 9, "indic": 4, "init_ui": [2, 9], "initi": [3, 7], "initialize_fold": [2, 9], "initialize_single_fil": [2, 9], "instanc": 4, "int": [4, 7], "intens": 4, "inter_vari": 8, "interpol": 4, "interpolate_all_backward": [3, 7], "interpolate_all_forward": [3, 7], "interpolate_coord": [3, 7], "iter": 4, "label": [2, 3, 4], "label_branch": 4, "label_compon": 4, "label_im_path": 7, "label_num": 7, "labeltrack": [3, 7], "layer": 9, "length": 4, "level": 4, "like": 4, "limit": 4, "lin_vel": 4, "linear": 4, "list": 4, "list_of_idx": 4, "load": 4, "load_metadata": [3, 5], "main": [0, 2, 4], "major": 4, "marker": [3, 6], "mask": [4, 6], "match_voxel": [3, 7], "matrix": 8, "max_distance_um": 7, "max_radius_um": 6, "memmap": 4, "memori": 4, "messag": 4, "metadata": 4, "metric": 4, "min_radius_um": 6, "min_track_num": 7, "minor": 4, "mocap_mark": [2, 3], "modul": [0, 2], "motil": 4, "name": 4, "napari": 9, "napari_view": 9, "nbin": 8, "ndarrai": 4, "nelli": 9, "nellie_analysi": 2, "nellie_fileselect": 2, "nellie_hom": 2, "nellie_load": 2, "nellie_napari": [0, 2], "nellie_processor": 2, "nellie_set": 2, "nellie_visu": 2, "nellieanalysi": [2, 9], "nelliefileselect": [2, 9], "nellieload": [2, 9], "nellieprocessor": [2, 9], "nellievisu": [2, 9], "network": [2, 3], "new_ax": 5, "new_siz": 5, "node": [3, 4], "node_dim0_lim": 4, "node_dim1_lim": 4, "node_dim2_lim": 4, "node_label": 4, "node_thick": 4, "node_voxel_idx": 4, "none": [3, 4, 5, 6, 7, 8, 9], "num_sigma": 6, "num_t": [3, 4, 6, 7, 8], "number": 4, "numpi": 4, "object": [4, 5, 6, 7], "om": 5, "on_attr_select": [2, 9], "on_chang": [2, 9], "on_confirm": [2, 9], "on_hist_chang": [2, 9], "on_level_select": [2, 9], "on_log_scal": [2, 9], "on_preview": [2, 9], "on_process": [2, 9], "on_t_chang": [2, 9], "on_tab_chang": [2, 9], "on_track_select": [2, 9], "open_directori": [2, 9], "open_mocap_imag": [2, 9], "open_preprocess_imag": [2, 9], "open_raw": [2, 9], "open_reassign_imag": [2, 9], "open_segment_imag": [2, 9], "option": 4, "organelle_area": 4, "organelle_axis_length_maj": 4, "organelle_axis_length_min": 4, "organelle_ext": 4, "organelle_solid": 4, "otsu_effect": [3, 8], "otsu_thresh_intens": [3, 6], "otsu_threshold": [3, 8], "output": 4, "output_dir": [3, 5], "output_path": 5, "over": 4, "overlai": [2, 9], "packag": [0, 2], "parent": 9, "pathwai": 4, "pipeline_path": 5, "pixel": 4, "plot_data": [2, 9], "post_init": [2, 9], "preprocess": 4, "presenc": 4, "process": 4, "process_directori": [2, 3], "process_fil": [2, 3], "qtabwidget": 9, "qwidget": 9, "r": 5, "ratio": 4, "raw": 4, "re": 4, "read_fil": [3, 5], "read_mod": 5, "reassign": 4, "reassigned_label": 4, "relat": 4, "remove_edg": [3, 6], "remove_intermedi": [3, 5], "reset": [2, 9], "reset_statu": [2, 9], "restructuredtext": 0, "result": 4, "return_memmap": 5, "rewrite_dropdown": [2, 9], "run": [2, 4, 6, 7], "run_feature_export": [2, 9], "run_mocap": [2, 9], "run_nelli": [2, 9], "run_preprocess": [2, 9], "run_reassign": [2, 9], "run_segment": [2, 9], "run_track": [2, 9], "save": 4, "save_graph": [2, 9], "save_ome_tiff": [3, 5], "screenshot": [2, 9], "see": 0, "segment": [2, 3], "select_filepath": [2, 9], "select_fold": [2, 9], "select_temporal_rang": [3, 5], "set": [2, 9], "set_default_dropdown": [2, 9], "set_scal": [2, 9], "set_statu": [2, 9], "set_ui": [2, 9], "skeleton": 4, "skip": 4, "skip_coord": 7, "skip_nod": 4, "snr_clean": 6, "solid": 4, "sourc": [1, 3, 4, 5, 6, 7, 8, 9], "space": 4, "start": 5, "start_fram": 7, "start_t": 7, "state": 9, "statist": 4, "stats_to_aggreg": 4, "statu": 4, "store": 4, "str": [5, 7], "structur": 4, "submodul": [2, 10], "subpackag": 2, "substr": 3, "syntax": 0, "t": [4, 7], "t_slice": 8, "test": [0, 2], "test_frangi_filt": [2, 10], "test_im_info": [2, 10], "text": 9, "thick": 4, "threshold": [3, 6], "tif": 5, "time": 4, "titl": 9, "to_append": 4, "toggle_match_t": [2, 9], "toggle_mean_m": [2, 9], "torch_xp": [2, 3], "tortuos": 4, "track": [2, 3], "track_al": [2, 9], "transform": 4, "triangle_threshold": [3, 8], "true": [4, 5, 6, 7], "tupl": 4, "turn_off_button": [2, 9], "turn_off_pipelin": [2, 9], "type": 4, "unit": [2, 10], "updat": 4, "update_statu": [2, 9], "us": [0, 4], "use_im": 6, "util": [2, 3], "validate_path": [2, 9], "valu": 4, "vec01": 4, "vec12": 4, "vector": 4, "veloc": 4, "verger": 4, "verifi": [2, 3], "viewer": [4, 6, 7, 9], "vox_next": 7, "vox_prev": 7, "voxel": [3, 4], "voxel_idx": 4, "voxel_reassign": [2, 3], "voxelreassign": [3, 7], "whether": 4, "which": 4, "x": 4, "y": 4, "your": 0, "z": 4}, "titles": ["Nellie documentation", "main module", "nellie", "nellie package", "nellie.feature_extraction package", "nellie.im_info package", "nellie.segmentation package", "nellie.tracking package", "nellie.utils package", "nellie_napari package", "tests package", "tests.unit package"], "titleterms": {"all_tracks_for_label": 7, "attribut": 4, "base_logg": 8, "cli": 3, "content": [0, 3, 4, 5, 6, 7, 8, 9, 10, 11], "document": 0, "feature_extract": 4, "filter": 6, "flow_interpol": 7, "gener": 8, "gpu_funct": 8, "hierarch": 4, "hu_track": 7, "im_info": 5, "label": 6, "main": 1, "mocap_mark": 6, "modul": [1, 3, 4, 5, 6, 7, 8, 9, 10, 11], "nelli": [0, 2, 3, 4, 5, 6, 7, 8], "nellie_analysi": 9, "nellie_fileselect": 9, "nellie_hom": 9, "nellie_load": 9, "nellie_napari": 9, "nellie_processor": 9, "nellie_set": 9, "nellie_visu": 9, "network": 6, "packag": [3, 4, 5, 6, 7, 8, 9, 10, 11], "paramet": 4, "return": 4, "run": 3, "segment": 6, "submodul": [3, 4, 5, 6, 7, 8, 9, 11], "subpackag": [3, 10], "test": [10, 11], "test_frangi_filt": 11, "test_im_info": 11, "torch_xp": 8, "track": 7, "unit": 11, "util": 8, "verifi": 5, "voxel_reassign": 7}}) \ No newline at end of file diff --git a/nellie/feature_extraction/hierarchical.py b/nellie/feature_extraction/hierarchical.py index f257924..d538d94 100644 --- a/nellie/feature_extraction/hierarchical.py +++ b/nellie/feature_extraction/hierarchical.py @@ -1052,6 +1052,26 @@ def run(self): def aggregate_stats_for_class(child_class, t, list_of_idxs): + """ + Aggregates statistical metrics (mean, standard deviation, min, max, sum) for features of a given class at + a specific time frame. + + Parameters + ---------- + child_class : object + The class from which the feature data is extracted. It should contain a list of statistics to aggregate + (i.e., `stats_to_aggregate`) and corresponding feature arrays. + t : int + The time frame index for which the aggregation is performed. + list_of_idxs : list of lists + A list where each sublist contains the indices of data points that should be grouped together for aggregation. + + Returns + ------- + dict + A dictionary where the keys are feature names and the values are dictionaries containing aggregated + statistics for each feature (mean, standard deviation, min, max, sum). + """ # initialize a dictionary to hold lists of aggregated stats for each stat name # aggregate_stats = { # stat_name: {"mean": [], "std_dev": [], "25%": [], "50%": [], "75%": [], "min": [], "max": [], "range": [], @@ -1330,6 +1350,23 @@ def run(self): def distance_check(border_mask, check_coords, spacing): + """ + Calculates the minimum distance between given coordinates and a border mask using a KD-tree. + + Parameters + ---------- + border_mask : numpy.ndarray + A binary mask where the border is marked as `True`. + check_coords : numpy.ndarray + Coordinates of the points for which distances to the border will be calculated. + spacing : tuple or list + The spacing of the image dimensions (used to scale the coordinates). + + Returns + ------- + numpy.ndarray + An array of distances from each point in `check_coords` to the nearest border point. + """ border_coords = np.argwhere(border_mask) * spacing border_tree = spatial.cKDTree(border_coords) dist, _ = border_tree.query(check_coords * spacing, k=1)