diff --git a/Readme.md b/Readme.md index eeab64c..e0ba4c5 100644 --- a/Readme.md +++ b/Readme.md @@ -1,6 +1,6 @@ -October 04, 2024 +October 27, 2024 -Version: 1.0.3 +Version: 1.1.0 diff --git a/example/params_file.yml b/example/params_file.yml index c5b6a3c..1e2c50e 100644 --- a/example/params_file.yml +++ b/example/params_file.yml @@ -51,10 +51,14 @@ - tracking: particles_file_name: particles + method: multiframe frame_start: 0 N_frames: None d_max: 1.0 dv_max: 1.0 + max_dt: 3 + Ns: 5 + NSR_threshold: 0.25 mean_flow: [0.0, 0.0, 0.0] plot_candidate_graph: False save_name: trajectories diff --git a/example/workflow.py b/example/workflow.py index 7705cab..c445c5b 100755 --- a/example/workflow.py +++ b/example/workflow.py @@ -1002,7 +1002,8 @@ def do_tracking(self): ''' Will perform the tracking using the file given parameters. ''' - from myptv.tracking_mod import tracker_four_frames + from myptv.tracking_mod import tracker_four_frames, tracker_multiframe + from myptv.tracking_mod import traj_NSR, fill_in_trajectory from numpy import array from os import getcwd, listdir from os.path import exists as pathExists @@ -1017,63 +1018,124 @@ def do_tracking(self): candidate_graph = self.get_param('tracking', 'plot_candidate_graph') save_name = self.get_param('tracking', 'save_name') + method = self.get_param('tracking', 'method') + max_dt = self.get_param('tracking', 'max_dt') + Ns = self.get_param('tracking', 'Ns') + NSR_th = self.get_param('tracking', 'NSR_threshold') - # initiate the tracker - t4f = tracker_four_frames(particles_fm, - d_max=d_max, - dv_max=dv_max, - mean_flow=array(mean_flow), - store_candidates = candidate_graph) - #setting up the frame range - ts = int(t4f.times[0]) - te = int(t4f.times[-1]) + if method not in ['multiframe', 'fourframe']: + raise ValueError("method can only be 'multiframe' or 'four_frame'.") + + - print('available particles time range: %d -> %d'%(ts,te),'\n') - if candidate_graph and (te-ts)>100: - print('Warning: you are about to plot a candidate graph with') - print('more than 100 frames.') - ans = input('Do you wish to proceed (1 = Yes , else = No)? ') + if method=='fourframe': + + # initiate the tracker + t4f = tracker_four_frames(particles_fm, + d_max=d_max, + dv_max=dv_max, + mean_flow=array(mean_flow), + store_candidates = candidate_graph) + + #setting up the frame range + ts = int(t4f.times[0]) + te = int(t4f.times[-1]) + + print('available particles time range: %d -> %d'%(ts,te),'\n') - if ans=='1': - pass + if candidate_graph and (te-ts)>100: + print('Warning: you are about to plot a candidate graph with') + print('more than 100 frames.') + ans = input('Do you wish to proceed (1 = Yes , else = No)? ') + + if ans=='1': + pass + + else: + print('quitting ') + return None + + + if frame_start is not None: + if frame_start>=ts and frame_start <=te: + ts = frame_start + else: + print('Warning: frame_start outside the available frame range') + #raise ValueError('frame_start outside the available frame range') + if N_frames is None: + frames = range(ts, te) else: - print('quitting ') - return None + try: + frames = range(ts, ts+N_frames) + except: + tp = type(frames) + msg = 'N_frames must be an integer or None (given %s).'%tp + raise TypeError(msg) + + # do the tracking + t4f.track_all_frames(frames=frames) + + # print some statistics + tr = array(t4f.return_connected_particles()) + untracked = len(tr[tr[:,0]==-1]) + tot = len(tr) + print('untracked fraction:', untracked/tot) + print('tracked per frame:', (tot-untracked)/len(set(tr[:,-1]))) + if candidate_graph: + t4f.plot_candidate_graph() - if frame_start is not None: - if frame_start>=ts and frame_start <=te: - ts = frame_start - else: - print('Warning: frame_start outside the available frame range') - #raise ValueError('frame_start outside the available frame range') - if N_frames is None: - frames = range(ts, te) - else: - try: - frames = range(ts, ts+N_frames) - except: - tp = type(frames) - msg = 'N_frames must be an integer or None (given %s).'%tp - raise TypeError(msg) - # do the tracking - t4f.track_all_frames(frames=frames) - # print some statistics - tr = array(t4f.return_connected_particles()) - untracked = len(tr[tr[:,0]==-1]) - tot = len(tr) - print('untracked fraction:', untracked/tot) - print('tracked per frame:', (tot-untracked)/len(set(tr[:,-1]))) - if candidate_graph: - t4f.plot_candidate_graph() + elif method=='multiframe': + + tmf = tracker_multiframe(particles_fm, max_dt, Ns, + d_max=d_max, dv_max=dv_max, + NSR_th=NSR_th, + mean_flow=array(mean_flow)) + + #setting up the frame range + ts = int(tmf.times[0]) + te = int(tmf.times[-1]) + print('available particles time range: %d -> %d'%(ts,te),'\n') + + if candidate_graph: + print('\nNote, candidate graph can only be plotted with') + print('fourframe tracker, so it is skipped.') + + + if frame_start is not None: + if frame_start>=ts and frame_start <=te: + ts = frame_start + else: + print('Warning: frame_start outside the available frame range') + #raise ValueError('frame_start outside the available frame range') + + if N_frames is None: + frames = range(ts, te) + else: + try: + frames = range(ts, ts+N_frames) + except: + tp = type(frames) + msg = 'N_frames must be an integer or None (given %s).'%tp + raise TypeError(msg) + + + # doing the tracking + frame_skips = max([int(Ns/3), 1]) + tmf.track_frames(f0=ts, fe=te, frame_skips=frame_skips) + + # interpolating missing points + tmf.interpolate_trajs() + + # save the results if save_name is not None: @@ -1084,18 +1146,24 @@ def do_tracking(self): usr = input('(1=yes, else=no)') if usr == '1': print('\n','saving file.') - t4f.save_results(save_name) + if method=='fourframe': t4f.save_results(save_name) + elif method=='multiframe': tmf.save_results(save_name) + else: print('\n', 'skipped saving.') else: print('\n','saving file.') - t4f.save_results(save_name) + if method=='fourframe': t4f.save_results(save_name) + elif method=='multiframe': tmf.save_results(save_name) print('\n', 'Finished tracking.') + + + def do_smoothing(self): ''' Will smooth the trajectories using the specified file given paramters. diff --git a/myptv/tracking_mod.py b/myptv/tracking_mod.py index 7dc72fc..44ab95f 100644 --- a/myptv/tracking_mod.py +++ b/myptv/tracking_mod.py @@ -1099,8 +1099,8 @@ def track_frames(self, f0=None, fe=None, frame_skips=2): msg = 'Tracking forward and backward, round 1' for frm in tqdm.tqdm(range(f0, fe, frame_skips), desc=msg): - tmf.build_trajectories_from_frame(frm, p_bar=False) - tmf.build_trajectories_from_frame(fe+f0-frm-1, + self.build_trajectories_from_frame(frm, p_bar=False) + self.build_trajectories_from_frame(fe+f0-frm-1, backwards=True, p_bar=False) msg = 'Tracking forward and backward, round 2' @@ -1109,8 +1109,8 @@ def track_frames(self, f0=None, fe=None, frame_skips=2): fe-int(frame_skips/2), frame_skips), desc=msg): - tmf.build_trajectories_from_frame(frm, p_bar=False) - tmf.build_trajectories_from_frame(fe+f0-frm-1, + self.build_trajectories_from_frame(frm, p_bar=False) + self.build_trajectories_from_frame(fe+f0-frm-1, backwards=True, p_bar=False) print('') @@ -1289,7 +1289,7 @@ def tracking_movie(self, particle_identifier): This animates the tracking of a given particle with all the candidates ''' - ret = tmf.build_candidate_trajectories(particle_identifier)[0] + ret = self.build_candidate_trajectories(particle_identifier)[0] for tr in ret: xmin = min(min(tr, key=lambda x: min(x[:,1]))[:,1]) - 2*self.d_max @@ -1312,7 +1312,7 @@ def tracking_movie(self, particle_identifier): ax.plot(tr[whr,1], tr[whr,2], 'o-', alpha=0.3) for frm in range(f0, fe+1): - for p in tmf.particles[frm]: + for p in self.particles[frm]: if xmin
=9.5.0'], author='Ron Shnapp', diff --git a/user_manual/figs/traj_image.jpg b/user_manual/figs/traj_image.jpg index 3b0cb8e..1ddf35f 100644 Binary files a/user_manual/figs/traj_image.jpg and b/user_manual/figs/traj_image.jpg differ diff --git a/user_manual/user_manual.aux b/user_manual/user_manual.aux index 6a539e6..4cc6f55 100644 --- a/user_manual/user_manual.aux +++ b/user_manual/user_manual.aux @@ -112,88 +112,88 @@ \newlabel{sec:workflow_calibration_with_particles}{{3.6}{16}{Calibration with particles}{subsection.3.6}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.7}Smoothing}{16}{subsection.3.7}} \newlabel{sec:workflow_smooth}{{3.7}{16}{Smoothing}{subsection.3.7}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Stitching}{16}{subsection.3.8}} -\newlabel{sec:workflow_stitch}{{3.8}{16}{Stitching}{subsection.3.8}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}2D tracking guide}{16}{subsection.3.9}} -\newlabel{sec:2D_tracking}{{3.9}{16}{2D tracking guide}{subsection.3.9}{}} \@writefile{lof}{\contentsline {figure}{\numberline {11}{\ignorespaces An example for experimental setup for 2D tracking. Note that the camera doesn't have to be perpendicular to the particles' plane and that the particles don't have to be at $z=0$. \relax }}{17}{figure.caption.20}} \newlabel{fig:2D_tracking}{{11}{17}{An example for experimental setup for 2D tracking. Note that the camera doesn't have to be perpendicular to the particles' plane and that the particles don't have to be at $z=0$. \relax }{figure.caption.20}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.8}Stitching}{17}{subsection.3.8}} +\newlabel{sec:workflow_stitch}{{3.8}{17}{Stitching}{subsection.3.8}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.9}2D tracking guide}{17}{subsection.3.9}} +\newlabel{sec:2D_tracking}{{3.9}{17}{2D tracking guide}{subsection.3.9}{}} \@writefile{toc}{\contentsline {subsection}{\numberline {3.10}Manual Matching GUI}{17}{subsection.3.10}} \newlabel{sec:man_match}{{3.10}{17}{Manual Matching GUI}{subsection.3.10}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces Instructions of how to use the manual matching GUI \relax }}{18}{figure.caption.23}} -\newlabel{fig:man_match}{{12}{18}{Instructions of how to use the manual matching GUI \relax }{figure.caption.23}{}} \citation{Shnapp2023} \citation{Shnapp2023} -\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces Trajectory segments plotted using the workflow \texttt {plot\_trajectories} command. A 30 frames long segment is shown from a turbulent flow dataset taken from Ref.~\cite {Shnapp2023}. \relax }}{19}{figure.caption.25}} -\newlabel{fig:trajectory_plot}{{13}{19}{Trajectory segments plotted using the workflow \texttt {plot\_trajectories} command. A 30 frames long segment is shown from a turbulent flow dataset taken from Ref.~\cite {Shnapp2023}. \relax }{figure.caption.25}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.11}Fiber tracking}{19}{subsection.3.11}} -\newlabel{sec:fibers}{{3.11}{19}{Fiber tracking}{subsection.3.11}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {3.12}Plotting the results}{19}{subsection.3.12}} -\newlabel{sec:plot_trajectories}{{3.12}{19}{Plotting the results}{subsection.3.12}{}} -\@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces The \texttt {params\_file.yml} parameters for the \textbf {segmentation} step. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{20}{table.caption.12}} -\newlabel{tab:segment_params}{{4}{20}{The \texttt {params\_file.yml} parameters for the \textbf {segmentation} step. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.12}{}} -\@writefile{lot}{\contentsline {table}{\numberline {5}{\ignorespaces The \texttt {params\_file.yml} parameters for the \textbf {matching} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{21}{table.caption.15}} -\newlabel{tab:matching}{{5}{21}{The \texttt {params\_file.yml} parameters for the \textbf {matching} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }{table.caption.15}{}} -\@writefile{lot}{\contentsline {table}{\numberline {6}{\ignorespaces The \texttt {params\_file.yml} parameters for the \textbf {tracking} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{21}{table.caption.16}} -\newlabel{tab:tracking_params}{{6}{21}{The \texttt {params\_file.yml} parameters for the \textbf {tracking} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }{table.caption.16}{}} -\@writefile{lot}{\contentsline {table}{\numberline {7}{\ignorespaces The \texttt {params\_file.yml} parameters for the calibration with particles step.\relax }}{22}{table.caption.17}} -\@writefile{lot}{\contentsline {table}{\numberline {8}{\ignorespaces The \texttt {params\_file.yml} parameters for the smoothing step. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{22}{table.caption.18}} -\@writefile{lot}{\contentsline {table}{\numberline {9}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {smoothing} command. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{22}{table.caption.19}} -\@writefile{lot}{\contentsline {table}{\numberline {10}{\ignorespaces The \texttt {params\_file.yml} parameters for 2D tracking. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{23}{table.caption.21}} -\newlabel{tab:2d_tracking}{{10}{23}{The \texttt {params\_file.yml} parameters for 2D tracking. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.21}{}} -\@writefile{lot}{\contentsline {table}{\numberline {11}{\ignorespaces The \texttt {params\_file.yml} parameters for the manual matching operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{23}{table.caption.22}} -\newlabel{tab:man_match}{{11}{23}{The \texttt {params\_file.yml} parameters for the manual matching operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.22}{}} -\@writefile{lot}{\contentsline {table}{\numberline {12}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {fiber\_orientations} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{23}{table.caption.24}} -\newlabel{tab:fibers}{{12}{23}{The \texttt {params\_file.yml} parameters for the \texttt {fiber\_orientations} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.24}{}} -\@writefile{lot}{\contentsline {table}{\numberline {13}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{24}{table.caption.26}} -\newlabel{tab:plotting_parameter}{{13}{24}{The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.26}{}} -\@writefile{lot}{\contentsline {table}{\numberline {14}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{24}{table.caption.27}} -\newlabel{tab:animation_parameter}{{14}{24}{The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.27}{}} -\@writefile{toc}{\contentsline {section}{\numberline {4}Imaging module - \texttt {imaging\_mod.py}}{25}{section.4}} -\newlabel{sec:image_mod}{{4}{25}{Imaging module - \texttt {imaging\_mod.py}}{section.4}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}The \texttt {camera} object}{25}{subsection.4.1}} -\newlabel{sec:camera}{{4.1}{25}{The \texttt {camera} object}{subsection.4.1}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces The structure of a camera file. The files are simple text files where each row corresponds to a specific parameter and the values in each row are separated by a white space. \relax }}{25}{figure.caption.28}} -\newlabel{fig:camfiles}{{14}{25}{The structure of a camera file. The files are simple text files where each row corresponds to a specific parameter and the values in each row are separated by a white space. \relax }{figure.caption.28}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}The \texttt {imsys} object}{25}{subsection.4.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}The \texttt {Cal\_image\_coord} object}{26}{subsection.4.3}} -\newlabel{sec:calpointreader}{{4.3}{26}{The \texttt {Cal\_image\_coord} object}{subsection.4.3}{}} -\@writefile{toc}{\contentsline {section}{\numberline {5}Camera calibration - \texttt {calibrate\_mod.py}}{26}{section.5}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}The \texttt {calibrate} object}{26}{subsection.5.1}} -\newlabel{sec:calibrate_obj}{{5.1}{26}{The \texttt {calibrate} object}{subsection.5.1}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}The \texttt {calibrate\_with\_particles} object}{27}{subsection.5.2}} -\newlabel{sec:calibrate_with_particles_obj}{{5.2}{27}{The \texttt {calibrate\_with\_particles} object}{subsection.5.2}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.3}The \texttt {gui\_final\_cal.py} file}{27}{subsection.5.3}} -\@writefile{toc}{\contentsline {subsection}{\numberline {5.4}The \texttt {gui\_initial\_cal.py} file}{27}{subsection.5.4}} -\@writefile{toc}{\contentsline {section}{\numberline {6}Particle segmentation - \texttt {segmentation\_mod.py}}{27}{section.6}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}The \texttt {particle\_segmentation} object}{28}{subsection.6.1}} -\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}The \texttt {loop\_segmentation} object}{28}{subsection.6.2}} -\@writefile{toc}{\contentsline {section}{\numberline {7}Particle matching - \texttt {particle\_matching\_mod.py}}{28}{section.7}} -\newlabel{sec:matching}{{7}{28}{Particle matching - \texttt {particle\_matching\_mod.py}}{section.7}{}} -\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces An example of a text file holding the segmentation resuls and the description of the different columns. \relax }}{29}{figure.caption.29}} -\newlabel{fig:blobfile}{{15}{29}{An example of a text file holding the segmentation resuls and the description of the different columns. \relax }{figure.caption.29}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.1}The \texttt {matching\_with\_marching\_particles\_algorithm} object}{29}{subsection.7.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.11}Fiber tracking}{18}{subsection.3.11}} +\newlabel{sec:fibers}{{3.11}{18}{Fiber tracking}{subsection.3.11}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {3.12}Plotting the results}{18}{subsection.3.12}} +\newlabel{sec:plot_trajectories}{{3.12}{18}{Plotting the results}{subsection.3.12}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {12}{\ignorespaces Instructions of how to use the manual matching GUI \relax }}{19}{figure.caption.23}} +\newlabel{fig:man_match}{{12}{19}{Instructions of how to use the manual matching GUI \relax }{figure.caption.23}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {13}{\ignorespaces Trajectory segments plotted using the workflow \texttt {plot\_trajectories} command. A 30 frames long segment is shown from a turbulent flow dataset taken from Ref.~\cite {Shnapp2023}. \relax }}{20}{figure.caption.25}} +\newlabel{fig:trajectory_plot}{{13}{20}{Trajectory segments plotted using the workflow \texttt {plot\_trajectories} command. A 30 frames long segment is shown from a turbulent flow dataset taken from Ref.~\cite {Shnapp2023}. \relax }{figure.caption.25}{}} +\@writefile{lot}{\contentsline {table}{\numberline {4}{\ignorespaces The \texttt {params\_file.yml} parameters for the \textbf {segmentation} step. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{21}{table.caption.12}} +\newlabel{tab:segment_params}{{4}{21}{The \texttt {params\_file.yml} parameters for the \textbf {segmentation} step. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.12}{}} +\@writefile{lot}{\contentsline {table}{\numberline {5}{\ignorespaces The \texttt {params\_file.yml} parameters for the \textbf {matching} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{22}{table.caption.15}} +\newlabel{tab:matching}{{5}{22}{The \texttt {params\_file.yml} parameters for the \textbf {matching} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }{table.caption.15}{}} +\@writefile{lot}{\contentsline {table}{\numberline {6}{\ignorespaces The \texttt {params\_file.yml} parameters for the \textbf {tracking} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{23}{table.caption.16}} +\newlabel{tab:tracking_params}{{6}{23}{The \texttt {params\_file.yml} parameters for the \textbf {tracking} step. All paths to files are relative to the \texttt {workflow.py} script.\relax }{table.caption.16}{}} +\@writefile{lot}{\contentsline {table}{\numberline {7}{\ignorespaces The \texttt {params\_file.yml} parameters for the calibration with particles step.\relax }}{24}{table.caption.17}} +\@writefile{lot}{\contentsline {table}{\numberline {8}{\ignorespaces The \texttt {params\_file.yml} parameters for the smoothing step. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{24}{table.caption.18}} +\@writefile{lot}{\contentsline {table}{\numberline {9}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {smoothing} command. All paths to files are relative to the \texttt {workflow.py} script.\relax }}{24}{table.caption.19}} +\@writefile{lot}{\contentsline {table}{\numberline {10}{\ignorespaces The \texttt {params\_file.yml} parameters for 2D tracking. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{25}{table.caption.21}} +\newlabel{tab:2d_tracking}{{10}{25}{The \texttt {params\_file.yml} parameters for 2D tracking. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.21}{}} +\@writefile{lot}{\contentsline {table}{\numberline {11}{\ignorespaces The \texttt {params\_file.yml} parameters for the manual matching operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{25}{table.caption.22}} +\newlabel{tab:man_match}{{11}{25}{The \texttt {params\_file.yml} parameters for the manual matching operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.22}{}} +\@writefile{lot}{\contentsline {table}{\numberline {12}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {fiber\_orientations} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{25}{table.caption.24}} +\newlabel{tab:fibers}{{12}{25}{The \texttt {params\_file.yml} parameters for the \texttt {fiber\_orientations} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.24}{}} +\@writefile{lot}{\contentsline {table}{\numberline {13}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{26}{table.caption.26}} +\newlabel{tab:plotting_parameter}{{13}{26}{The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.26}{}} +\@writefile{lot}{\contentsline {table}{\numberline {14}{\ignorespaces The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }}{26}{table.caption.27}} +\newlabel{tab:animation_parameter}{{14}{26}{The \texttt {params\_file.yml} parameters for the \texttt {plot\_trajectories} operation. All paths to files are relative to the \texttt {workflow.py} script. \relax }{table.caption.27}{}} +\@writefile{toc}{\contentsline {section}{\numberline {4}Imaging module - \texttt {imaging\_mod.py}}{27}{section.4}} +\newlabel{sec:image_mod}{{4}{27}{Imaging module - \texttt {imaging\_mod.py}}{section.4}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.1}The \texttt {camera} object}{27}{subsection.4.1}} +\newlabel{sec:camera}{{4.1}{27}{The \texttt {camera} object}{subsection.4.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {14}{\ignorespaces The structure of a camera file. The files are simple text files where each row corresponds to a specific parameter and the values in each row are separated by a white space. \relax }}{27}{figure.caption.28}} +\newlabel{fig:camfiles}{{14}{27}{The structure of a camera file. The files are simple text files where each row corresponds to a specific parameter and the values in each row are separated by a white space. \relax }{figure.caption.28}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.2}The \texttt {imsys} object}{27}{subsection.4.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {4.3}The \texttt {Cal\_image\_coord} object}{28}{subsection.4.3}} +\newlabel{sec:calpointreader}{{4.3}{28}{The \texttt {Cal\_image\_coord} object}{subsection.4.3}{}} +\@writefile{toc}{\contentsline {section}{\numberline {5}Camera calibration - \texttt {calibrate\_mod.py}}{28}{section.5}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.1}The \texttt {calibrate} object}{28}{subsection.5.1}} +\newlabel{sec:calibrate_obj}{{5.1}{28}{The \texttt {calibrate} object}{subsection.5.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.2}The \texttt {calibrate\_with\_particles} object}{29}{subsection.5.2}} +\newlabel{sec:calibrate_with_particles_obj}{{5.2}{29}{The \texttt {calibrate\_with\_particles} object}{subsection.5.2}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.3}The \texttt {gui\_final\_cal.py} file}{29}{subsection.5.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {5.4}The \texttt {gui\_initial\_cal.py} file}{29}{subsection.5.4}} +\@writefile{toc}{\contentsline {section}{\numberline {6}Particle segmentation - \texttt {segmentation\_mod.py}}{29}{section.6}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.1}The \texttt {particle\_segmentation} object}{30}{subsection.6.1}} +\@writefile{toc}{\contentsline {subsection}{\numberline {6.2}The \texttt {loop\_segmentation} object}{30}{subsection.6.2}} +\@writefile{toc}{\contentsline {section}{\numberline {7}Particle matching - \texttt {particle\_matching\_mod.py}}{30}{section.7}} +\newlabel{sec:matching}{{7}{30}{Particle matching - \texttt {particle\_matching\_mod.py}}{section.7}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {15}{\ignorespaces An example of a text file holding the segmentation resuls and the description of the different columns. \relax }}{31}{figure.caption.29}} +\newlabel{fig:blobfile}{{15}{31}{An example of a text file holding the segmentation resuls and the description of the different columns. \relax }{figure.caption.29}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.1}The \texttt {matching\_with\_marching\_particles\_algorithm} object}{31}{subsection.7.1}} \citation{Ouellette2006} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.2}The \texttt {match\_blob\_files} object (Legacy)}{30}{subsection.7.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.3}The \texttt {matching} object (Legacy)}{30}{subsection.7.3}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.4}The \texttt {matching\_using\_time} object (Legacy)}{30}{subsection.7.4}} -\@writefile{toc}{\contentsline {subsection}{\numberline {7.5}The \texttt {initiate\_time\_matching} object (Legacy)}{30}{subsection.7.5}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.2}The \texttt {match\_blob\_files} object (Legacy)}{32}{subsection.7.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.3}The \texttt {matching} object (Legacy)}{32}{subsection.7.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.4}The \texttt {matching\_using\_time} object (Legacy)}{32}{subsection.7.4}} +\@writefile{toc}{\contentsline {subsection}{\numberline {7.5}The \texttt {initiate\_time\_matching} object (Legacy)}{32}{subsection.7.5}} \citation{Ouellette2006} -\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces An example of a text file holding the triangulated particles' resuls and the description of the different columns. In this example there were three cameras. The blob number columns give the index of the blobs corresponding to any particle at the this specific frame number; a value of -1 in one of the rows means that no blob was used to stereo-match the particle in this row for this particular camera. \relax }}{31}{figure.caption.30}} -\newlabel{fig:particlefile}{{16}{31}{An example of a text file holding the triangulated particles' resuls and the description of the different columns. In this example there were three cameras. The blob number columns give the index of the blobs corresponding to any particle at the this specific frame number; a value of -1 in one of the rows means that no blob was used to stereo-match the particle in this row for this particular camera. \relax }{figure.caption.30}{}} -\@writefile{toc}{\contentsline {section}{\numberline {8}Tracking in 3D - \texttt {tracking\_mod.py}}{31}{section.8}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.1}The \texttt {tracker\_four\_frames} object}{31}{subsection.8.1}} -\newlabel{sec:four_frames}{{8.1}{31}{The \texttt {tracker\_four\_frames} object}{subsection.8.1}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {16}{\ignorespaces An example of a text file holding the triangulated particles' resuls and the description of the different columns. In this example there were three cameras. The blob number columns give the index of the blobs corresponding to any particle at the this specific frame number; a value of -1 in one of the rows means that no blob was used to stereo-match the particle in this row for this particular camera. \relax }}{33}{figure.caption.30}} +\newlabel{fig:particlefile}{{16}{33}{An example of a text file holding the triangulated particles' resuls and the description of the different columns. In this example there were three cameras. The blob number columns give the index of the blobs corresponding to any particle at the this specific frame number; a value of -1 in one of the rows means that no blob was used to stereo-match the particle in this row for this particular camera. \relax }{figure.caption.30}{}} +\@writefile{toc}{\contentsline {section}{\numberline {8}Tracking in 3D - \texttt {tracking\_mod.py}}{33}{section.8}} +\@writefile{toc}{\contentsline {subsection}{\numberline {8.1}The \texttt {tracker\_four\_frames} object}{33}{subsection.8.1}} +\newlabel{sec:four_frames}{{8.1}{33}{The \texttt {tracker\_four\_frames} object}{subsection.8.1}{}} \citation{Luthi2005,Shnapp2019} -\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces Example of a trajectory file and the column definitions. For Trajectory id being a non-negative integer, rows with the same Trajectory id correspond to the same trajectory; rows with Trajectory id being -1 are samples that could not be linked with the given tracking parameters. \relax }}{32}{figure.caption.31}} -\newlabel{fig:trajfile}{{17}{32}{Example of a trajectory file and the column definitions. For Trajectory id being a non-negative integer, rows with the same Trajectory id correspond to the same trajectory; rows with Trajectory id being -1 are samples that could not be linked with the given tracking parameters. \relax }{figure.caption.31}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.2}The \texttt {tracker\_two\_frames} object}{32}{subsection.8.2}} -\@writefile{toc}{\contentsline {subsection}{\numberline {8.3}The \texttt {tracker\_nearest\_neighbour} object}{32}{subsection.8.3}} -\@writefile{toc}{\contentsline {section}{\numberline {9}Trajectory smoothing - \texttt {traj\_smoothing\_mod.py}}{32}{section.9}} +\@writefile{lof}{\contentsline {figure}{\numberline {17}{\ignorespaces Example of a trajectory file and the column definitions. For Trajectory id being a non-negative integer, rows with the same Trajectory id correspond to the same trajectory; rows with Trajectory id being -1 are samples that could not be linked with the given tracking parameters. \relax }}{34}{figure.caption.31}} +\newlabel{fig:trajfile}{{17}{34}{Example of a trajectory file and the column definitions. For Trajectory id being a non-negative integer, rows with the same Trajectory id correspond to the same trajectory; rows with Trajectory id being -1 are samples that could not be linked with the given tracking parameters. \relax }{figure.caption.31}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {8.2}The \texttt {tracker\_two\_frames} object}{34}{subsection.8.2}} +\@writefile{toc}{\contentsline {subsection}{\numberline {8.3}The \texttt {tracker\_nearest\_neighbour} object}{34}{subsection.8.3}} +\@writefile{toc}{\contentsline {section}{\numberline {9}Trajectory smoothing - \texttt {traj\_smoothing\_mod.py}}{34}{section.9}} \citation{Xu2008} -\@writefile{toc}{\contentsline {subsection}{\numberline {9.1}The \texttt {smooth\_trajectories} object}{33}{subsection.9.1}} -\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces Example file holding the results of smoothed trajectories, and the description for each column. Note also the unsmoothed samples at the bottom of the file. \relax }}{33}{figure.caption.32}} -\newlabel{fig:smoothedfile}{{18}{33}{Example file holding the results of smoothed trajectories, and the description for each column. Note also the unsmoothed samples at the bottom of the file. \relax }{figure.caption.32}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {9.1}The \texttt {smooth\_trajectories} object}{35}{subsection.9.1}} +\@writefile{lof}{\contentsline {figure}{\numberline {18}{\ignorespaces Example file holding the results of smoothed trajectories, and the description for each column. Note also the unsmoothed samples at the bottom of the file. \relax }}{35}{figure.caption.32}} +\newlabel{fig:smoothedfile}{{18}{35}{Example file holding the results of smoothed trajectories, and the description for each column. Note also the unsmoothed samples at the bottom of the file. \relax }{figure.caption.32}{}} \bibdata{bib_myPTV} \bibcite{Virant1997}{{1}{}{{}}{{}}} \bibcite{Maas1993}{{2}{}{{}}{{}}} @@ -205,6 +205,6 @@ \bibcite{Shnapp2019}{{8}{}{{}}{{}}} \bibstyle{unsrt} \providecommand\NAT@force@numbers{}\NAT@force@numbers -\@writefile{toc}{\contentsline {section}{\numberline {10}Trajectory stitching - \texttt {traj\_stitching\_mod.py}}{34}{section.10}} -\newlabel{sec:stitching}{{10}{34}{Trajectory stitching - \texttt {traj\_stitching\_mod.py}}{section.10}{}} -\@writefile{toc}{\contentsline {subsection}{\numberline {10.1}The \texttt {traj\_stitching} object}{34}{subsection.10.1}} +\@writefile{toc}{\contentsline {section}{\numberline {10}Trajectory stitching - \texttt {traj\_stitching\_mod.py}}{36}{section.10}} +\newlabel{sec:stitching}{{10}{36}{Trajectory stitching - \texttt {traj\_stitching\_mod.py}}{section.10}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {10.1}The \texttt {traj\_stitching} object}{36}{subsection.10.1}} diff --git a/user_manual/user_manual.log b/user_manual/user_manual.log index 37815e3..0b1b376 100644 --- a/user_manual/user_manual.log +++ b/user_manual/user_manual.log @@ -1,4 +1,4 @@ -This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex 2023.7.13) 23 OCT 2024 23:02 +This is pdfTeX, Version 3.14159265-2.6-1.40.18 (TeX Live 2017/Debian) (preloaded format=pdflatex 2023.7.13) 27 OCT 2024 13:23 entering extended mode restricted \write18 enabled. %&-line parsing enabled. @@ -524,11 +524,11 @@ LaTeX Font Info: Try loading font information for U+msb on input line 57. (/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd File: umsb.fd 2013/01/14 v3.01 AMS symbols B ) -<./figs/traj_image.jpg, id=235, 559.8516pt x 465.4188pt> +<./figs/traj_image.jpg, id=235, 474.8139pt x 435.7881pt> File: ./figs/traj_image.jpg Graphic file (type jpg)