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) Package pdftex.def Info: ./figs/traj_image.jpg used on input line 62. -(pdftex.def) Requested size: 284.52756pt x 236.53664pt. +(pdftex.def) Requested size: 284.52756pt x 261.13573pt. LaTeX Font Info: Try loading font information for T1+cmtt on input line 71. (/usr/share/texlive/texmf-dist/tex/latex/base/t1cmtt.fd @@ -717,22 +717,22 @@ Overfull \hbox (45.82526pt too wide) in paragraph at lines 899--932 [] -Overfull \hbox (43.61609pt too wide) in paragraph at lines 951--976 +Overfull \hbox (43.61609pt too wide) in paragraph at lines 957--990 [][] [] -Overfull \hbox (51.07397pt too wide) in paragraph at lines 991--1013 +Overfull \hbox (51.07397pt too wide) in paragraph at lines 1005--1027 [][] [] -Overfull \hbox (45.82526pt too wide) in paragraph at lines 1032--1051 +Overfull \hbox (45.82526pt too wide) in paragraph at lines 1046--1065 [][] [] -Overfull \hbox (38.36737pt too wide) in paragraph at lines 1065--1080 +Overfull \hbox (38.36737pt too wide) in paragraph at lines 1079--1094 [][] [] @@ -740,103 +740,105 @@ Overfull \hbox (38.36737pt too wide) in paragraph at lines 1065--1080 <./figs/2D_tracking_setup.pdf, id=615, 359.69543pt x 273.00352pt> File: ./figs/2D_tracking_setup.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/2D_tracking_setup.pdf used on input line 1102. +Package pdftex.def Info: ./figs/2D_tracking_setup.pdf used on input line 1116. (pdftex.def) Requested size: 227.62204pt x 172.76378pt. -Overfull \hbox (27.86993pt too wide) in paragraph at lines 1126--1143 +Overfull \hbox (27.86993pt too wide) in paragraph at lines 1140--1157 [][] [] -<./figs/man_match.pdf, id=624, 597.50786pt x 845.04686pt> +[17 <./figs/2D_tracking_setup.pdf>] +<./figs/man_match.pdf, id=642, 597.50786pt x 845.04686pt> File: ./figs/man_match.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/man_match.pdf used on input line 1182. +Package pdftex.def Info: ./figs/man_match.pdf used on input line 1196. (pdftex.def) Requested size: 341.43306pt x 482.88089pt. -[17 <./figs/2D_tracking_setup.pdf>] [18 <./figs/man_match.pdf>] -Overfull \hbox (19.66132pt too wide) in paragraph at lines 1205--1206 + +Overfull \hbox (19.66132pt too wide) in paragraph at lines 1219--1220 []\T1/cmr/m/n/10 To cal-cu-late the ori-en-ta-tions in 3D, use the work-flow sc ript with the ac-tion '\T1/cmtt/m/n/10 fiber_orientations\T1/cmr/m/n/10 '. [] -Overfull \hbox (17.3725pt too wide) in paragraph at lines 1216--1234 +Overfull \hbox (17.3725pt too wide) in paragraph at lines 1230--1248 [][] [] -<./figs/trajectory_plot.pdf, id=658, 459.96844pt x 392.96812pt> +<./figs/trajectory_plot.pdf, id=647, 459.96844pt x 392.96812pt> File: ./figs/trajectory_plot.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/trajectory_plot.pdf used on input line 1250. +Package pdftex.def Info: ./figs/trajectory_plot.pdf used on input line 1264. (pdftex.def) Requested size: 227.62204pt x 194.46884pt. -Overfull \hbox (1.62634pt too wide) in paragraph at lines 1259--1274 +Overfull \hbox (1.62634pt too wide) in paragraph at lines 1273--1288 [][] [] -Overfull \hbox (24.39856pt too wide) in paragraph at lines 1282--1298 +Overfull \hbox (24.39856pt too wide) in paragraph at lines 1296--1312 [][] [] -[19 <./figs/trajectory_plot.pdf>] [20] [21] [22] [23] [24] +[18] [19 <./figs/man_match.pdf>] [20 <./figs/trajectory_plot.pdf>] [21] +[22] [23] [24] [25] [26] LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <14.4> not available -(Font) Font shape `T1/cmtt/m/n' tried instead on input line 1318. +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 1332. LaTeX Font Info: Font shape `T1/cmtt/bx/n' in size <12> not available -(Font) Font shape `T1/cmtt/m/n' tried instead on input line 1325. -<./figs/camera_files.pdf, id=709, 508.10204pt x 141.02348pt> +(Font) Font shape `T1/cmtt/m/n' tried instead on input line 1339. +<./figs/camera_files.pdf, id=719, 508.10204pt x 141.02348pt> File: ./figs/camera_files.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/camera_files.pdf used on input line 1355. +Package pdftex.def Info: ./figs/camera_files.pdf used on input line 1369. (pdftex.def) Requested size: 426.79135pt x 118.45676pt. - [25 + [27 <./figs/camera_files.pdf>] -Overfull \hbox (1.44354pt too wide) in paragraph at lines 1425--1426 +Overfull \hbox (1.44354pt too wide) in paragraph at lines 1439--1440 []\T1/cmtt/m/n/10 fineCalibration(maxiter=500) \T1/cmr/m/n/10 - This func-tion will solve for the co-ef-fi-cients of the quadratic [] -[26] [27] -<./figs/blob_file.pdf, id=780, 223.10614pt x 155.32921pt> +[28] [29] +<./figs/blob_file.pdf, id=790, 223.10614pt x 155.32921pt> File: ./figs/blob_file.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/blob_file.pdf used on input line 1554. +Package pdftex.def Info: ./figs/blob_file.pdf used on input line 1568. (pdftex.def) Requested size: 284.52756pt x 198.10016pt. - [28] [29 <./figs/blob_file.pdf>] -<./figs/particle_file.pdf, id=822, 390.14703pt x 291.52518pt> + [30] [31 <./figs/blob_file.pdf>] +<./figs/particle_file.pdf, id=831, 390.14703pt x 291.52518pt> File: ./figs/particle_file.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/particle_file.pdf used on input line 1631. +Package pdftex.def Info: ./figs/particle_file.pdf used on input line 1645. (pdftex.def) Requested size: 341.43306pt x 255.13727pt. -Overfull \hbox (18.38263pt too wide) in paragraph at lines 1640--1641 +Overfull \hbox (18.38263pt too wide) in paragraph at lines 1654--1655 \T1/cmr/m/n/10 we run the rel-e-vant func-tions: \T1/cmtt/m/n/10 get_voxel_dict ionary() $\OMS/cmsy/m/n/10 !$ \T1/cmtt/m/n/10 list_candidates() $\OMS/cmsy/m/n/ 10 !$ \T1/cmtt/m/n/10 get_particles()\T1/cmr/m/n/10 , [] -[30] [31 <./figs/particle_file.pdf>] -<./figs/trajectory_files.pdf, id=858, 470.98941pt x 297.17282pt> +[32] [33 <./figs/particle_file.pdf>] +<./figs/trajectory_files.pdf, id=867, 470.98941pt x 297.17282pt> File: ./figs/trajectory_files.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/trajectory_files.pdf used on input line 1702. +Package pdftex.def Info: ./figs/trajectory_files.pdf used on input line 1716. (pdftex.def) Requested size: 284.52756pt x 179.52937pt. - [32 <./figs/trajectory_files.pdf>] -<./figs/smoothed_trajfile.pdf, id=882, 514.2885pt x 471.065pt> + [34 <./figs/trajectory_files.pdf>] +<./figs/smoothed_trajfile.pdf, id=892, 514.2885pt x 471.065pt> File: ./figs/smoothed_trajfile.pdf Graphic file (type pdf) -Package pdftex.def Info: ./figs/smoothed_trajfile.pdf used on input line 1748. +Package pdftex.def Info: ./figs/smoothed_trajfile.pdf used on input line 1762. (pdftex.def) Requested size: 341.43306pt x 312.73677pt. -[33 <./figs/smoothed_trajfile.pdf>] (./user_manual.bbl) -Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1800. - [34] -Package atveryend Info: Empty hook `AfterLastShipout' on input line 1800. +[35 <./figs/smoothed_trajfile.pdf>] (./user_manual.bbl) +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 1814. + [36] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 1814. (./user_manual.aux) -Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1800. -Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1800. +Package atveryend Info: Executing hook `AtVeryEndDocument' on input line 1814. +Package atveryend Info: Executing hook `AtEndAfterFileList' on input line 1814. Package rerunfilecheck Info: File `user_manual.out' has not changed. (rerunfilecheck) Checksum: 6B1FC7423BCD656429F1554E9D5FD6BE;4619. @@ -844,12 +846,12 @@ Package rerunfilecheck Info: File `user_manual.out' has not changed. LaTeX Font Warning: Some font shapes were not available, defaults substituted. -Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1800. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 1814. ) Here is how much of TeX's memory you used: - 10238 strings out of 493756 - 149403 string characters out of 6152244 - 287877 words of memory out of 5000000 + 10240 strings out of 493756 + 149417 string characters out of 6152244 + 291877 words of memory out of 5000000 13317 multiletter control sequences out of 15000+600000 25774 words of font info for 69 fonts, out of 8000000 for 9000 645 hyphenation exceptions out of 8191 @@ -873,10 +875,10 @@ sr/share/texmf/fonts/type1/public/cm-super/sfsx2488.pfb> -Output written on user_manual.pdf (37 pages, 4447441 bytes). +Output written on user_manual.pdf (39 pages, 3696309 bytes). PDF statistics: - 1040 PDF objects out of 1200 (max. 8388607) - 893 compressed objects within 9 object streams - 240 named destinations out of 1000 (max. 500000) + 1051 PDF objects out of 1200 (max. 8388607) + 901 compressed objects within 10 object streams + 242 named destinations out of 1000 (max. 500000) 577 words of extra memory for PDF output out of 10000 (max. 10000000) diff --git a/user_manual/user_manual.pdf b/user_manual/user_manual.pdf index 637c8c7..259e3e9 100644 Binary files a/user_manual/user_manual.pdf and b/user_manual/user_manual.pdf differ diff --git a/user_manual/user_manual.tex b/user_manual/user_manual.tex index 38058d7..2bcc31d 100644 --- a/user_manual/user_manual.tex +++ b/user_manual/user_manual.tex @@ -66,7 +66,7 @@ \begin{minipage}{14cm} {\small \sffamily - Version: 1.0.4 \\ + Version: 1.1.0 \\ Last updated: \today \\ Github repository: \url{https://github.com/ronshnapp/MyPTV} \\ Get help \& interact with our community: \url{https://github.com/ronshnapp/MyPTV/discussions}\\ @@ -939,7 +939,13 @@ \subsection{Matching}\label{sec:workflow_match} \subsection{Tracking}\label{sec:workflow_track} -The tracking step is used to link particles in the lab-space coordinates in time, thus forming the 3D trajectories. The tracking algorithm in MyPTV uses the 4 frames best estimate method described in~\cite{Ouellette2006}. The description of the parameters used in the tracking step are given in Tab.~\ref{tab:tracking_params}. +The tracking step is used to link particles in the lab-space coordinates in time, thus forming the 3D trajectories. To initiate the tracking we use the workflow command \texttt{"tracking"}. + +There are two tracking methods that have been implemented in MyPTV and the users can choose which one suits their needs best. The first algorithm is the "4 frames best estimate" tracking algorithm that was described in Ref.~\cite{Ouellette2006}. The second method, tentatively called here "multiframe" is a new adaptation of the best estimate algorithm. Its main advantage is that it is capable of linking particle trajectories over more than one frame, namely in cases where the particle was miss-identified in one of the images or if the was a glitch in its stereo matching. Its downside is that it might take longer time to process in particle-dense experiments and that it will not yield trajectories shorter than a given length tentatively called here the noise scale (\texttt{Ns}). The multiframe algorithm was not yet described in a paper, as it is a very recent addition. The description of the parameters used in the tracking step are given in Tab.~\ref{tab:tracking_params}. + + + + @@ -955,6 +961,8 @@ \subsection{Tracking}\label{sec:workflow_track} \texttt{particles\_file\_name} & path name of the file which holds the 3D coordinates of particles, namely the results of the matching step \\[.2cm] + \texttt{method} & Here we choose the algorithm used for the tracking; can be either 'multiframe' of 'fourframe' (see Sec.~\ref{sec:workflow_track}). \\[.2cm] + \texttt{frame\_start} & if \texttt{None} will start tracking from the first available frame. If an integer it will start the tracking from this given number. \\[.2cm] \texttt{N\_frames} & if \texttt{None} will iterate over particles in all frames; if an integer will only track particles in the first \texttt{N} frames of the particles file\\[.2cm] @@ -963,6 +971,12 @@ \subsection{Tracking}\label{sec:workflow_track} \texttt{dv\_max} & the maximum allowable change in velocity in lab space coordinates per frame (e.g. mm/frame) \\[.2cm] + \texttt{max\_dt} & The maximum allowed skip in frames over which a trajectory will be formed if using the multiframe method; e.g. if a particle is seen in frame 1, 2, 5, and 6, it will only be fully tracked if \texttt{max\_dt}$\geq 2$. Note that the missing frames (3 and 4 in the example) are subsequently interpolated using a cubic polynomial. \\[.2cm] + + \texttt{Ns} & A parameter of the multiframe method. It should be an odd integer. During tracking, links are formed only if a local signal to noise ratio does not exceed a certain level. The signal to noise ratio is calculated over windows of size \texttt{Ns}, with typical sizes of a few samples (e.g. 11). Note that the algorithm cannot build trajectories shorter than \texttt{Ns}.\\[.2cm] + + \texttt{NSR\_threshold} & The $NSR$ is a parameter of the multiframe algorithm used to assess the quality of a trajectories based on the notion that physical trajectories are smooth. The \texttt{NSR} takes values fraction positive values from 0 to infinity. A trajectory with $NSR=0$ is considered really good while one with $NSR>1$ is considered of quite low quality. Thus the \texttt{NSR\_threshold} is the highest acceptable \texttt{NSR} value. Trajectories with \texttt{NSR} above the given threshold are discarded. \\[.2cm] + \texttt{mean\_flow} & Adds a constant mean flow parameter that helps the tracking algorithm to track particles in flows with a constant drift; the format is [vx, vy, vz] in e.g. mm/frame. \\[.2cm]