diff --git a/dev/.documenter-siteinfo.json b/dev/.documenter-siteinfo.json index 92ea1d2..08cf718 100644 --- a/dev/.documenter-siteinfo.json +++ b/dev/.documenter-siteinfo.json @@ -1 +1 @@ -{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-12-02T13:00:15","documenter_version":"1.8.0"}} \ No newline at end of file +{"documenter":{"julia_version":"1.11.1","generation_timestamp":"2024-12-02T16:14:59","documenter_version":"1.8.0"}} \ No newline at end of file diff --git a/dev/api/index.html b/dev/api/index.html index f796939..8584be3 100644 --- a/dev/api/index.html +++ b/dev/api/index.html @@ -1,2 +1,2 @@ -API · SEQ_BRUKER_a_MP2RAGE_CS_360.jl
SEQ_BRUKER_a_MP2RAGE_CS_360.RawAcquisitionData_MP2RAGEMethod
RawAcquisitionData_MP2RAGE(b::BrukerFile)

Convert a Bruker dataset acquired with the a_MP2RAGE_CS_360 sequence into a RawAcquisitionData object compatible with the MRIReco functions.

Input : - b::BrukerFile

Output : - raw::RawAcquisitionData

source
SEQ_BRUKER_a_MP2RAGE_CS_360.params_from_seqMethod
params_from_seq(b::BrukerFile)

Extracts MP2RAGE sequence parameters from a Bruker file and returns them in a ParamsMP2RAGE structure.

Arguments

  • b::BrukerFile: Bruker file containing sequence parameter information.

Returns

A ParamsMP2RAGE structure containing key sequence timings and settings for MP2RAGE reconstruction.

source
SEQ_BRUKER_a_MP2RAGE_CS_360.write_bids_MP2RAGEFunction
  write_bids_MP2RAGE(d::Dict,subname::AbstractString,folder="")

This function writes data from a dictionary (d) in BIDS (Brain Imaging Data Structure) format for MP2RAGE acquisitions.

Arguments:

  • d (Dict): A dictionary containing the data to be written. Expected key-value pairs:

    • im_reco (Array): 5D array containing the reconstructed images (x,y,z,NR,TI)
    • MP2RAGE (Array): Combined MP2RAGE image data. (x,y,z,NR)
    • T1map (Array): Calculated T1 map from MP2RAGE images. (x,y,z,NR)
    • params_prot (Dict): Protocol parameters extracted from the Bruker file.
    • params_MP2RAGE (Struct): Dictionary containing MP2RAGE specific parameters.
  • subname (AbstractString): The name of the subject.

  • folder (AbstractString, optional): The folder where the BIDS data will be written. Defaults to the current directory.

Functionality:

  1. Creates a directory structure for the anatomical data under folder/subname/anat.
  2. Defines a list of file paths for different image types associated with MP2RAGE acquisitions.
  3. Extracts relevant data from the dictionary d for each image type.
  4. Creates NIfTI volumes (NIVolume) with the extracted data and specified voxel size from d["params_prot"].
  5. Writes each NIfTI volume to a compressed file (.nii.gz) in the corresponding directory.
  6. Extracts acquisition parameters from d.
  7. Creates a dictionary (JSON_dict) containing these parameters in BIDS format:
    • InversionTime: List of inversion times (TI1, TI2) in seconds.
    • RepetitionTimeExcitation: Repetition time (TR) in seconds.
    • RepetitionTimePreparation: MP2RAGE specific repetition time (MP2RAGE_TR) in seconds.
    • NumberShots: Echo train length (ETL).
    • FlipAngle: List of flip angles (alpha1, alpha2) in degrees.
    • MagneticFieldStrength: Magnetic field strength in Tesla.
    • Units: Units for the data (set to "arbitrary" in this case).
  8. Writes the JSON dictionary to a file named MP2RAGE.json in the folder/subname directory.

Note: This function assumes the dictionary d contains the necessary data in the specified format.

source
+API · SEQ_BRUKER_a_MP2RAGE_CS_360.jl
SEQ_BRUKER_a_MP2RAGE_CS_360.RawAcquisitionData_MP2RAGEMethod
RawAcquisitionData_MP2RAGE(b::BrukerFile)

Convert a Bruker dataset acquired with the a_MP2RAGE_CS_360 sequence into a RawAcquisitionData object compatible with the MRIReco functions.

Input : - b::BrukerFile

Output : - raw::RawAcquisitionData

source
SEQ_BRUKER_a_MP2RAGE_CS_360.params_from_seqMethod
params_from_seq(b::BrukerFile)

Extracts MP2RAGE sequence parameters from a Bruker file and returns them in a ParamsMP2RAGE structure.

Arguments

  • b::BrukerFile: Bruker file containing sequence parameter information.

Returns

A ParamsMP2RAGE structure containing key sequence timings and settings for MP2RAGE reconstruction.

source
SEQ_BRUKER_a_MP2RAGE_CS_360.write_bids_MP2RAGEFunction
  write_bids_MP2RAGE(d::Dict,subname::AbstractString,folder="")

This function writes data from a dictionary (d) in BIDS (Brain Imaging Data Structure) format for MP2RAGE acquisitions.

Arguments:

  • d (Dict): A dictionary containing the data to be written. Expected key-value pairs:

    • im_reco (Array): 5D array containing the reconstructed images (x,y,z,NR,TI)
    • MP2RAGE (Array): Combined MP2RAGE image data. (x,y,z,NR)
    • T1map (Array): Calculated T1 map from MP2RAGE images. (x,y,z,NR)
    • params_prot (Dict): Protocol parameters extracted from the Bruker file.
    • params_MP2RAGE (Struct): Dictionary containing MP2RAGE specific parameters.
  • subname (AbstractString): The name of the subject.

  • folder (AbstractString, optional): The folder where the BIDS data will be written. Defaults to the current directory.

Functionality:

  1. Creates a directory structure for the anatomical data under folder/subname/anat.
  2. Defines a list of file paths for different image types associated with MP2RAGE acquisitions.
  3. Extracts relevant data from the dictionary d for each image type.
  4. Creates NIfTI volumes (NIVolume) with the extracted data and specified voxel size from d["params_prot"].
  5. Writes each NIfTI volume to a compressed file (.nii.gz) in the corresponding directory.
  6. Extracts acquisition parameters from d.
  7. Creates a dictionary (JSON_dict) containing these parameters in BIDS format:
    • InversionTime: List of inversion times (TI1, TI2) in seconds.
    • RepetitionTimeExcitation: Repetition time (TR) in seconds.
    • RepetitionTimePreparation: MP2RAGE specific repetition time (MP2RAGE_TR) in seconds.
    • NumberShots: Echo train length (ETL).
    • FlipAngle: List of flip angles (alpha1, alpha2) in degrees.
    • MagneticFieldStrength: Magnetic field strength in Tesla.
    • Units: Units for the data (set to "arbitrary" in this case).
  8. Writes the JSON dictionary to a file named MP2RAGE.json in the folder/subname directory.

Note: This function assumes the dictionary d contains the necessary data in the specified format.

source
diff --git a/dev/generated/examples/advanced_reco/72f1c151.png b/dev/generated/examples/advanced_reco/72f1c151.png new file mode 100644 index 0000000..7b1ec56 Binary files /dev/null and b/dev/generated/examples/advanced_reco/72f1c151.png differ diff --git a/dev/generated/examples/advanced_reco/eca99084.png b/dev/generated/examples/advanced_reco/eca99084.png deleted file mode 100644 index a8f6e87..0000000 Binary files a/dev/generated/examples/advanced_reco/eca99084.png and /dev/null differ diff --git a/dev/generated/examples/advanced_reco/index.html b/dev/generated/examples/advanced_reco/index.html index e8ab6f4..10ec559 100644 --- a/dev/generated/examples/advanced_reco/index.html +++ b/dev/generated/examples/advanced_reco/index.html @@ -13,17 +13,17 @@ "LUT" => Float32[93.0 0.5; 94.0 0.5; … ; 5287.0 -0.5; 5288.0 -0.5] "params_reco" => Dict{Symbol, Any}(:iterations=>30, :solver=>FISTA, :reg=>… "params_MP2RAGE" => ParamsMP2RAGE(800.0, 2284.1, 7.0, 5000.0, 128, 7.0, 7.0) - "im_reco" => ComplexF32[20.8242+0.387125im 10.105+14.7264im … 68.1592-… - "T1map" => Float32[2702.0 2283.0 … 1309.0 1517.0; 2302.0 1177.0 … 10… + "im_reco" => ComplexF32[20.6719+0.527998im 10.2103+14.8792im … 68.1409… + "T1map" => Float32[2686.0 2301.0 … 1311.0 1511.0; 2327.0 1187.0 … 10… "params_prot" => BrukerFile: /home/runner/.julia/artifacts/04cd4c29bb9e2ae… - "MP2RAGE" => Float32[-0.377357 -0.291027 … 0.0974735 -0.00846032; -0.2…

for comparison purposes let's perform the undersampled reconstruction (without the paramCS keyword)

d_under = reconstruction_MP2RAGE(path_bruker; mean_NR=true)
Dict{Any, Any} with 7 entries:
+  "MP2RAGE"        => Float32[-0.374886 -0.295793 … 0.0963395 -0.00548892; -0.3…

for comparison purposes let's perform the undersampled reconstruction (without the paramCS keyword)

d_under = reconstruction_MP2RAGE(path_bruker; mean_NR=true)
Dict{Any, Any} with 7 entries:
   "LUT"            => Float32[93.0 0.5; 94.0 0.5; … ; 5287.0 -0.5; 5288.0 -0.5]
   "params_reco"    => Dict{Any, Any}(:iterations=>1, :reconSize=>(128, 128, 96)…
   "params_MP2RAGE" => ParamsMP2RAGE(800.0, 2284.1, 7.0, 5000.0, 128, 7.0, 7.0)
-  "im_reco"        => ComplexF32[61.3559+125.33im 14.4777+115.613im … 53.6951-5…
-  "T1map"          => Float32[2458.0 2484.0 … 1006.0 1792.0; 1926.0 1697.0 … 12…
+  "im_reco"        => ComplexF32[61.5519+126.668im 14.7966+115.13im … 53.1283-5…
+  "T1map"          => Float32[2463.0 2481.0 … 1006.0 1777.0; 1924.0 1701.0 … 12…
   "params_prot"    => BrukerFile: /home/runner/.julia/artifacts/04cd4c29bb9e2ae…
-  "MP2RAGE"        => Float32[-0.331966 -0.337323 … 0.2601 -0.131011; -0.181981…

We can check the results

begin
+  "MP2RAGE"        => Float32[-0.333003 -0.336819 … 0.260251 -0.124936; -0.1811…

We can check the results

begin
   f = Figure(size=(500,400))
   ax=Axis(f[1,1],title="TI₁ undersampled")
   h=heatmap!(ax,abs.(d_under["im_reco"][:,:,60,1,1]),colormap=:grays)
@@ -44,6 +44,6 @@
 
   Colorbar(f[2,3],h,label = "T₁ [ms]", flip_vertical_label=true)
   f
-end
Example block output

Write results in BIDS format

Results can be written following most of the qBIDS format recommandation

subject_name = "sub_01_cs"
+end
Example block output

Write results in BIDS format

Results can be written following most of the qBIDS format recommandation

subject_name = "sub_01_cs"
 dir_path = "" # directory path where the files will be create
-write_bids_MP2RAGE(d,subject_name,dir_path)

This page was generated using Literate.jl.

+write_bids_MP2RAGE(d,subject_name,dir_path)

This page was generated using Literate.jl.

diff --git a/dev/generated/examples/simple_reco/227a88df.png b/dev/generated/examples/simple_reco/227a88df.png new file mode 100644 index 0000000..19d0a38 Binary files /dev/null and b/dev/generated/examples/simple_reco/227a88df.png differ diff --git a/dev/generated/examples/simple_reco/64c3e95e.png b/dev/generated/examples/simple_reco/64c3e95e.png deleted file mode 100644 index 72eb870..0000000 Binary files a/dev/generated/examples/simple_reco/64c3e95e.png and /dev/null differ diff --git a/dev/generated/examples/simple_reco/index.html b/dev/generated/examples/simple_reco/index.html index d1f35a0..cdd9e12 100644 --- a/dev/generated/examples/simple_reco/index.html +++ b/dev/generated/examples/simple_reco/index.html @@ -6,7 +6,7 @@ "LUT" => Float32[93.0 0.5; 94.0 0.5; … ; 5287.0 -0.5; 5288.0 -0.5] "params_reco" => Dict{Any, Any}(:iterations=>1, :reconSize=>(128, 128, 96)… "params_MP2RAGE" => ParamsMP2RAGE(800.0, 2284.1, 7.0, 5000.0, 128, 7.0, 7.0) - "im_reco" => ComplexF32[113.687-120.06im -6.3911+141.334im … 35.198+49… + "im_reco" => ComplexF32[113.687-120.06im -6.39107+141.334im … 35.198+4… "T1map" => Float32[4376.0 3452.0 … 2116.0 2853.0; 3571.0 377.0 … 238… "params_prot" => BrukerFile: /home/runner/.julia/artifacts/04cd4c29bb9e2ae… "MP2RAGE" => Float32[-0.493312 -0.458414 … -0.244732 -0.399954; -0.465…

the result is a dictionnary with the following fields :

im_reco corresponds to the TI₁ and TI₂ images in the complex format with 5 dimensions : (x,y,z , Number of Repetition,TI). Channels are combined during the reconstruction

We can check the results

begin
@@ -29,7 +29,7 @@
 
   Colorbar(f[2,3],h,label = "T₁ [ms]", flip_vertical_label=true)
   f
-end
Example block output

The Lookup table used for the reconstruction is stored in the dictionnary (LUT). First dimension is the range of T1 and the 2nd is the expected value of the MP2RAGE signal between -0.5 to 0.5.

f=Figure()
+end
Example block output

The Lookup table used for the reconstruction is stored in the dictionnary (LUT). First dimension is the range of T1 and the 2nd is the expected value of the MP2RAGE signal between -0.5 to 0.5.

f=Figure()
 ax = Axis(f[1,1],xlabel="T₁ [ms]")
 lines!(ax,d["LUT"])
 f
Example block output

Write results in BIDS format

Results can be written following most of the qBIDS format recommandation

subject_name = "sub_01"
@@ -44,4 +44,4 @@
    ├─ sub_01_inv-1-phase_MP2RAGE.nii.gz
    ├─ sub_01_inv-2-complex_MP2RAGE.nii.gz
    ├─ sub_01_inv-2-mag_MP2RAGE.nii.gz
-   └─ sub_01_inv-2-phase_MP2RAGE.nii.gz

For simplicity the T₁ map is stored in the anat/ folder like the ones created by Siemens.

If you want to generate the T1 map with another tool like qMRLab the required MP2RAGE parameters are stored in the MP2RAGE.json file. In that case the data are supposed to be stored in a derivatives folder (seeqBIDS format recommandation)


This page was generated using Literate.jl.

+ └─ sub_01_inv-2-phase_MP2RAGE.nii.gz

For simplicity the T₁ map is stored in the anat/ folder like the ones created by Siemens.

If you want to generate the T1 map with another tool like qMRLab the required MP2RAGE parameters are stored in the MP2RAGE.json file. In that case the data are supposed to be stored in a derivatives folder (seeqBIDS format recommandation)


This page was generated using Literate.jl.

diff --git a/dev/generated/examples/sub_01/anat/sub_01_T1map.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_T1map.nii.gz index cb7abbd..6f7f2b1 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_T1map.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_T1map.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_UNIT1.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_UNIT1.nii.gz index 4e4b798..fa693ea 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_UNIT1.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_UNIT1.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_inv-1-complex_MP2RAGE.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_inv-1-complex_MP2RAGE.nii.gz index b94973b..a615f81 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_inv-1-complex_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_inv-1-complex_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_inv-1-mag_MP2RAGE.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_inv-1-mag_MP2RAGE.nii.gz index da68d6c..e7e869f 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_inv-1-mag_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_inv-1-mag_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_inv-1-phase_MP2RAGE.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_inv-1-phase_MP2RAGE.nii.gz index 136e990..0373bd8 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_inv-1-phase_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_inv-1-phase_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_inv-2-complex_MP2RAGE.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_inv-2-complex_MP2RAGE.nii.gz index c7915bf..0b8fca1 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_inv-2-complex_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_inv-2-complex_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_inv-2-mag_MP2RAGE.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_inv-2-mag_MP2RAGE.nii.gz index 4a5f456..a06f52d 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_inv-2-mag_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_inv-2-mag_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01/anat/sub_01_inv-2-phase_MP2RAGE.nii.gz b/dev/generated/examples/sub_01/anat/sub_01_inv-2-phase_MP2RAGE.nii.gz index f2fd740..cbde96b 100644 Binary files a/dev/generated/examples/sub_01/anat/sub_01_inv-2-phase_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01/anat/sub_01_inv-2-phase_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_T1map.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_T1map.nii.gz index 396616f..594892a 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_T1map.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_T1map.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_UNIT1.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_UNIT1.nii.gz index 646a8cb..7cca08a 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_UNIT1.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_UNIT1.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-complex_MP2RAGE.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-complex_MP2RAGE.nii.gz index 99c41ce..514321c 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-complex_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-complex_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-mag_MP2RAGE.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-mag_MP2RAGE.nii.gz index 8b9d8fb..71b0baa 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-mag_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-mag_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-phase_MP2RAGE.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-phase_MP2RAGE.nii.gz index 412b990..6431fbe 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-phase_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-1-phase_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-complex_MP2RAGE.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-complex_MP2RAGE.nii.gz index 53c872d..917b8db 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-complex_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-complex_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-mag_MP2RAGE.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-mag_MP2RAGE.nii.gz index 0452904..601c964 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-mag_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-mag_MP2RAGE.nii.gz differ diff --git a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-phase_MP2RAGE.nii.gz b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-phase_MP2RAGE.nii.gz index d71604e..fe8d8fb 100644 Binary files a/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-phase_MP2RAGE.nii.gz and b/dev/generated/examples/sub_01_cs/anat/sub_01_cs_inv-2-phase_MP2RAGE.nii.gz differ diff --git a/dev/index.html b/dev/index.html index 03c221d..cfedbd1 100644 --- a/dev/index.html +++ b/dev/index.html @@ -1,3 +1,3 @@ -Home · SEQ_BRUKER_a_MP2RAGE_CS_360.jl

SEQ_BRUKER_A_MP2RAGE_CS_360

SEQ_BRUKER_a_MP2RAGE_CS_360.jl is a Julia package that implements a reconstruction for an accelerated MP2RAGE sequence for Bruker scanner (PV360-3.5). The reconstruction is performed using MRIReco.jl

More information and examples are available in the initial article

Raw datasets

The rawdata used in the example are stored on zenodo : https://zenodo.org/records/14046657

  • One is a fully sampled acquisition (128x128x96)
  • The other one is accelerated by a factor of 2
##$PVM_EncCSUndersampling=50
-##$PVM_EncCSCenterRatio=5

They are used for each merge to generate the figures used in examples.

How to give credit

If you use this package please acknowledge us by citing : https://doi.org/10.1002/mrm.27438

Additionally, if you use the sequence available in the MR sequence folder, please contact us to sign the sequence transfer agreement : aurelien.trotier@rmsb.u-bordeaux.fr

+Home · SEQ_BRUKER_a_MP2RAGE_CS_360.jl

SEQ_BRUKER_A_MP2RAGE_CS_360

SEQ_BRUKER_a_MP2RAGE_CS_360.jl is a Julia package that implements a reconstruction for an accelerated MP2RAGE sequence for Bruker scanner (PV360-3.5 and PV360-3.6). The reconstruction is performed using MRIReco.jl

More information and examples are available in the initial article

Raw datasets

The rawdata used in the example are stored on zenodo : https://zenodo.org/records/14046657

  • One is a fully sampled acquisition (128x128x96)
  • The other one is accelerated by a factor of 2
##$PVM_EncCSUndersampling=50
+##$PVM_EncCSCenterRatio=5

They are used for each merge to generate the figures used in examples.

How to give credit

If you use this package please acknowledge us by citing : https://doi.org/10.1002/mrm.27438

Additionally, if you use the sequence available in the MR sequence folder, please contact us to sign the sequence transfer agreement : aurelien.trotier@rmsb.u-bordeaux.fr

diff --git a/dev/reconstruction/index.html b/dev/reconstruction/index.html index 09f4724..28b9c6d 100644 --- a/dev/reconstruction/index.html +++ b/dev/reconstruction/index.html @@ -1,4 +1,4 @@ Installation and usage · SEQ_BRUKER_a_MP2RAGE_CS_360.jl

Installation and usage

Package Installation

You can install the package in any project with the following command :

  • launch julia with the command julia
  • enter the Julia package manager by typing ] in the REPL. (the REPL should turn in blue)
  • if you want to activate an environment, type : activate . (otherwise the package will be installed in the global environment)
  • In order to add our unregistered package, type add https://github.com/CRMSB/SEQ_BRUKER_a_MP2RAGE_CS_360
  • if you want to use the package in your script just add the following line : using SEQ_BRUKER_a_MP2RAGE_CS_360

How to use the package

Follow the example in the documentation

Steps :

  • Define the path to the bruker dataset
path_bruker = joinpath(datadir, "MP2RAGE_FULLY")
  • Perform the reconstruction
d = reconstruction_MP2RAGE(path_bruker; mean_NR=true)
  • write the results in the qBIDS format
subject_name = "sub_01"
 dir_path = "" # directory path where the files will be create
-write_bids_MP2RAGE(d,subject_name,dir_path)
+write_bids_MP2RAGE(d,subject_name,dir_path) diff --git a/dev/search_index.js b/dev/search_index.js index 44e37ac..23a7173 100644 --- a/dev/search_index.js +++ b/dev/search_index.js @@ -1,3 +1,3 @@ var documenterSearchIndex = {"docs": -[{"location":"api/","page":"API","title":"API","text":"","category":"page"},{"location":"api/","page":"API","title":"API","text":"Modules = [SEQ_BRUKER_a_MP2RAGE_CS_360]","category":"page"},{"location":"api/#SEQ_BRUKER_a_MP2RAGE_CS_360.RawAcquisitionData_MP2RAGE-Tuple{MRIFiles.BrukerFile}","page":"API","title":"SEQ_BRUKER_a_MP2RAGE_CS_360.RawAcquisitionData_MP2RAGE","text":"RawAcquisitionData_MP2RAGE(b::BrukerFile)\n\nConvert a Bruker dataset acquired with the a_MP2RAGE_CS_360 sequence into a RawAcquisitionData object compatible with the MRIReco functions.\n\nInput : - b::BrukerFile\n\nOutput : - raw::RawAcquisitionData\n\n\n\n\n\n","category":"method"},{"location":"api/#SEQ_BRUKER_a_MP2RAGE_CS_360.params_from_seq-Tuple{MRIFiles.BrukerFile}","page":"API","title":"SEQ_BRUKER_a_MP2RAGE_CS_360.params_from_seq","text":"params_from_seq(b::BrukerFile)\n\nExtracts MP2RAGE sequence parameters from a Bruker file and returns them in a ParamsMP2RAGE structure.\n\nArguments\n\nb::BrukerFile: Bruker file containing sequence parameter information.\n\nReturns\n\nA ParamsMP2RAGE structure containing key sequence timings and settings for MP2RAGE reconstruction.\n\n\n\n\n\n","category":"method"},{"location":"api/#SEQ_BRUKER_a_MP2RAGE_CS_360.write_bids_MP2RAGE","page":"API","title":"SEQ_BRUKER_a_MP2RAGE_CS_360.write_bids_MP2RAGE","text":" write_bids_MP2RAGE(d::Dict,subname::AbstractString,folder=\"\")\n\nThis function writes data from a dictionary (d) in BIDS (Brain Imaging Data Structure) format for MP2RAGE acquisitions.\n\nArguments:\n\nd (Dict): A dictionary containing the data to be written. Expected key-value pairs:\nim_reco (Array): 5D array containing the reconstructed images (x,y,z,NR,TI)\nMP2RAGE (Array): Combined MP2RAGE image data. (x,y,z,NR)\nT1map (Array): Calculated T1 map from MP2RAGE images. (x,y,z,NR)\nparams_prot (Dict): Protocol parameters extracted from the Bruker file.\nparams_MP2RAGE (Struct): Dictionary containing MP2RAGE specific parameters.\nsubname (AbstractString): The name of the subject.\nfolder (AbstractString, optional): The folder where the BIDS data will be written. Defaults to the current directory.\n\nFunctionality:\n\nCreates a directory structure for the anatomical data under folder/subname/anat.\nDefines a list of file paths for different image types associated with MP2RAGE acquisitions.\nExtracts relevant data from the dictionary d for each image type.\nCreates NIfTI volumes (NIVolume) with the extracted data and specified voxel size from d[\"params_prot\"].\nWrites each NIfTI volume to a compressed file (.nii.gz) in the corresponding directory.\nExtracts acquisition parameters from d.\nCreates a dictionary (JSON_dict) containing these parameters in BIDS format:\nInversionTime: List of inversion times (TI1, TI2) in seconds.\nRepetitionTimeExcitation: Repetition time (TR) in seconds.\nRepetitionTimePreparation: MP2RAGE specific repetition time (MP2RAGE_TR) in seconds.\nNumberShots: Echo train length (ETL).\nFlipAngle: List of flip angles (alpha1, alpha2) in degrees.\nMagneticFieldStrength: Magnetic field strength in Tesla.\nUnits: Units for the data (set to \"arbitrary\" in this case).\nWrites the JSON dictionary to a file named MP2RAGE.json in the folder/subname directory.\n\nNote: This function assumes the dictionary d contains the necessary data in the specified format. \n\n\n\n\n\n","category":"function"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"EditURL = \"../../../lit/examples/advanced_reco.jl\"","category":"page"},{"location":"generated/examples/advanced_reco/#02-CS_reconstruction","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"","category":"section"},{"location":"generated/examples/advanced_reco/#Description","page":"Compressed-sensing reconstruction","title":"Description","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"This example describes how to perform a compressed-sensingreconstruction of a CS-2 accelerated acquisition.","category":"page"},{"location":"generated/examples/advanced_reco/#Loading-Package","page":"Compressed-sensing reconstruction","title":"Loading Package","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"using LazyArtifacts # loading data\nusing SEQ_BRUKER_a_MP2RAGE_CS_360\nusing CairoMakie # plotting","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"In addition we load the package internally used to perform the reconstruction","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"using SEQ_BRUKER_a_MP2RAGE_CS_360.MRIReco\nusing SEQ_BRUKER_a_MP2RAGE_CS_360.MRIReco.RegularizedLeastSquares","category":"page"},{"location":"generated/examples/advanced_reco/#Download-the-datasets","page":"Compressed-sensing reconstruction","title":"Download the datasets","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"if you run the literate example offline change the following line by : `MP2artifacts = artifact\"MP2RAGEdata\"","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"datadir = Main.MP2_artifacts\n@info \"The test data is located at $datadir.\"","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"If you want to perform your own reconstruction, you can change the following line in order to point to another a bruker dataset","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"path_bruker = joinpath(datadir, \"MP2RAGE_CS2\")","category":"page"},{"location":"generated/examples/advanced_reco/#Compressed-sensing-reconstruction","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"In order to use an advanced reconstruction we will pass some parameters that will be used by the reconstruction package MRIReco.jl","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"We have to create a parameter dictionnary that will be used. If you need more information about it take a look at MRIReco.jl","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"CS = Dict{Symbol,Any}()\nCS[:sparseTrafo] = \"Wavelet\" #sparse trafo\nCS[:reg] = L1Regularization(100.) # regularization\nCS[:solver] = FISTA # solver\nCS[:iterations] = 30\n\nd = reconstruction_MP2RAGE(path_bruker; mean_NR=true,paramsCS = CS)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"for comparison purposes let's perform the undersampled reconstruction (without the paramCS keyword)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"d_under = reconstruction_MP2RAGE(path_bruker; mean_NR=true)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"We can check the results","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"begin\n f = Figure(size=(500,400))\n ax=Axis(f[1,1],title=\"TI₁ undersampled\")\n h=heatmap!(ax,abs.(d_under[\"im_reco\"][:,:,60,1,1]),colormap=:grays)\n\n ax=Axis(f[1,2],title=\"TI₁ CS\")\n h=heatmap!(ax,abs.(d[\"im_reco\"][:,:,60,1,1]),colormap=:grays)\n\n\n ax=Axis(f[2,1],title=\"T₁ map undersampled\")\n h=heatmap!(ax,d_under[\"T1map\"][:,:,60,1],colorrange = (500,2000))\n\n ax=Axis(f[2,2],title=\"T₁ map CS\")\n h=heatmap!(ax,d[\"T1map\"][:,:,60,1],colorrange = (500,2000))\n\n for ax in f.content # hide decoration befor adding colorbar\n hidedecorations!(ax)\n end\n\n Colorbar(f[2,3],h,label = \"T₁ [ms]\", flip_vertical_label=true)\n f\nend","category":"page"},{"location":"generated/examples/advanced_reco/#Write-results-in-BIDS-format","page":"Compressed-sensing reconstruction","title":"Write results in BIDS format","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"Results can be written following most of the qBIDS format recommandation","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"subject_name = \"sub_01_cs\"\ndir_path = \"\" # directory path where the files will be create\nwrite_bids_MP2RAGE(d,subject_name,dir_path)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"This page was generated using Literate.jl.","category":"page"},{"location":"sequence/#Sequence-and-protocols","page":"Sequence and protocol","title":"Sequence and protocols","text":"","category":"section"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"The sequence, implemented for Bruker Paravision PV-360.3.5, and the corresponding protocol for fully-sampled is available in the folder MR sequence/PV-360.3.5. ","category":"page"},{"location":"sequence/#Enable-compressed-sensing-acquisition","page":"Sequence and protocol","title":"Enable compressed-sensing acquisition","text":"","category":"section"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"Compressed-sensing implementation is available through the standard Bruker tab Resolution/Encoding. If you want to perform a compressed-sensing experiment with an acceleration of 2 like the one used here : acceleration factor = 50% and use a calibration size of 5%","category":"page"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"##$PVM_EncCSUndersampling=50\n##$PVM_EncCSCenterRatio=5","category":"page"},{"location":"sequence/#Source-code","page":"Sequence and protocol","title":"Source code","text":"","category":"section"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"Source code is available in this private directory : https://github.com/aTrotier/a_MP2RAGE_CS_360","category":"page"},{"location":"reconstruction/#Installation-and-usage","page":"Installation and usage","title":"Installation and usage","text":"","category":"section"},{"location":"reconstruction/#Package-Installation","page":"Installation and usage","title":"Package Installation","text":"","category":"section"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"You can install the package in any project with the following command :","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"launch julia with the command julia\nenter the Julia package manager by typing ] in the REPL. (the REPL should turn in blue)\nif you want to activate an environment, type : activate . (otherwise the package will be installed in the global environment)\nIn order to add our unregistered package, type add https://github.com/CRMSB/SEQ_BRUKER_a_MP2RAGE_CS_360\nif you want to use the package in your script just add the following line : using SEQ_BRUKER_a_MP2RAGE_CS_360","category":"page"},{"location":"reconstruction/#How-to-use-the-package","page":"Installation and usage","title":"How to use the package","text":"","category":"section"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Follow the example in the documentation ","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Steps :","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Define the path to the bruker dataset","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"path_bruker = joinpath(datadir, \"MP2RAGE_FULLY\")","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Perform the reconstruction ","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"d = reconstruction_MP2RAGE(path_bruker; mean_NR=true)","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"write the results in the qBIDS format","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"subject_name = \"sub_01\"\ndir_path = \"\" # directory path where the files will be create\nwrite_bids_MP2RAGE(d,subject_name,dir_path)","category":"page"},{"location":"","page":"Home","title":"Home","text":"CurrentModule = SEQ_BRUKER_a_MP2RAGE_CS_360","category":"page"},{"location":"#SEQ_BRUKER_A_MP2RAGE_CS_360","page":"Home","title":"SEQ_BRUKER_A_MP2RAGE_CS_360","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"SEQ_BRUKER_a_MP2RAGE_CS_360.jl is a Julia package that implements a reconstruction for an accelerated MP2RAGE sequence for Bruker scanner (PV360-3.5). The reconstruction is performed using MRIReco.jl ","category":"page"},{"location":"","page":"Home","title":"Home","text":"More information and examples are available in the initial article","category":"page"},{"location":"#Raw-datasets","page":"Home","title":"Raw datasets","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The rawdata used in the example are stored on zenodo : https://zenodo.org/records/14046657","category":"page"},{"location":"","page":"Home","title":"Home","text":"One is a fully sampled acquisition (128x128x96)\nThe other one is accelerated by a factor of 2","category":"page"},{"location":"","page":"Home","title":"Home","text":"##$PVM_EncCSUndersampling=50\n##$PVM_EncCSCenterRatio=5","category":"page"},{"location":"","page":"Home","title":"Home","text":"They are used for each merge to generate the figures used in examples.","category":"page"},{"location":"#How-to-give-credit","page":"Home","title":"How to give credit","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use this package please acknowledge us by citing : https://doi.org/10.1002/mrm.27438","category":"page"},{"location":"","page":"Home","title":"Home","text":"Additionally, if you use the sequence available in the MR sequence folder, please contact us to sign the sequence transfer agreement : aurelien.trotier@rmsb.u-bordeaux.fr","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"EditURL = \"../../../lit/examples/simple_reco.jl\"","category":"page"},{"location":"generated/examples/simple_reco/#01-simple_reconstruction","page":"Simple reconstruction","title":"Simple reconstruction","text":"","category":"section"},{"location":"generated/examples/simple_reco/#Description","page":"Simple reconstruction","title":"Description","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"This example describes how to perform a reconstruction of a fully acquisition acquired with the aMP2RAGECS_360 sequence.","category":"page"},{"location":"generated/examples/simple_reco/#Loading-Package","page":"Simple reconstruction","title":"Loading Package","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"using LazyArtifacts # loading data\nusing SEQ_BRUKER_a_MP2RAGE_CS_360\nusing CairoMakie # plotting","category":"page"},{"location":"generated/examples/simple_reco/#Download-the-datasets","page":"Simple reconstruction","title":"Download the datasets","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"if you run the literate example offline change the following line by : `MP2artifacts = artifact\"MP2RAGEdata\"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"datadir = Main.MP2_artifacts\n@info \"The test data is located at $datadir.\"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"If you want to perform your own reconstruction, you can change the following line in order to point to another a bruker dataset","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"path_bruker = joinpath(datadir, \"MP2RAGE_FULLY\")","category":"page"},{"location":"generated/examples/simple_reco/#Perform-the-reconstruction","page":"Simple reconstruction","title":"Perform the reconstruction","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"this function will perform a standard reconstruction without compressed-sensing. If your data are subsampled it will result in subsampling artifacts (blurring + noise-like)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"the keyword mean_NR=true will average the images accross the number of repetition dimension before performing the MP2RAGE/T1 maps estimation. Otherwise an image/T₁ map will be generated for each Number Of Repetition (NR)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"d = reconstruction_MP2RAGE(path_bruker; mean_NR=true)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"the result is a dictionnary with the following fields :","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"\"im_reco\" : (x,y,z, Number of Repetition,TI) Complex\n\"MP2RAGE\" : (x,y,z , Number of Repetition) Float\n\"T1map\" : (x,y,z , Number of Repetition) Float\n\"params_prot\"\n\"params_reco\"\n\"params_MP2RAGE\"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"im_reco corresponds to the TI₁ and TI₂ images in the complex format with 5 dimensions : (x,y,z , Number of Repetition,TI). Channels are combined during the reconstruction","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"We can check the results","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"begin\n f = Figure(size=(500,400))\n ax=Axis(f[1,1],title=\"TI₁\")\n h=heatmap!(ax,abs.(d[\"im_reco\"][:,:,60,1,1]),colormap=:grays)\n\n ax=Axis(f[1,2],title=\"TI₂\")\n h=heatmap!(ax,abs.(d[\"im_reco\"][:,:,60,1,2]),colormap=:grays)\n\n ax=Axis(f[2,1],title=\"UNIT1 / MP2RAGE\")\n h=heatmap!(ax,d[\"MP2RAGE\"][:,:,60,1],colormap=:grays)\n\n ax=Axis(f[2,2],title=\"T₁ map\")\n h=heatmap!(ax,d[\"T1map\"][:,:,60,1],colorrange = (500,2000))\n\n for ax in f.content # hide decoration befor adding colorbar\n hidedecorations!(ax)\n end\n\n Colorbar(f[2,3],h,label = \"T₁ [ms]\", flip_vertical_label=true)\n f\nend","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"The Lookup table used for the reconstruction is stored in the dictionnary (LUT). First dimension is the range of T1 and the 2nd is the expected value of the MP2RAGE signal between -0.5 to 0.5.","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"f=Figure()\nax = Axis(f[1,1],xlabel=\"T₁ [ms]\")\nlines!(ax,d[\"LUT\"])\nf","category":"page"},{"location":"generated/examples/simple_reco/#Write-results-in-BIDS-format","page":"Simple reconstruction","title":"Write results in BIDS format","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"Results can be written following most of the qBIDS format recommandation","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"subject_name = \"sub_01\"\ndir_path = \"\" # directory path where the files will be create\nwrite_bids_MP2RAGE(d,subject_name,dir_path)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"which results in :","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"sub_01/\n├─ MP2RAGE.json\n└─ anat/\n ├─ sub_01_T1map.nii.gz\n ├─ sub_01_UNIT1.nii.gz\n ├─ sub_01_inv-1-complex_MP2RAGE.nii.gz\n ├─ sub_01_inv-1-mag_MP2RAGE.nii.gz\n ├─ sub_01_inv-1-phase_MP2RAGE.nii.gz\n ├─ sub_01_inv-2-complex_MP2RAGE.nii.gz\n ├─ sub_01_inv-2-mag_MP2RAGE.nii.gz\n └─ sub_01_inv-2-phase_MP2RAGE.nii.gz","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"For simplicity the T₁ map is stored in the anat/ folder like the ones created by Siemens.","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"If you want to generate the T1 map with another tool like qMRLab the required MP2RAGE parameters are stored in the MP2RAGE.json file. In that case the data are supposed to be stored in a derivatives folder (seeqBIDS format recommandation)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"This page was generated using Literate.jl.","category":"page"}] +[{"location":"api/","page":"API","title":"API","text":"","category":"page"},{"location":"api/","page":"API","title":"API","text":"Modules = [SEQ_BRUKER_a_MP2RAGE_CS_360]","category":"page"},{"location":"api/#SEQ_BRUKER_a_MP2RAGE_CS_360.RawAcquisitionData_MP2RAGE-Tuple{MRIFiles.BrukerFile}","page":"API","title":"SEQ_BRUKER_a_MP2RAGE_CS_360.RawAcquisitionData_MP2RAGE","text":"RawAcquisitionData_MP2RAGE(b::BrukerFile)\n\nConvert a Bruker dataset acquired with the a_MP2RAGE_CS_360 sequence into a RawAcquisitionData object compatible with the MRIReco functions.\n\nInput : - b::BrukerFile\n\nOutput : - raw::RawAcquisitionData\n\n\n\n\n\n","category":"method"},{"location":"api/#SEQ_BRUKER_a_MP2RAGE_CS_360.params_from_seq-Tuple{MRIFiles.BrukerFile}","page":"API","title":"SEQ_BRUKER_a_MP2RAGE_CS_360.params_from_seq","text":"params_from_seq(b::BrukerFile)\n\nExtracts MP2RAGE sequence parameters from a Bruker file and returns them in a ParamsMP2RAGE structure.\n\nArguments\n\nb::BrukerFile: Bruker file containing sequence parameter information.\n\nReturns\n\nA ParamsMP2RAGE structure containing key sequence timings and settings for MP2RAGE reconstruction.\n\n\n\n\n\n","category":"method"},{"location":"api/#SEQ_BRUKER_a_MP2RAGE_CS_360.write_bids_MP2RAGE","page":"API","title":"SEQ_BRUKER_a_MP2RAGE_CS_360.write_bids_MP2RAGE","text":" write_bids_MP2RAGE(d::Dict,subname::AbstractString,folder=\"\")\n\nThis function writes data from a dictionary (d) in BIDS (Brain Imaging Data Structure) format for MP2RAGE acquisitions.\n\nArguments:\n\nd (Dict): A dictionary containing the data to be written. Expected key-value pairs:\nim_reco (Array): 5D array containing the reconstructed images (x,y,z,NR,TI)\nMP2RAGE (Array): Combined MP2RAGE image data. (x,y,z,NR)\nT1map (Array): Calculated T1 map from MP2RAGE images. (x,y,z,NR)\nparams_prot (Dict): Protocol parameters extracted from the Bruker file.\nparams_MP2RAGE (Struct): Dictionary containing MP2RAGE specific parameters.\nsubname (AbstractString): The name of the subject.\nfolder (AbstractString, optional): The folder where the BIDS data will be written. Defaults to the current directory.\n\nFunctionality:\n\nCreates a directory structure for the anatomical data under folder/subname/anat.\nDefines a list of file paths for different image types associated with MP2RAGE acquisitions.\nExtracts relevant data from the dictionary d for each image type.\nCreates NIfTI volumes (NIVolume) with the extracted data and specified voxel size from d[\"params_prot\"].\nWrites each NIfTI volume to a compressed file (.nii.gz) in the corresponding directory.\nExtracts acquisition parameters from d.\nCreates a dictionary (JSON_dict) containing these parameters in BIDS format:\nInversionTime: List of inversion times (TI1, TI2) in seconds.\nRepetitionTimeExcitation: Repetition time (TR) in seconds.\nRepetitionTimePreparation: MP2RAGE specific repetition time (MP2RAGE_TR) in seconds.\nNumberShots: Echo train length (ETL).\nFlipAngle: List of flip angles (alpha1, alpha2) in degrees.\nMagneticFieldStrength: Magnetic field strength in Tesla.\nUnits: Units for the data (set to \"arbitrary\" in this case).\nWrites the JSON dictionary to a file named MP2RAGE.json in the folder/subname directory.\n\nNote: This function assumes the dictionary d contains the necessary data in the specified format. \n\n\n\n\n\n","category":"function"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"EditURL = \"../../../lit/examples/advanced_reco.jl\"","category":"page"},{"location":"generated/examples/advanced_reco/#02-CS_reconstruction","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"","category":"section"},{"location":"generated/examples/advanced_reco/#Description","page":"Compressed-sensing reconstruction","title":"Description","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"This example describes how to perform a compressed-sensingreconstruction of a CS-2 accelerated acquisition.","category":"page"},{"location":"generated/examples/advanced_reco/#Loading-Package","page":"Compressed-sensing reconstruction","title":"Loading Package","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"using LazyArtifacts # loading data\nusing SEQ_BRUKER_a_MP2RAGE_CS_360\nusing CairoMakie # plotting","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"In addition we load the package internally used to perform the reconstruction","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"using SEQ_BRUKER_a_MP2RAGE_CS_360.MRIReco\nusing SEQ_BRUKER_a_MP2RAGE_CS_360.MRIReco.RegularizedLeastSquares","category":"page"},{"location":"generated/examples/advanced_reco/#Download-the-datasets","page":"Compressed-sensing reconstruction","title":"Download the datasets","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"if you run the literate example offline change the following line by : `MP2artifacts = artifact\"MP2RAGEdata\"","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"datadir = Main.MP2_artifacts\n@info \"The test data is located at $datadir.\"","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"If you want to perform your own reconstruction, you can change the following line in order to point to another a bruker dataset","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"path_bruker = joinpath(datadir, \"MP2RAGE_CS2\")","category":"page"},{"location":"generated/examples/advanced_reco/#Compressed-sensing-reconstruction","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"In order to use an advanced reconstruction we will pass some parameters that will be used by the reconstruction package MRIReco.jl","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"We have to create a parameter dictionnary that will be used. If you need more information about it take a look at MRIReco.jl","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"CS = Dict{Symbol,Any}()\nCS[:sparseTrafo] = \"Wavelet\" #sparse trafo\nCS[:reg] = L1Regularization(100.) # regularization\nCS[:solver] = FISTA # solver\nCS[:iterations] = 30\n\nd = reconstruction_MP2RAGE(path_bruker; mean_NR=true,paramsCS = CS)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"for comparison purposes let's perform the undersampled reconstruction (without the paramCS keyword)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"d_under = reconstruction_MP2RAGE(path_bruker; mean_NR=true)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"We can check the results","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"begin\n f = Figure(size=(500,400))\n ax=Axis(f[1,1],title=\"TI₁ undersampled\")\n h=heatmap!(ax,abs.(d_under[\"im_reco\"][:,:,60,1,1]),colormap=:grays)\n\n ax=Axis(f[1,2],title=\"TI₁ CS\")\n h=heatmap!(ax,abs.(d[\"im_reco\"][:,:,60,1,1]),colormap=:grays)\n\n\n ax=Axis(f[2,1],title=\"T₁ map undersampled\")\n h=heatmap!(ax,d_under[\"T1map\"][:,:,60,1],colorrange = (500,2000))\n\n ax=Axis(f[2,2],title=\"T₁ map CS\")\n h=heatmap!(ax,d[\"T1map\"][:,:,60,1],colorrange = (500,2000))\n\n for ax in f.content # hide decoration befor adding colorbar\n hidedecorations!(ax)\n end\n\n Colorbar(f[2,3],h,label = \"T₁ [ms]\", flip_vertical_label=true)\n f\nend","category":"page"},{"location":"generated/examples/advanced_reco/#Write-results-in-BIDS-format","page":"Compressed-sensing reconstruction","title":"Write results in BIDS format","text":"","category":"section"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"Results can be written following most of the qBIDS format recommandation","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"subject_name = \"sub_01_cs\"\ndir_path = \"\" # directory path where the files will be create\nwrite_bids_MP2RAGE(d,subject_name,dir_path)","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"","category":"page"},{"location":"generated/examples/advanced_reco/","page":"Compressed-sensing reconstruction","title":"Compressed-sensing reconstruction","text":"This page was generated using Literate.jl.","category":"page"},{"location":"sequence/#Sequence-and-protocols","page":"Sequence and protocol","title":"Sequence and protocols","text":"","category":"section"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"The sequence, implemented for Bruker Paravision PV-360: 3.5 & 3.6, and the corresponding protocol for fully-sampled is available in the folder MR sequence. ","category":"page"},{"location":"sequence/#Enable-compressed-sensing-acquisition","page":"Sequence and protocol","title":"Enable compressed-sensing acquisition","text":"","category":"section"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"Compressed-sensing implementation is available through the standard Bruker tab Resolution/Encoding. If you want to perform a compressed-sensing experiment with an acceleration of 2 like the one used here : acceleration factor = 50% and use a calibration size of 5%","category":"page"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"##$PVM_EncCSUndersampling=50\n##$PVM_EncCSCenterRatio=5","category":"page"},{"location":"sequence/#Source-code","page":"Sequence and protocol","title":"Source code","text":"","category":"section"},{"location":"sequence/","page":"Sequence and protocol","title":"Sequence and protocol","text":"Source code is available in this private directory : https://github.com/aTrotier/a_MP2RAGE_CS_360","category":"page"},{"location":"reconstruction/#Installation-and-usage","page":"Installation and usage","title":"Installation and usage","text":"","category":"section"},{"location":"reconstruction/#Package-Installation","page":"Installation and usage","title":"Package Installation","text":"","category":"section"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"You can install the package in any project with the following command :","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"launch julia with the command julia\nenter the Julia package manager by typing ] in the REPL. (the REPL should turn in blue)\nif you want to activate an environment, type : activate . (otherwise the package will be installed in the global environment)\nIn order to add our unregistered package, type add https://github.com/CRMSB/SEQ_BRUKER_a_MP2RAGE_CS_360\nif you want to use the package in your script just add the following line : using SEQ_BRUKER_a_MP2RAGE_CS_360","category":"page"},{"location":"reconstruction/#How-to-use-the-package","page":"Installation and usage","title":"How to use the package","text":"","category":"section"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Follow the example in the documentation ","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Steps :","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Define the path to the bruker dataset","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"path_bruker = joinpath(datadir, \"MP2RAGE_FULLY\")","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"Perform the reconstruction ","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"d = reconstruction_MP2RAGE(path_bruker; mean_NR=true)","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"write the results in the qBIDS format","category":"page"},{"location":"reconstruction/","page":"Installation and usage","title":"Installation and usage","text":"subject_name = \"sub_01\"\ndir_path = \"\" # directory path where the files will be create\nwrite_bids_MP2RAGE(d,subject_name,dir_path)","category":"page"},{"location":"","page":"Home","title":"Home","text":"CurrentModule = SEQ_BRUKER_a_MP2RAGE_CS_360","category":"page"},{"location":"#SEQ_BRUKER_A_MP2RAGE_CS_360","page":"Home","title":"SEQ_BRUKER_A_MP2RAGE_CS_360","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"SEQ_BRUKER_a_MP2RAGE_CS_360.jl is a Julia package that implements a reconstruction for an accelerated MP2RAGE sequence for Bruker scanner (PV360-3.5 and PV360-3.6). The reconstruction is performed using MRIReco.jl ","category":"page"},{"location":"","page":"Home","title":"Home","text":"More information and examples are available in the initial article","category":"page"},{"location":"#Raw-datasets","page":"Home","title":"Raw datasets","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"The rawdata used in the example are stored on zenodo : https://zenodo.org/records/14046657","category":"page"},{"location":"","page":"Home","title":"Home","text":"One is a fully sampled acquisition (128x128x96)\nThe other one is accelerated by a factor of 2","category":"page"},{"location":"","page":"Home","title":"Home","text":"##$PVM_EncCSUndersampling=50\n##$PVM_EncCSCenterRatio=5","category":"page"},{"location":"","page":"Home","title":"Home","text":"They are used for each merge to generate the figures used in examples.","category":"page"},{"location":"#How-to-give-credit","page":"Home","title":"How to give credit","text":"","category":"section"},{"location":"","page":"Home","title":"Home","text":"If you use this package please acknowledge us by citing : https://doi.org/10.1002/mrm.27438","category":"page"},{"location":"","page":"Home","title":"Home","text":"Additionally, if you use the sequence available in the MR sequence folder, please contact us to sign the sequence transfer agreement : aurelien.trotier@rmsb.u-bordeaux.fr","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"EditURL = \"../../../lit/examples/simple_reco.jl\"","category":"page"},{"location":"generated/examples/simple_reco/#01-simple_reconstruction","page":"Simple reconstruction","title":"Simple reconstruction","text":"","category":"section"},{"location":"generated/examples/simple_reco/#Description","page":"Simple reconstruction","title":"Description","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"This example describes how to perform a reconstruction of a fully acquisition acquired with the aMP2RAGECS_360 sequence.","category":"page"},{"location":"generated/examples/simple_reco/#Loading-Package","page":"Simple reconstruction","title":"Loading Package","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"using LazyArtifacts # loading data\nusing SEQ_BRUKER_a_MP2RAGE_CS_360\nusing CairoMakie # plotting","category":"page"},{"location":"generated/examples/simple_reco/#Download-the-datasets","page":"Simple reconstruction","title":"Download the datasets","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"if you run the literate example offline change the following line by : `MP2artifacts = artifact\"MP2RAGEdata\"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"datadir = Main.MP2_artifacts\n@info \"The test data is located at $datadir.\"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"If you want to perform your own reconstruction, you can change the following line in order to point to another a bruker dataset","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"path_bruker = joinpath(datadir, \"MP2RAGE_FULLY\")","category":"page"},{"location":"generated/examples/simple_reco/#Perform-the-reconstruction","page":"Simple reconstruction","title":"Perform the reconstruction","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"this function will perform a standard reconstruction without compressed-sensing. If your data are subsampled it will result in subsampling artifacts (blurring + noise-like)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"the keyword mean_NR=true will average the images accross the number of repetition dimension before performing the MP2RAGE/T1 maps estimation. Otherwise an image/T₁ map will be generated for each Number Of Repetition (NR)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"d = reconstruction_MP2RAGE(path_bruker; mean_NR=true)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"the result is a dictionnary with the following fields :","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"\"im_reco\" : (x,y,z, Number of Repetition,TI) Complex\n\"MP2RAGE\" : (x,y,z , Number of Repetition) Float\n\"T1map\" : (x,y,z , Number of Repetition) Float\n\"params_prot\"\n\"params_reco\"\n\"params_MP2RAGE\"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"im_reco corresponds to the TI₁ and TI₂ images in the complex format with 5 dimensions : (x,y,z , Number of Repetition,TI). Channels are combined during the reconstruction","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"We can check the results","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"begin\n f = Figure(size=(500,400))\n ax=Axis(f[1,1],title=\"TI₁\")\n h=heatmap!(ax,abs.(d[\"im_reco\"][:,:,60,1,1]),colormap=:grays)\n\n ax=Axis(f[1,2],title=\"TI₂\")\n h=heatmap!(ax,abs.(d[\"im_reco\"][:,:,60,1,2]),colormap=:grays)\n\n ax=Axis(f[2,1],title=\"UNIT1 / MP2RAGE\")\n h=heatmap!(ax,d[\"MP2RAGE\"][:,:,60,1],colormap=:grays)\n\n ax=Axis(f[2,2],title=\"T₁ map\")\n h=heatmap!(ax,d[\"T1map\"][:,:,60,1],colorrange = (500,2000))\n\n for ax in f.content # hide decoration befor adding colorbar\n hidedecorations!(ax)\n end\n\n Colorbar(f[2,3],h,label = \"T₁ [ms]\", flip_vertical_label=true)\n f\nend","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"The Lookup table used for the reconstruction is stored in the dictionnary (LUT). First dimension is the range of T1 and the 2nd is the expected value of the MP2RAGE signal between -0.5 to 0.5.","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"f=Figure()\nax = Axis(f[1,1],xlabel=\"T₁ [ms]\")\nlines!(ax,d[\"LUT\"])\nf","category":"page"},{"location":"generated/examples/simple_reco/#Write-results-in-BIDS-format","page":"Simple reconstruction","title":"Write results in BIDS format","text":"","category":"section"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"Results can be written following most of the qBIDS format recommandation","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"subject_name = \"sub_01\"\ndir_path = \"\" # directory path where the files will be create\nwrite_bids_MP2RAGE(d,subject_name,dir_path)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"which results in :","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"sub_01/\n├─ MP2RAGE.json\n└─ anat/\n ├─ sub_01_T1map.nii.gz\n ├─ sub_01_UNIT1.nii.gz\n ├─ sub_01_inv-1-complex_MP2RAGE.nii.gz\n ├─ sub_01_inv-1-mag_MP2RAGE.nii.gz\n ├─ sub_01_inv-1-phase_MP2RAGE.nii.gz\n ├─ sub_01_inv-2-complex_MP2RAGE.nii.gz\n ├─ sub_01_inv-2-mag_MP2RAGE.nii.gz\n └─ sub_01_inv-2-phase_MP2RAGE.nii.gz","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"For simplicity the T₁ map is stored in the anat/ folder like the ones created by Siemens.","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"If you want to generate the T1 map with another tool like qMRLab the required MP2RAGE parameters are stored in the MP2RAGE.json file. In that case the data are supposed to be stored in a derivatives folder (seeqBIDS format recommandation)","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"","category":"page"},{"location":"generated/examples/simple_reco/","page":"Simple reconstruction","title":"Simple reconstruction","text":"This page was generated using Literate.jl.","category":"page"}] } diff --git a/dev/sequence/index.html b/dev/sequence/index.html index e5d835a..0736e4f 100644 --- a/dev/sequence/index.html +++ b/dev/sequence/index.html @@ -1,3 +1,3 @@ -Sequence and protocol · SEQ_BRUKER_a_MP2RAGE_CS_360.jl

Sequence and protocols

The sequence, implemented for Bruker Paravision PV-360.3.5, and the corresponding protocol for fully-sampled is available in the folder MR sequence/PV-360.3.5.

Enable compressed-sensing acquisition

Compressed-sensing implementation is available through the standard Bruker tab Resolution/Encoding. If you want to perform a compressed-sensing experiment with an acceleration of 2 like the one used here : acceleration factor = 50% and use a calibration size of 5%

##$PVM_EncCSUndersampling=50
-##$PVM_EncCSCenterRatio=5

Source code

Source code is available in this private directory : https://github.com/aTrotier/a_MP2RAGE_CS_360

+Sequence and protocol · SEQ_BRUKER_a_MP2RAGE_CS_360.jl

Sequence and protocols

The sequence, implemented for Bruker Paravision PV-360: 3.5 & 3.6, and the corresponding protocol for fully-sampled is available in the folder MR sequence.

Enable compressed-sensing acquisition

Compressed-sensing implementation is available through the standard Bruker tab Resolution/Encoding. If you want to perform a compressed-sensing experiment with an acceleration of 2 like the one used here : acceleration factor = 50% and use a calibration size of 5%

##$PVM_EncCSUndersampling=50
+##$PVM_EncCSCenterRatio=5

Source code

Source code is available in this private directory : https://github.com/aTrotier/a_MP2RAGE_CS_360