Replies: 5 comments 7 replies
-
Let me know if there's something I can do to ease the process. |
Beta Was this translation helpful? Give feedback.
-
Excellent initiative, Aurélien @aTrotier! I wholeheartedly support it, but I don't think I have the bandwidth at the moment to help with the implementation right now. I am adding @nbwuzhe here, who maintains our Gadgetron server at @BRAIN-TO Maybe we can get some funding to get a few more people involved (and paid) for such an effort? |
Beta Was this translation helpful? Give feedback.
-
Gadgetron can send different object to julia. One of them is an In MRIBase.jl, the Ideally, we should get accumulate the gadgetron @tknopp Do you have a suggestion about how we can merge the 2 implementations ? |
Beta Was this translation helpful? Give feedback.
-
So, Gadgetron.jl predates MRIBase.jl and MRIFiles.jl being separate packages, and all of MRIReco.jl was considered too large a dependence. MRIFiles.jl unfortunately only supports reading a (very useful) subset of MRD files, and no writing at all. Using the MRIBase.jl types does not seem ideal to me. The profile object contains redundant data (particularly the size of the data and trajectories are stored both in the AcquisitionHeader and in the actual fields themselves), which makes it a pain to serialize again if the values are not kept in sync manually. In general, the MRIReco libraries are focused on going as fast as possible from profiles to AcquisitionData, which makes a ton of sense for offline reconstruction. All of this being said, I do applaud the goal of a unified MRI stack for Julia. Would updating the types in MRIBase.jl be palatable, or are they widely used outside of MRD support? Essentially adding RawAcquisitionHeader from Gadgetron.jl to MRIBase and remove number_of_samples and active_channels from AcquisitionHeader. That way we could move Gadgetron.jl to the MRIBase types and @aTrotier 's life would be easy. |
Beta Was this translation helpful? Give feedback.
-
So, the issue here stems from the fact that the C AcquisitionHeader contains not just the header information, but also the size of the data and trajectory arrays. In pretty much any other language, that data is already stored with the array, so it becomes easy to write code like function pad_acq(acq::Acquisition)
acq.data = padarray(acq.data, Pad(1, 1)) # Now acq.head.number_of_samples is wrong
end The ISMRMRD python library spends a lot of energy trying to keep these variables in sync. Gadgetron will silently break if you try to serialize an acquisition like this. I realize this seems like a small issue, but I've seen a lot of users shooting themselves in the foot with this.
A last thing is the use of a Dict of the MRD header. This makes it really easy to consume a header, but really hard to write a correct one. The latter is important for things like dicom generation for different scanner vendors. |
Beta Was this translation helpful? Give feedback.
-
Hi,
I am starting to play around with the julia interface to Gadgetron (last version here) that @dchansen already developed it and it seems to work.
I will first convert one of my paper which use matlab as an example (and also maybe compare the reconstruction time between the 2 interfaces).
I am expecting to have some issue or reflexion when using it with MRIReco.jl because Gadgetron.jl is using specific structure :
Maybe we can start a little task force to discuss how we should interface it in order to perform online reconstruction
Some of you are interested in this project ? @mrikasper @alexjaffray
Beta Was this translation helpful? Give feedback.
All reactions