-
Notifications
You must be signed in to change notification settings - Fork 19
Add prephasors, rewinders etc. #276
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 139 commits
Commits
Show all changes
150 commits
Select commit
Hold shift + click to select a range
8ca012c
Added
3a980c2
Merge branch 'mind-inria:master' into master
chaithyagr 093edfb
Fix
f8a6a4a
Merge branch 'master' of github.com:chaithyagr/mri-nufft
74c1ecd
Remove bymistake add
0250aa8
Fix
060a8bd
Fixed lint
aecb844
Lint
3130bc1
Added refbackend
bc014b8
Fix NDFT
0cc73c4
feat: use finufft as ref backend.
paquiteau 21e090f
feat(tests): move ndft vs nufft tests to own file.
paquiteau 6869a4a
Merge branch 'master' of github.com:mind-inria/mri-nufft
f8364d4
Merge branch 'master' of github.com:mind-inria/mri-nufft
23a63da
Merge branch 'master' of github.com:mind-inria/mri-nufft
3709e74
Merge branch 'master' of github.com:mind-inria/mri-nufft
8d6b9b4
Merge branch 'master' of github.com:chaithyagr/mri-nufft
chaithyagr 398fb28
Merge branch 'master' of github.com:mind-inria/mri-nufft
chaithyagr bcf7ce3
git Merge branch 'master' of github.com:mind-inria/mri-nufft
chaithyagr 3da762f
Add support for pipe
chaithyagr d644cf6
\!docs_build try to run cufinufft tests
chaithyagr 0dca8f6
\!docs_build fix style
chaithyagr 643e1e9
Added next235 for stability
chaithyagr af6bbfa
Fix lint
chaithyagr 02c834f
Fix CUPY
chaithyagr d50f427
Merge branch 'master' into cufinufft
chaithyagr 8cfd427
WIP
chaithyagr ab6eaa4
merge
chaithyagr 3c3f1c8
Updates
chaithyagr bb28eb9
fix back learn examples
chaithyagr cdf75af
move tto flatiron
chaithyagr 986fb96
fix black
chaithyagr d4edc58
Move to test on GPU
chaithyagr 1d01484
Update pyproject toml and use it in test-ci, to prevent duplication o…
chaithyagr 9714ca9
Make CI build shorter
chaithyagr aba2c8f
Merge branch 'master' into cufinufft
chaithyagr 78c60f9
Test run to run
chaithyagr d5fc2f6
Merge branch 'cufinufft' of github.com:chaithyagr/mri-nufft into cufi…
chaithyagr d844816
\!docs_build Added
chaithyagr 2d58e02
Merge branch 'master' into cufinufft
chaithyagr 3059ed5
Merge branch 'master' of github.com:mind-inria/mri-nufft
chaithyagr 7a6f4a0
adding density normalization
d7e7123
Start support for finufft spread and interpolate (pipe)
chaithyagr 95ec156
Merge branch 'master' into finufft
chaithyagr db9290b
Add support for density comp
chaithyagr 5dc9da9
Add support for normlize back
chaithyagr 363774a
Merge branch 'master' of github.com:mind-inria/mri-nufft
0b8d97d
Merge branch 'master' of github.com:mind-inria/mri-nufft
df10d86
Added a bunch of extra codes
f280aae
PEP fixes
9e8010e
Update siemens.py
chaithyagr 53cad71
Added fixes
12c2c6a
add [docs]
3f87e64
Fixes and updates on the locatuions
ab37e30
Update the codes to be in sync with cufinufft / finufft 2.4.0
7187491
Merge branch 'master' into finufft
chaithyagr d945183
Merge branch 'finufft' of github.com:chaithyagr/mri-nufft into finufft
f25799d
Merge branch 'master' of github.com:mind-inria/mri-nufft
32236b4
Merge branch 'master' of github.com:mind-inria/mri-nufft
chaithyagr 5273918
Merge branch 'master' of github.com:mind-inria/mri-nufft
ea175f9
Merge branch 'master' of github.com:mind-inria/mri-nufft
chaithyagr 1811135
Merged to master
chaithyagr 6bb4058
Merged to master
chaithyagr 8099f5d
[style]
chaithyagr 4ede0e2
Fix toml ffile [docs]
chaithyagr 7b6da14
Fix toml ffile [docs]
chaithyagr bc09146
Update testbatch stuff
chaithyagr c091f90
Update the tests
chaithyagr 6fe4dae
Fixed tests againnnn
chaithyagr c63214a
All set
chaithyagr 68c1e45
Add finufft
chaithyagr ca72ece
Updates
chaithyagr a2c82d9
Fixes
chaithyagr 2263ecd
More fixes
chaithyagr 5bd1494
make tests less strict again
chaithyagr 61d803f
remove bymistake
chaithyagr e2c115a
Remove strictness, everything works, hopefully [docs]
chaithyagr 0699ae3
Merge branch 'master' into finufft
chaithyagr 843599f
[docs] setup cufinufft also
chaithyagr 7804bdc
[docs] fix style
chaithyagr 1793f76
[docs] more updates, fixes
chaithyagr 4f6fef2
pywavelets
chaithyagr 0ff6838
[docs] fixes further
chaithyagr c843435
[docs] try again
chaithyagr 6a21f31
[docs] final comments
chaithyagr fceb8a3
[docs] method class use
chaithyagr ee7552d
WIP, updated codes to get itw orking
chaithyagr f6f12d6
trying to vectorize
chaithyagr 5ed5d33
WIP
chaithyagr b9cdd4a
WIP
chaithyagr c5c5769
added direct change
chaithyagr ef4c7d2
More updates
chaithyagr d9cbaa8
Added timing and gradients
chaithyagr 18ab02d
Update gradspec and codes
chaithyagr d094ecf
Update the error for slew
chaithyagr caf6401
Added tests
chaithyagr 00f0c77
Setup PEP, ready for review
chaithyagr 72a6a48
Minor update on spec
chaithyagr eb594f2
WIP
chaithyagr 43f5ae4
Fixes for tests
chaithyagr ff04c73
fix docs
chaithyagr 030ba89
Update src/mrinufft/io/nsp.py
chaithyagr 4d7ef5a
remove unused stuff
chaithyagr 669353d
Final fixes. [docs]
chaithyagr 4c7fbcf
Haandleing comments
chaithyagr 8535e49
Update src/mrinufft/trajectories/tools.py
chaithyagr d81e17d
[docs] update the docnames
chaithyagr 82d6bfd
update TE_pos
chaithyagr 1c8a1d7
style fixes
chaithyagr 8c6dfd7
style fixes
chaithyagr f5984e2
Merge branch 'master' into update_traj_specs
chaithyagr 5dba80c
Merge pull request #269 from chaithyagr/update_traj_specs
chaithyagr 4475574
Merge branch 'master' into add_prephasors
chaithyagr 99382ed
Fix for ramps
chaithyagr 37e038c
Update src/mrinufft/trajectories/tools.py
chaithyagr f5160b0
Apply suggestions from code review
chaithyagr a48a6ad
Update src/mrinufft/io/nsp.py
chaithyagr e18dace
Update src/mrinufft/io/nsp.py
chaithyagr aaa3a16
Update src/mrinufft/io/nsp.py
chaithyagr c2e0cb0
Update src/mrinufft/io/nsp.py
chaithyagr 2293e0c
Handle comments
chaithyagr 1d0886e
Updated according to comments
chaithyagr 20b4b1c
rename parameters and fix ordering
chaithyagr 79dcf6c
Merge branch 'master' into add_prephasors
chaithyagr ce88302
Handle comments
chaithyagr 06c70a7
Merge branch 'master' into add_prephasors
chaithyagr 4cbf5ba
Update codes
chaithyagr 83c56fb
Merge branch 'add_prephasors' of github.com:mind-inria/mri-nufft into…
chaithyagr 5a3c7b2
More updates
chaithyagr c7b029b
Fixed some bugs
chaithyagr 1a746d6
Update the tools
chaithyagr af94165
style fixes and [docs]
chaithyagr a53719f
More bugs! Fixes
chaithyagr 7cf0890
[WIP]
chaithyagr 4cea1ac
Updateds WIP
9db59e3
wip
13f3c13
WIP: moved to solvers
c182941
Fixed everything, ready for review
c18283a
Update src/mrinufft/trajectories/tools.py
chaithyagr 7a447c5
style fixes
8f2fffd
Merge branch 'add_prephasors' of github.com:mind-inria/mri-nufft into…
12ce016
Update ruff
935b52b
Added joblib
1429f27
style changes [docs]
386097a
Apply suggestions from code review
chaithyagr 5b9e621
Renaming
3450ede
Fix more comments
d131f47
Undo changes
b9b307f
fix undo
8e54c61
refactor: split test in two
paquiteau File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -8,6 +8,7 @@ | |
| from datetime import datetime | ||
|
|
||
| import numpy as np | ||
| from typing import Optional | ||
|
|
||
| from mrinufft.trajectories.utils import ( | ||
| DEFAULT_GMAX, | ||
|
|
@@ -19,6 +20,7 @@ | |
| convert_gradients_to_slew_rates, | ||
| convert_trajectory_to_gradients, | ||
| ) | ||
| from mrinufft.trajectories.tools import get_gradient_amplitudes_to_travel_for_set_time | ||
|
|
||
| from .siemens import read_siemens_rawdat | ||
|
|
||
|
|
@@ -29,14 +31,16 @@ def write_gradients( | |
| grad_filename: str, | ||
| img_size: tuple[int, ...], | ||
| FOV: tuple[float, ...], | ||
| in_out: bool = True, | ||
| TE_pos: float = 0.5, | ||
| min_osf: int = 5, | ||
| gamma: float = Gammas.HYDROGEN, | ||
| version: float = 4.2, | ||
| recon_tag: float = 1.1, | ||
| timestamp: float | None = None, | ||
| keep_txt_file: bool = False, | ||
| final_positions: np.ndarray | None = None, | ||
| start_skip_samples: int = 0, | ||
| end_skip_samples: int = 0, | ||
| ): | ||
| """Create gradient file from gradients and initial positions. | ||
|
|
||
|
|
@@ -52,8 +56,10 @@ def write_gradients( | |
| Image size. | ||
| FOV : tuple[float, ...] | ||
| Field of view. | ||
| in_out : bool, optional | ||
| Whether it is In-Out trajectory?, by default True | ||
| TE_pos : float, optional | ||
| The ratio of trajectory when TE occurs, with 0 as start of | ||
| trajectory and 1 as end. By default 0.5, which is the | ||
| center of the trajectory (in-out trajectory). | ||
| min_osf : int, optional | ||
| Minimum oversampling factor needed at ADC, by default 5 | ||
| gamma : float, optional | ||
|
|
@@ -69,6 +75,12 @@ def write_gradients( | |
| binary file, by default False | ||
| final_positions : np.ndarray, optional | ||
| Final positions. Shape (num_shots, dimension), by default None | ||
| start_skip_samples : int, optional | ||
| Number of samples to skip in ADC at start of each shot, by default 0 | ||
| This works only for version >= 5.1. | ||
| end_skip_samples : int, optional | ||
| Number of samples to skip in ADC at end of each shot, by default 0 | ||
| This works only for version >= 5.1. | ||
|
|
||
| """ | ||
| num_shots = gradients.shape[0] | ||
|
|
@@ -100,14 +112,12 @@ def write_gradients( | |
| file.write(str(num_shots) + "\n") | ||
| file.write(str(num_samples_per_shot) + "\n") | ||
| if version >= 4.1: | ||
| if not in_out: | ||
| if TE_pos == 0: | ||
| if np.sum(initial_positions) != 0: | ||
| warnings.warn( | ||
| "The initial positions are not all zero for center-out trajectory" | ||
| ) | ||
| file.write("0\n") | ||
| else: | ||
| file.write("0.5\n") | ||
| file.write(str(TE_pos) + "\n") | ||
| # Write the maximum Gradient | ||
| file.write(str(max_grad) + "\n") | ||
| # Write recon Pipeline version tag | ||
|
|
@@ -119,6 +129,10 @@ def write_gradients( | |
| timestamp = float(datetime.now().timestamp()) | ||
| file.write(str(timestamp) + "\n") | ||
| left_over -= 1 | ||
| if version >= 5.1: | ||
| file.write(str(start_skip_samples) + "\n") | ||
| file.write(str(end_skip_samples) + "\n") | ||
| left_over -= 2 | ||
| file.write(str("0\n" * left_over)) | ||
| # Write all the k0 values | ||
| file.write( | ||
|
|
@@ -165,7 +179,7 @@ def write_gradients( | |
| os.remove(grad_filename + ".txt") | ||
|
|
||
|
|
||
| def _pop_elements(array, num_elements=1, type="float"): | ||
| def _pop_elements(array, num_elements=1, type=np.float32): | ||
| """Pop elements from an array. | ||
|
|
||
| Parameters | ||
|
|
@@ -200,8 +214,11 @@ def write_trajectory( | |
| gamma: float = Gammas.HYDROGEN, | ||
| raster_time: float = DEFAULT_RASTER_TIME, | ||
| check_constraints: bool = True, | ||
| TE_pos: float = 0.5, | ||
| gmax: float = DEFAULT_GMAX, | ||
| smax: float = DEFAULT_SMAX, | ||
| pregrad: str | None = None, | ||
| postgrad: str | None = None, | ||
| version: float = 5, | ||
| **kwargs, | ||
| ): | ||
|
|
@@ -226,10 +243,26 @@ def write_trajectory( | |
| Gradient raster time in ms, by default 0.01 | ||
| check_constraints : bool, optional | ||
| Check scanner constraints, by default True | ||
| TE_pos : float, optional | ||
| The ratio of trajectory when TE occurs, with 0 as start of | ||
| trajectory and 1 as end. By default 0.5, which is the | ||
| center of the trajectory (in-out trajectory). | ||
| gmax : float, optional | ||
| Maximum gradient magnitude in T/m, by default 0.04 | ||
| smax : float, optional | ||
| Maximum slew rate in T/m/ms, by default 0.1 | ||
| pregrad : str, optional | ||
| Pregrad method, by default `prephase` | ||
| `prephase` will add a prephasing gradient to the start of the trajectory. | ||
| postgrad : str, optional | ||
| Postgrad method, by default 'slowdown_to_edge' | ||
| `slowdown_to_edge` will add a gradient to slow down to the edge of the k-space | ||
| along x-axis for all the shots i.e. go to (Kmax, 0, 0). | ||
| This is useful for sequences needing a spoiler at the end of the trajectory. | ||
| However, spoiler is still not added, it is expected that the sequence | ||
| handles the spoilers, which can be variable. | ||
chaithyagr marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| `slowdown_to_center` will add a gradient to slow down to the center | ||
| of the k-space. | ||
| version: float, optional | ||
| Trajectory versioning, by default 5 | ||
| kwargs : dict, optional | ||
|
|
@@ -245,7 +278,46 @@ def write_trajectory( | |
| gamma=gamma, | ||
| get_final_positions=True, | ||
| ) | ||
|
|
||
| Ns_to_skip_at_start = 0 | ||
| Ns_to_skip_at_end = 0 | ||
| scan_consts = { | ||
| "gamma": gamma, | ||
| "gmax": gmax, | ||
| "smax": smax, | ||
| "raster_time": raster_time, | ||
| } | ||
| if pregrad == "prephase": | ||
| if version < 5.1: | ||
| raise ValueError( | ||
| "pregrad is only supported for version >= 5.1, " | ||
| "please set version to 5.1 or higher." | ||
| ) | ||
| start_gradients = get_gradient_amplitudes_to_travel_for_set_time( | ||
| kspace_end_loc=initial_positions, | ||
| end_gradients=gradients[:, 0], | ||
| **scan_consts, | ||
| ) | ||
| initial_positions = np.zeros_like(initial_positions) | ||
| gradients = np.hstack([start_gradients, gradients]) | ||
| Ns_to_skip_at_start = start_gradients.shape[1] | ||
| if postgrad: | ||
| if version < 5.1: | ||
| raise ValueError( | ||
| "postgrad is only supported for version >= 5.1, " | ||
| "please set version to 5.1 or higher." | ||
| ) | ||
| edge_locations = np.zeros_like(final_positions) | ||
| if postgrad == "slowdown_to_edge": | ||
| # Always end at KMax, the spoilers can be handeled by the sequence. | ||
| edge_locations[..., 0] = img_size[0] / FOV[0] / 2 | ||
| end_gradients = get_gradient_amplitudes_to_travel_for_set_time( | ||
| kspace_end_loc=edge_locations, | ||
| start_gradients=gradients[:, -1], | ||
| kspace_start_loc=final_positions, | ||
| **scan_consts, | ||
| ) | ||
| gradients = np.hstack([gradients, end_gradients]) | ||
| Ns_to_skip_at_end = end_gradients.shape[1] | ||
| # Check constraints if requested | ||
| if check_constraints: | ||
| slewrates, _ = convert_gradients_to_slew_rates(gradients, raster_time) | ||
|
|
@@ -261,6 +333,15 @@ def write_trajectory( | |
| f"Maximum gradient amplitude: {maxG:.3f} > {gmax:.3f}" | ||
| f"Maximum slew rate: {maxS:.3f} > {smax:.3f}" | ||
| ) | ||
| if pregrad != "prephase": | ||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be safer without the prephase check (we always want to raise warning if the slew-rate is not hardware compatible)
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
| border_slew_rate = gradients[:, 0] / raster_time | ||
| if np.any(np.abs(border_slew_rate) > smax): | ||
| warnings.warn( | ||
| "Slew rate at start of trajectory exceeds maximum slew rate!" | ||
| f"Maximum slew rate: {np.max(np.abs(border_slew_rate)):.3f}" | ||
| f" > {smax:.3f}. Please use prephase gradient to avoid this " | ||
| " issue." | ||
| ) | ||
|
|
||
| # Write gradients in file | ||
| write_gradients( | ||
|
|
@@ -270,16 +351,19 @@ def write_trajectory( | |
| grad_filename=grad_filename, | ||
| img_size=img_size, | ||
| FOV=FOV, | ||
| TE_pos=TE_pos, | ||
| gamma=gamma, | ||
| version=version, | ||
| start_skip_samples=Ns_to_skip_at_start, | ||
| end_skip_samples=Ns_to_skip_at_end, | ||
| **kwargs, | ||
| ) | ||
|
|
||
|
|
||
| def read_trajectory( | ||
| grad_filename: str, | ||
| dwell_time: float | str = DEFAULT_RASTER_TIME, | ||
| num_adc_samples: int = None, | ||
| num_adc_samples: int | None = None, | ||
| gamma: Gammas | float = Gammas.HYDROGEN, | ||
| raster_time: float = DEFAULT_RASTER_TIME, | ||
| read_shots: bool = False, | ||
|
|
@@ -336,25 +420,27 @@ def read_trajectory( | |
| if dwell_time == "min_osf": | ||
| dwell_time = raster_time / min_osf | ||
| (num_shots, num_samples_per_shot), data = _pop_elements(data, 2, type="int") | ||
| if num_adc_samples is None: | ||
| if read_shots: | ||
| num_adc_samples = num_samples_per_shot + 1 | ||
| else: | ||
| num_adc_samples = int(num_samples_per_shot * (raster_time / dwell_time)) | ||
| if version >= 4.1: | ||
| if version > 4: | ||
| TE, data = _pop_elements(data) | ||
| grad_max, data = _pop_elements(data) | ||
| recon_tag, data = _pop_elements(data) | ||
| recon_tag = np.around(recon_tag, 2) | ||
| left_over = 10 | ||
| if version >= 4.2: | ||
| if version > 4.1: | ||
| timestamp, data = _pop_elements(data) | ||
| timestamp = datetime.fromtimestamp(float(timestamp)) | ||
| left_over -= 1 | ||
| if version > 5: | ||
| packed_skips, data = _pop_elements(data, num_elements=2, type="int") | ||
| start_skip_samples, end_skip_samples = packed_skips | ||
| left_over -= 2 | ||
| else: | ||
| start_skip_samples = 0 | ||
| end_skip_samples = 0 | ||
| _, data = _pop_elements(data, left_over) | ||
| initial_positions, data = _pop_elements(data, dimension * num_shots) | ||
| initial_positions = np.reshape(initial_positions, (num_shots, dimension)) | ||
| if version >= 5: | ||
| if version > 4.5: | ||
| final_positions, data = _pop_elements(data, dimension * num_shots) | ||
| final_positions = np.reshape(final_positions, (num_shots, dimension)) | ||
| dwell_time_ns = dwell_time * 1e6 | ||
|
|
@@ -365,12 +451,28 @@ def read_trajectory( | |
| data, | ||
| dimension * num_samples_per_shot * num_shots, | ||
| ) | ||
| # Convert gradients to T/m | ||
| gradients = np.reshape( | ||
| grad_max * gradients, (num_shots * num_samples_per_shot, dimension) | ||
| grad_max * gradients * 1e-3, (num_shots, num_samples_per_shot, dimension) | ||
paquiteau marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| ) | ||
| # Convert gradients from mT/m to T/m | ||
| gradients = np.reshape(gradients * 1e-3, (-1, num_samples_per_shot, dimension)) | ||
| kspace_loc = np.zeros((num_shots, num_adc_samples, dimension)) | ||
| # Handle skipped samples | ||
| if start_skip_samples > 0: | ||
| start_location_updates = ( | ||
| np.sum(gradients[:, :start_skip_samples], axis=1) * raster_time * gamma | ||
| ) | ||
| initial_positions += start_location_updates | ||
| gradients = gradients[:, start_skip_samples:, :] | ||
| num_samples_per_shot -= start_skip_samples | ||
| if end_skip_samples > 0: | ||
| gradients = gradients[:, :-end_skip_samples, :] | ||
| num_samples_per_shot -= end_skip_samples | ||
| if num_adc_samples is None: | ||
| if read_shots: | ||
| # Acquire one extra sample at the end of each shot in read_shots mode | ||
| num_adc_samples = num_samples_per_shot + 1 | ||
| else: | ||
| num_adc_samples = int(num_samples_per_shot * (raster_time / dwell_time)) | ||
| kspace_loc = np.zeros((num_shots, num_adc_samples, dimension), dtype=np.float32) | ||
| kspace_loc[:, 0, :] = initial_positions | ||
| adc_times = dwell_time_ns * np.arange(1, num_adc_samples) | ||
| Q, R = divmod(adc_times, gradient_raster_time_ns) | ||
|
|
||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Previous discussion: https://github.com/mind-inria/mri-nufft/pull/269/files#r2139372805
You mentioned it will be used in the future, I would prefer to keep MRs split as otherwise it's easy to get tons of dead features, and it's difficult to review efficiently.
Also again what about trajectories with multiple echoes in one readout ? We already have some
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am okay with changing it back, but I felt its smaller change to be added here. On the other hand, multi-echo sequence is not even supported at the moment by our sequence and hence adding its support in trajectory specification seems cumbersome and useless. The support for TE_pos has been exisiting for quite some time. Sorry for complication here, I just realized we had it wrong here and made the change