Team:Montpellier/Tracking/Software

Introduction

To test the effect of our peptides and antibodies on sperm we needed a way to quantify the motility of spermatozoa. Ideally, we should see a decrease in sperm motility in presence of our molecules or our bacteria. In order to quantify the effect of spermicides on sperm motility, we developed a software to track spermatozoa trajectories on a frame by frame basis. The software then calculates the mean velocity of each spermatozoon enabling a quantitative analysis of sperm motility. Our tracking tool is based on the “Trackpy” package.

Below we explain the general principles of our tracking software. At the bottom of this page we also provide a link to our python script, a step-by-step tutorial in python notebook format (.ipynb) in which you can test the analysis workflow with an example video (also provided), and a pdf of the same tutorial.

General steps to analyze the sperm motility :


First of all the video is recorded by the camera and saved in TIFF format (figure 1).


Figure 1: Video of spermatozoa



Figure 2: Frame by frame identification of the spermatozoa thanks to the software


Once all spermatozoa are detected, the software analyzes the position frame by frame and provides as an output the trajectory of each spermatozoa (figure 3). This is a tricky step in which the algorithm needs to link the objects identified in one frame to the following frame and hence get the position (x,y) of each red circle as a function of time. However, trackpy sometimes “loses” the spermatozoa from one frame to the other (and one spermatozoon could then generate two or more trajectories creating biases in the measurements), or two spermatozoa could come very close to each other during the length of the video (and their trajectories might mix up). We optimised the parameters of the method provided by the trackpy package in order to avoid these biases. Still, we manually checked all the videos analysed and corrected by hand the trajectories that were not accurate. To solve punctual errors we correctly linked misbehaving objects frame to frame. The final results can be observed in the video below. We successfully identify trajectories that allow us to extract information on the motility of the spermatozoa


Figure 3: Trajectory of spermatozoa predicted by the software


The trajectories enable us to calculate the velocities of each spermatozoa. We first computed the instantaneous velocity of the spermatozoa along their trajectories, and then we smoothed the velocity with a linear filter (running average). We then calculated the mean velocity and the median velocity of each trajectory. We then repeated the procedure for many videos in different conditions. More in particular, we tested the effect of different concentrations of nisin which is supposed to have a strong effect on the spermatozoa motility. We also measured the velocity of spermatozoa without nisin but after 1h 30 from.... We obtained histograms representing the distribution of the velocity of spermatozoa for each condition(figure 4). Figure 4: Histograms of the velocities of the spermatozoa for different concentrations of nisin. N represent the number of spermatozoa successfully tracked for each case.

Figure 4 :Histogramm

The functions used in the script :

We start using the tp.locate function and put the good parameter that fit the circle to the object that has an average diameter.
We detect for each frame spermatozoa by using the tp.batch function and we link each frame with another and annotate the same particle at each frame.
We filter the data that we get by using tp.filter to keep only the spermatozoa that we detect only for 60FPs. We make other filtration as the filter by intensity to keep only the spermatozoa that have an intensity high specific mass. We add another filtration that it’s done manually in case the previous filtration doesn’t succeed to delete as the noise of background. Also, we combine the trajectory manually for the same spermatozoa.
We add to the script line of code to make a video with trajectory. To see the efficacity of the tracking.
We use the function tp.compute_drift to delete the drift case by the flux of the medium.
We add to the DataFrame other columns that transform from pixel x and y position, to Um and final we calculate the velocity. To have more flexibility to use the data for each Spermatozoa we transform the DataFrame to Nestedictionary that contain dictionary and each dictionary contain dx, dy, and velocity for spermatozoa.

Explanation of the script line by line


Here you can find the script and its explanation line by line : tutorial .