A better way to create a response function for CSD

This implementation includes the recursive calibration of the response function for CSD, Using an FA threshold is not a very robust method.It is dependent on the dataset (non-informed used subjectivity), and still depends on the diffusion tensor (FA and first eigenvector), which has low accuracy at high b-value. This function recursively calibrates the response function, for more information see Tax et al. NeuroImage 2014.

This implementation is slow only on one line (788) which calls real_sph_harm. I would appreciate any help to optimize this function. Thx!
Sorry @ChantalTax, I started shooting my mouth off before I gave this a proper look over. This looks really awesome overall. I think you're right, there is no way to avoid calling `real_sh_harm` inside of this loop, which is too bad because the scipy implementation is quite slow (but I hear that might be improving soon).

Looking over this, the main thing I notice is that you're not enforcing axial symmetry on the response function. I think that might be a good idea because you're using a vector alignment to get your rotation matrix, this leaves the axial rotation angle ambiguous (which makes sense for this application), but then I think you should force the response function to be axially symmetric (`m != 0` harmonics have zero coefficient). This might also allow you to improve performance because you don't need to build the full B_dwi matrix every time. That being said, you've spent a lot more time on this than I have, so just let me know if I'm rambling nonsense.

In terms of performance, can i suggest using a HemiSphere instead of a full sphere. The HemiSphere implementation in dipy takes advantages of the antipodal symmetry inherent in diffusion imaging. It works everywhere a sphere is needed (but doesn't look as good for displaying ODFs/FODs and such), but is twice as fast. You can import the HemiSphere version of 'symmetric724` by using `from dipy.reconst.peaks import default_sphere`, or you can build a HemiSphere from any sphere by using `hemisphere = HemiSphere.from_sphere(sphere)`. This will eliminate the colinear lines in your B_dwi matrix, which aren't helping you anyways.

Thanks for you great contribution, let me know if you need any help with my suggestions above.