Week 10 - Aug 1st, 2023

Published: 08/01/2023

What I did this week

In the last week, we had decided to generate a DTD which would make the model more robust by accounting for situations where we had almost all the parameters as non zero, however in that situation the signals weren't matching exactly. So this week I fixed that issue, and so now we can safely say that all DTDs would match the ground truth signals, no matter which parameters are non zero and what changes we make. This was made possible because we were able to figure out the correct order of ccti parameters which is basically covariance parameters which takes the root2 and '2' factor into consideration.
Also, I removed the mean, axial, radial and kurtosis functions from our CTI Fit method because I realized that while importing the DKI Fit class, we're also importing all the necessary features. But I still need to write tests for these methods to make sure that it's all working properly. 
The most important task this week has been the implementation of ls_fit_cti, cls_fit_cti and split_cti_params function as this is the most important function in CTI Fit class. I also wrote tests for this class. This involved me understanding the previously implemented similar functions and the parameters that these functions required. One such example is "data" which basically can be interpreted as the "cti_pred_signals". 
The importance of writing tests is to see if given the signals, gtab1 and gtab2 can we obtain the cti_parameters correctly or not. So, I'm still analyzing all the functions which have been implemented in DKI, and the tests that have been implemented for them.
So, the important testing function in order to be able to is the test_fit function in CTI. 
Among all that, I also implemented the test_split_cti_params and test_cti_fits in the test_cti.py file.
Also, in CTI, even though we're not implementing the radial, axial, anisotropic and mean kurtosis ourselves, we still need to implement tests for these. So in order to write tests for the radial, axial, anisotropic and mean kurtosis ground truth values would be when we call the functions individually, the ones which are outside the Fit class. I also implemented tests for these.
One other point to note is that in DKI, we just needed to make sure that we've multiple b-values. But in case of CTI, we also need to have symmetric b1 and b2s and also parallel and perpendicular experiments. 
Now, in the case of CTI, we not only consider the different components of kurtosis, but we also pay attention to the sources of kurtosis. The three sources of kurtosis that we identify in CTI is isotropic kurtosis, anisotropic kurtosis and microscopic kurtosis. I managed to look through the formulas present in the original CTI paper, and implement functions for these.

Things to do next week 

Even though I've implemented the function which could calculate the sources of kurtosis, it's still outside the CTI Fit class, and needs to be incorporated in the Fit class. I also need to write tests for these functions. In order to do this, I intend on referring to the QTI paper to look for similarities. 
Also, even though I've written tests for the ls_fit_cti and cls_fit_cti function, I still need to run these tests and make sure that it's working as expected. 
I also need to make sure that my model runs in case of given multi-voxels. A voxel in a 3D image which can be thought of as similar to a pixel in a 2D image in that both represent a discrete element of the image data. In DIPY, a voxel model refers to a representation of a 3D image volume as a collection of individual voxels, each of which represents a small volume element within the image.
After I write tests for multi-voxel cases, and if my model is working on everything, then I'll move on to running my model on real-time data. 
If I get stuck anywhere, then I intend on writing a tutorial for the CTI implementation .