MRArbGrad 1.1.6__tar.gz → 2.0.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1/MRArbGrad.egg-info}/PKG-INFO +1 -1
  2. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/MRArbGrad.egg-info/SOURCES.txt +3 -1
  3. {mrarbgrad-1.1.6/MRArbGrad.egg-info → mrarbgrad-2.0.1}/PKG-INFO +1 -1
  4. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/example/example_BuiltInTraj.py +11 -10
  5. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/example/example_ExternalFunction2D.py +3 -2
  6. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/example/example_ExternalSamples2D.py +3 -2
  7. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/example/example_ExternalSamples3D.py +9 -9
  8. mrarbgrad-2.0.1/mrarbgrad_src/Function.py +369 -0
  9. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/Utility.py +7 -6
  10. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/__init__.py +3 -3
  11. mrarbgrad-2.0.1/mrarbgrad_src/ext/mag/Mag.cpp +438 -0
  12. mrarbgrad-2.0.1/mrarbgrad_src/ext/mag/Mag.h +194 -0
  13. mrarbgrad-2.0.1/mrarbgrad_src/ext/main.cpp +748 -0
  14. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/Cones.h +149 -0
  15. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/MrTraj.h +416 -0
  16. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/MrTraj_2D.h +69 -0
  17. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/Rosette.h +108 -0
  18. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/Seiffert.h +210 -0
  19. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/Shell3d.h +114 -0
  20. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/Spiral.h +60 -0
  21. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/TrajFunc.h +90 -0
  22. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/VarDenSpiral.h +132 -0
  23. mrarbgrad-2.0.1/mrarbgrad_src/ext/traj/Yarnball.h +195 -0
  24. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/Intp.h +91 -0
  25. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/LinIntp.h +62 -0
  26. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/SplineIntp.h +104 -0
  27. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/global.cpp +1 -0
  28. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/global.h +52 -0
  29. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/v3.cpp +361 -0
  30. mrarbgrad-2.0.1/mrarbgrad_src/ext/utility/v3.h +158 -0
  31. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/pyproject.toml +2 -2
  32. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/setup.py +1 -1
  33. mrarbgrad-1.1.6/mrarbgrad_src/Function.py +0 -335
  34. mrarbgrad-1.1.6/mrarbgrad_src/ext/main.cpp +0 -766
  35. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/Cones.h +0 -162
  36. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/MrTraj.h +0 -429
  37. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/MrTraj_2D.h +0 -77
  38. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/Rosette.h +0 -117
  39. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/Seiffert.h +0 -289
  40. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/Shell3d.h +0 -124
  41. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/Spiral.h +0 -58
  42. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/TrajFunc.h +0 -56
  43. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/VarDenSpiral.h +0 -62
  44. mrarbgrad-1.1.6/mrarbgrad_src/ext/traj/Yarnball.h +0 -124
  45. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/Intp.h +0 -91
  46. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/LinIntp.h +0 -62
  47. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/SplineIntp.h +0 -104
  48. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/global.cpp +0 -1
  49. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/global.h +0 -27
  50. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/v3.cpp +0 -322
  51. mrarbgrad-1.1.6/mrarbgrad_src/ext/utility/v3.h +0 -155
  52. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/LICENSE +0 -0
  53. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/MANIFEST.in +0 -0
  54. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/MRArbGrad.egg-info/dependency_links.txt +0 -0
  55. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/MRArbGrad.egg-info/requires.txt +0 -0
  56. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/MRArbGrad.egg-info/top_level.txt +0 -0
  57. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/README.md +0 -0
  58. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/TrajFunc.py +0 -0
  59. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/ext/mag/GradGen.cpp +0 -0
  60. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/ext/mag/GradGen.h +0 -0
  61. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/trajfunc/__init__.py +0 -0
  62. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/mrarbgrad_src/trajfunc/main.py +0 -0
  63. {mrarbgrad-1.1.6 → mrarbgrad-2.0.1}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MRArbGrad
3
- Version: 1.1.6
3
+ Version: 2.0.1
4
4
  Summary: Gradient waveform design tool for arbitrary k-space trajectories.
5
5
  Author-email: Ryan <ryan_shanghaitech@proton.me>
6
6
  License-Expression: MIT
@@ -4,7 +4,7 @@ README.md
4
4
  pyproject.toml
5
5
  setup.py
6
6
  ./mrarbgrad_src/ext/main.cpp
7
- ./mrarbgrad_src/ext/mag/GradGen.cpp
7
+ ./mrarbgrad_src/ext/mag/Mag.cpp
8
8
  ./mrarbgrad_src/ext/utility/global.cpp
9
9
  ./mrarbgrad_src/ext/utility/v3.cpp
10
10
  MRArbGrad.egg-info/PKG-INFO
@@ -23,6 +23,8 @@ mrarbgrad_src/__init__.py
23
23
  mrarbgrad_src/ext/main.cpp
24
24
  mrarbgrad_src/ext/mag/GradGen.cpp
25
25
  mrarbgrad_src/ext/mag/GradGen.h
26
+ mrarbgrad_src/ext/mag/Mag.cpp
27
+ mrarbgrad_src/ext/mag/Mag.h
26
28
  mrarbgrad_src/ext/traj/Cones.h
27
29
  mrarbgrad_src/ext/traj/MrTraj.h
28
30
  mrarbgrad_src/ext/traj/MrTraj_2D.h
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MRArbGrad
3
- Version: 1.1.6
3
+ Version: 2.0.1
4
4
  Summary: Gradient waveform design tool for arbitrary k-space trajectories.
5
5
  Author-email: Ryan <ryan_shanghaitech@proton.me>
6
6
  License-Expression: MIT
@@ -6,11 +6,12 @@ from numpy.linalg import norm
6
6
  gamma = 42.5756e6
7
7
  fov = 0.256
8
8
  nPix = 256
9
- sLim = 50 * gamma * fov/nPix
10
- gLim = 20e-3 * gamma * fov/nPix
11
9
  dtGrad = 10e-6
12
10
  dtADC = 2.5e-6
13
- argCom = dict(dFov=fov, lNPix=nPix, dSLim=sLim, dGLim=gLim, dDt=dtGrad)
11
+ sLim = 50 * gamma * fov/nPix
12
+ gLim = 20e-3 * gamma * fov/nPix
13
+ # gLim = 1/nPix/dtADC
14
+ argCom = dict(fov=fov, nPix=nPix, sLim=sLim, gLim=gLim, dt=dtGrad)
14
15
 
15
16
  mag.setSolverMtg(0) # set solver, 0 for proposed method, 1 for baseline method, baseline method may be removed due to copyright reason
16
17
  mag.setTrajRev(0) # reverse the trajectory
@@ -18,20 +19,20 @@ mag.setGoldAng(1) # enable golden-angle interleaving (only for 2D)
18
19
  mag.setShuf(0) # enable TR-shuffling
19
20
  mag.setMaxG0(0) # use maximum possible initial gradient amplitude
20
21
  mag.setMaxG1(0) # use maximum possible final gradient amplitude
21
- mag.setExGEnd(0) # restrict end-value of the graident exactly the same as requested (turn off only for benchmark purpose)
22
- mag.setMagOv(8) # set oversampling ratio (default: 8, reduce only if hardware performance is too low to support real-time)
22
+ mag.setMagOverSamp(8) # set oversampling ratio (default: 8, reduce only if hardware performance is too low to support real-time)
23
23
  mag.setMagSFS(0) # disable DTFBS (experimental)
24
24
  mag.setMagGradRep(1) # enable gradient reparameterization (experimental)
25
25
  mag.setMagTrajRep(1) # enable trajectory reparameterization (experimental)
26
26
  mag.setDbgPrint(1) # enable debug info (for benchmark purpose)
27
27
 
28
28
  # calculate gradient
29
- # lstArrK0, lstArrGrad = mag.getG_Spiral(bIs3D=0, **argCom); nAx = 2
30
- # lstArrK0, lstArrGrad = mag.getG_VarDenSpiral(bIs3D=0, **argCom); nAx = 2
31
- # lstArrK0, lstArrGrad = mag.getG_Rosette(bIs3D=0, **argCom); nAx = 2
32
- # lstArrK0, lstArrGrad = mag.getG_Rosette_Trad(**argCom, dOm1=10*pi, dOm2=8*pi, dTmax=1, dTacq=2e-03); nAx = 2
29
+ # lstArrK0, lstArrGrad = mag.getG_Spiral(is3D=0, **argCom); nAx = 2
30
+ # lstArrK0, lstArrGrad = mag.getG_VarDenSpiral(is3D=0, **argCom); nAx = 2
31
+ lstArrK0, lstArrGrad = mag.getG_VarDenSpiral_RT(is3D=0, **argCom); nAx = 2
32
+ # lstArrK0, lstArrGrad = mag.getG_Rosette(is3D=0, **argCom); nAx = 2
33
+ # lstArrK0, lstArrGrad = mag.getG_Rosette_Trad(**argCom); nAx = 2
33
34
  # lstArrK0, lstArrGrad = mag.getG_Shell3d(**argCom); nAx = 3
34
- lstArrK0, lstArrGrad = mag.getG_Yarnball(**argCom); nAx = 3
35
+ # lstArrK0, lstArrGrad = mag.getG_Yarnball(**argCom); nAx = 3
35
36
  # lstArrK0, lstArrGrad = mag.getG_Seiffert(**argCom); nAx = 3
36
37
  # lstArrK0, lstArrGrad = mag.getG_Cones(**argCom); nAx = 3
37
38
 
@@ -6,10 +6,11 @@ import mrarbgrad as mag
6
6
  gamma = 42.5756e6
7
7
  fov = 0.256
8
8
  nPix = 256
9
- sLim = 100 * gamma * fov/nPix
10
- gLim = 120e-3 * gamma * fov/nPix
11
9
  dtGrad = 10e-6
12
10
  dtADC = 2.5e-6
11
+ sLim = 50 * gamma * fov/nPix
12
+ gLim = 20e-3 * gamma * fov/nPix
13
+ # gLim = 1/nPix/dtADC
13
14
 
14
15
  # Rosette
15
16
  nAx = 2
@@ -6,10 +6,11 @@ import mrarbgrad as mag
6
6
  gamma = 42.5756e6
7
7
  fov = 0.256
8
8
  nPix = 256
9
- sLim = 100 * gamma * fov/nPix
10
- gLim = 120e-3 * gamma * fov/nPix
11
9
  dtGrad = 10e-6
12
10
  dtADC = 2.5e-6
11
+ sLim = 50 * gamma * fov/nPix
12
+ gLim = 20e-3 * gamma * fov/nPix
13
+ # gLim = 1/nPix/dtADC
13
14
 
14
15
  # Rosette
15
16
  om1 = 5*pi
@@ -6,10 +6,11 @@ import mrarbgrad as mag
6
6
  gamma = 42.5756e6
7
7
  fov = 0.256
8
8
  nPix = 256
9
- sLim = 100 * gamma * fov/nPix
10
- gLim = 120e-3 * gamma * fov/nPix
11
9
  dtGrad = 10e-6
12
10
  dtADC = 2.5e-6
11
+ sLim = 50 * gamma * fov/nPix
12
+ gLim = 20e-3 * gamma * fov/nPix
13
+ # gLim = 1/nPix/dtADC
13
14
 
14
15
  # Yarnball
15
16
  nAx = 3
@@ -19,9 +20,10 @@ Yarnball = lambda sqrtTht: mag.trajfunc.Yarnball(sqrtTht, kRhoPhi)
19
20
  pLim = mag.trajfunc.prange_Yarnball(kRhoPhi)
20
21
 
21
22
  arrP = linspace(pLim[0], pLim[1], 1000)
22
- arrK = Yarnball(arrP).T
23
+ arrK = Yarnball(arrP)
23
24
 
24
25
  # derive slew-rate constrained trajectory
26
+ mag.setDbgPrint(1)
25
27
  arrG, _ = mag.calGrad4ExSamp(True, fov, nPix, sLim, gLim, dtGrad, arrK)
26
28
  nRO, _ = arrG.shape
27
29
 
@@ -32,16 +34,14 @@ arrK, _ = mag.cvtGrad2Traj(arrG, dtGrad, dtADC, 0.5)
32
34
 
33
35
  # derive reference trajectory
34
36
  arrP_Ref = linspace(pLim[0], pLim[1], int(1e4))
35
- arrK_Ref = Yarnball(arrP_Ref).T
37
+ arrK_Ref = Yarnball(arrP_Ref)
36
38
 
37
39
  # plot
38
40
  figure(figsize=(20,10), dpi=120)
39
41
 
40
- subplot(221, projection=None if nAx==2 else "3d")
41
- if nAx==2: plot(arrK_Ref[:,0], arrK_Ref[:,1], "--", label="K_Ref")
42
- if nAx==3: plot(arrK_Ref[:,0], arrK_Ref[:,1], arrK_Ref[:,2], "--", label="K_Ref")
43
- if nAx==2: plot(arrK[:,0], arrK[:,1], ".-", label="K_Imp")
44
- if nAx==3: plot(arrK[:,0], arrK[:,1], arrK[:,2], ".-", label="K_Imp")
42
+ subplot(221, projection="3d")
43
+ plot(arrK_Ref[:,0], arrK_Ref[:,1], arrK_Ref[:,2], "--", label="K_Ref")
44
+ plot(arrK[:,0], arrK[:,1], arrK[:,2], ".-", label="K_Imp")
45
45
  xlim(-0.5,0.5)
46
46
  ylim(-0.5,0.5)
47
47
  axis("equal")
@@ -0,0 +1,369 @@
1
+ from numpy import *
2
+ from matplotlib.pyplot import *
3
+ from numpy.typing import NDArray
4
+ from typing import Callable
5
+ import mrarbgrad.ext as ext
6
+ from .Utility import *
7
+
8
+ goldang = getGoldang()
9
+
10
+ def calGrad4ExFunc\
11
+ (
12
+ is3D: bool = False,
13
+ fov: float64 = 0.256,
14
+ nPix: int64 = 256,
15
+
16
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
17
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
18
+ dt: float64 = 10e-6,
19
+
20
+ getK: Callable|None = None,
21
+ getDkDp: Callable|None = None,
22
+ getD2kDp2: Callable|None = None,
23
+
24
+ p0:float64 = 0e0,
25
+ p1:float64 = 1e0,
26
+ ) -> tuple[NDArray, NDArray]:
27
+ '''
28
+ :return: gradient waveform, corresponding parameter
29
+ :rtype: tuple[NDArray, NDArray]
30
+ '''
31
+ return ext.calGrad4ExFunc\
32
+ (
33
+ int64(is3D),
34
+ float64(fov),
35
+ int64(nPix),
36
+
37
+ float64(sLim),
38
+ float64(gLim),
39
+ float64(dt),
40
+
41
+ getK,
42
+ getDkDp,
43
+ getD2kDp2,
44
+
45
+ float64(p0),
46
+ float64(p1),
47
+ )
48
+
49
+ def calGrad4ExSamp\
50
+ (
51
+ is3D: bool = False,
52
+ fov: float64 = 0.256,
53
+ nPix: int64 = 256,
54
+
55
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
56
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
57
+ dt: float64 = 10e-6,
58
+
59
+ arrK: NDArray = np.empty((0,3)),
60
+ ) -> tuple[NDArray, NDArray]:
61
+ '''
62
+ :return: gradient waveform, corresponding parameter
63
+ :rtype: tuple[NDArray, NDArray]
64
+ '''
65
+ return ext.calGrad4ExSamp\
66
+ (
67
+ int64(is3D),
68
+ float64(fov),
69
+ int64(nPix),
70
+
71
+ float64(sLim),
72
+ float64(gLim),
73
+ float64(dt),
74
+
75
+ arrK
76
+ )
77
+
78
+ def getG_Spiral\
79
+ (
80
+ is3D: bool = False,
81
+ fov: float64 = 0.256,
82
+ nPix: int64 = 256,
83
+
84
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
85
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
86
+ dt: float64 = 10e-6,
87
+
88
+ kRhoPhi: float64 = 0.5 / (4 * pi)
89
+ ) -> tuple[list[NDArray], list[NDArray]]:
90
+ '''
91
+ :return: list of trajectory start, list of gradient waveforms
92
+ :rtype: tuple[list[NDArray], list[NDArray]]
93
+ '''
94
+ return ext.getG_Spiral\
95
+ (
96
+ int64(is3D),
97
+ float64(fov),
98
+ int64(nPix),
99
+
100
+ float64(sLim),
101
+ float64(gLim),
102
+ float64(dt),
103
+
104
+ float64(kRhoPhi)
105
+ )
106
+
107
+ def getG_VarDenSpiral\
108
+ (
109
+ is3D: bool = False,
110
+ fov: float64 = 0.256,
111
+ nPix: int64 = 256,
112
+
113
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
114
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
115
+ dt: float64 = 10e-6,
116
+
117
+ kRhoPhi0: float64 = 0.5 / (8 * pi),
118
+ kRhoPhi1: float64 = 0.5 / (2 * pi),
119
+ ) -> tuple[list[NDArray], list[NDArray]]:
120
+ '''
121
+ :return: list of trajectory start, list of gradient waveforms
122
+ :rtype: tuple[list[NDArray], list[NDArray]]
123
+ '''
124
+ return ext.getG_VarDenSpiral\
125
+ (
126
+ int64(is3D),
127
+ float64(fov),
128
+ int64(nPix),
129
+
130
+ float64(sLim),
131
+ float64(gLim),
132
+ float64(dt),
133
+
134
+ float64(kRhoPhi0),
135
+ float64(kRhoPhi1)
136
+ )
137
+
138
+ def getG_VarDenSpiral_RT\
139
+ (
140
+ is3D: bool = False,
141
+ fov: float64 = 0.256,
142
+ nPix: int64 = 256,
143
+
144
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
145
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
146
+ dt: float64 = 10e-6,
147
+
148
+ kRhoPhi0: float64 = 0.5 / (8 * pi),
149
+ kRhoPhi1: float64 = 0.5 / (2 * pi),
150
+ nAcq: int64 = 1000,
151
+ ) -> tuple[list[NDArray], list[NDArray]]:
152
+ '''
153
+ :return: list of trajectory start, list of gradient waveforms
154
+ :rtype: tuple[list[NDArray], list[NDArray]]
155
+ '''
156
+ return ext.getG_VarDenSpiral_RT\
157
+ (
158
+ int64(is3D),
159
+ float64(fov),
160
+ int64(nPix),
161
+
162
+ float64(sLim),
163
+ float64(gLim),
164
+ float64(dt),
165
+
166
+ float64(kRhoPhi0),
167
+ float64(kRhoPhi1),
168
+
169
+ int64(nAcq)
170
+ )
171
+
172
+ def getG_Rosette\
173
+ (
174
+ is3D: bool = False,
175
+ fov: float64 = 0.256,
176
+ nPix: int64 = 256,
177
+
178
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
179
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
180
+ dt: float64 = 10e-6,
181
+
182
+ om1: float64 = 5*pi,
183
+ om2: float64 = 3*pi,
184
+ tMax: float64 = 1e0,
185
+ ) -> tuple[list[NDArray], list[NDArray]]:
186
+ '''
187
+ :return: list of trajectory start, list of gradient waveforms
188
+ :rtype: tuple[list[NDArray], list[NDArray]]
189
+ '''
190
+ return ext.getG_Rosette\
191
+ (
192
+ int64(is3D),
193
+ float64(fov),
194
+ int64(nPix),
195
+
196
+ float64(sLim),
197
+ float64(gLim),
198
+ float64(dt),
199
+
200
+ float64(om1),
201
+ float64(om2),
202
+ float64(tMax)
203
+ )
204
+
205
+ def getG_Rosette_Trad\
206
+ (
207
+ is3D: bool = False,
208
+ fov: float64 = 0.256,
209
+ nPix: int64 = 256,
210
+
211
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
212
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
213
+ dt: float64 = 10e-6,
214
+
215
+ om1: float64 = 5*pi,
216
+ om2: float64 = 3*pi,
217
+ tMax: float64 = 1e0,
218
+ tAcq: float64 = 2.523e-3,
219
+ ) -> tuple[list[NDArray], list[NDArray]]:
220
+ '''
221
+ :return: list of trajectory start, list of gradient waveforms
222
+ :rtype: tuple[list[NDArray], list[NDArray]]
223
+ '''
224
+ return ext.getG_Rosette_Trad\
225
+ (
226
+ int64(is3D),
227
+ float64(fov),
228
+ int64(nPix),
229
+
230
+ float64(sLim),
231
+ float64(gLim),
232
+ float64(dt),
233
+
234
+ float64(om1),
235
+ float64(om2),
236
+ float64(tMax),
237
+ float64(tAcq)
238
+ )
239
+
240
+ def getG_Shell3d\
241
+ (
242
+ is3D: bool = False,
243
+ fov: float64 = 0.256,
244
+ nPix: int64 = 256,
245
+
246
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
247
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
248
+ dt: float64 = 10e-6,
249
+
250
+ kRhoTht: float64 = 0.5 / (2 * pi),
251
+ ) -> tuple[list[NDArray], list[NDArray]]:
252
+ '''
253
+ :return: list of trajectory start, list of gradient waveforms
254
+ :rtype: tuple[list[NDArray], list[NDArray]]
255
+ '''
256
+ return ext.getG_Shell3d\
257
+ (
258
+ int64(is3D),
259
+ float64(fov),
260
+ int64(nPix),
261
+
262
+ float64(sLim),
263
+ float64(gLim),
264
+ float64(dt),
265
+
266
+ float64(kRhoTht),
267
+ )
268
+
269
+ def getG_Yarnball\
270
+ (
271
+ is3D: bool = False,
272
+ fov: float64 = 0.256,
273
+ nPix: int64 = 256,
274
+
275
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
276
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
277
+ dt: float64 = 10e-6,
278
+
279
+ kRhoPhi: float64 = 0.5 / (2 * pi),
280
+ ) -> tuple[list[NDArray], list[NDArray]]:
281
+ '''
282
+ :return: list of trajectory start, list of gradient waveforms
283
+ :rtype: tuple[list[NDArray], list[NDArray]]
284
+ '''
285
+ return ext.getG_Yarnball\
286
+ (
287
+ int64(is3D),
288
+ float64(fov),
289
+ int64(nPix),
290
+
291
+ float64(sLim),
292
+ float64(gLim),
293
+ float64(dt),
294
+
295
+ float64(kRhoPhi),
296
+ )
297
+
298
+ def getG_Seiffert\
299
+ (
300
+ is3D: bool = False,
301
+ fov: float64 = 0.256,
302
+ nPix: int64 = 256,
303
+
304
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
305
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
306
+ dt: float64 = 10e-6,
307
+
308
+ m: float64 = 0.07,
309
+ uMax: float64 = 20.0,
310
+ ) -> tuple[list[NDArray], list[NDArray]]:
311
+ '''
312
+ :return: list of trajectory start, list of gradient waveforms
313
+ :rtype: tuple[list[NDArray], list[NDArray]]
314
+ '''
315
+ return ext.getG_Seiffert\
316
+ (
317
+ int64(is3D),
318
+ float64(fov),
319
+ int64(nPix),
320
+
321
+ float64(sLim),
322
+ float64(gLim),
323
+ float64(dt),
324
+
325
+ float64(m),
326
+ float64(uMax),
327
+ )
328
+
329
+ def getG_Cones\
330
+ (
331
+ is3D: bool = False,
332
+ fov: float64 = 0.256,
333
+ nPix: int64 = 256,
334
+
335
+ sLim: float64 = 50 * 42.5756e6 * 0.256 / 256,
336
+ gLim: float64 = 50e-3 * 42.5756e6 * 0.256 / 256,
337
+ dt: float64 = 10e-6,
338
+
339
+ kRhoPhi: float64 = 0.5 / (4 * pi),
340
+ ) -> tuple[list[NDArray], list[NDArray]]:
341
+ '''
342
+ :return: list of trajectory start, list of gradient waveforms
343
+ :rtype: tuple[list[NDArray], list[NDArray]]
344
+ '''
345
+ return ext.getG_Cones\
346
+ (
347
+ int64(is3D),
348
+ float64(fov),
349
+ int64(nPix),
350
+
351
+ float64(sLim),
352
+ float64(gLim),
353
+ float64(dt),
354
+
355
+ float64(kRhoPhi),
356
+ )
357
+
358
+ def setSolverMtg(x): ext.setSolverMtg(x)
359
+ def setTrajRev(x): ext.setTrajRev(x)
360
+ def setGoldAng(x): ext.setGoldAng(x)
361
+ def setShuf(x): ext.setShuf(x)
362
+ def setMaxG0(x): ext.setMaxG0(x)
363
+ def setMaxG1(x): ext.setMaxG1(x)
364
+ def setExGEnd(x): ext.setExGEnd(x)
365
+ def setMagOverSamp(x): ext.setMagOverSamp(x)
366
+ def setMagSFS(x): ext.setMagSFS(x)
367
+ def setMagGradRep(x): ext.setMagGradRep(x)
368
+ def setMagTrajRep(x): ext.setMagTrajRep(x)
369
+ def setDbgPrint(x): ext.setDbgPrint(x)
@@ -8,12 +8,13 @@ goldang = (2*pi)/(1+goldrat)
8
8
  getGoldrat = lambda: goldrat
9
9
  getGoldang = lambda: goldang
10
10
 
11
- def rand2d(i:int|NDArray) -> NDArray:
12
- ky = goldrat
13
- kx = sqrt(3)
14
- y = (i**1 * 1/(1+ky))%1
15
- x = (i**2 * 1/(1+kx))%1
16
- return vstack([y,x]).T
11
+ def rand3d(i:int|NDArray, nAx:int=3, kx=sqrt(2), ky=sqrt(3), kz=sqrt(7)) -> NDArray:
12
+ return (hstack if size(i)==1 else vstack)\
13
+ ([
14
+ (i**1 * 1/(1+kx))%1,
15
+ (i**2 * 1/(1+ky))%1,
16
+ (i**3 * 1/(1+kz))%1
17
+ ][:nAx]).T
17
18
 
18
19
  def cvtGrad2Traj(arrG:NDArray, dtGrad:int|float, dtADC:int|float, nShift:int|float=1.0) -> tuple[NDArray, NDArray]:
19
20
  """
@@ -1,6 +1,6 @@
1
1
  from .Function import calGrad4ExFunc, calGrad4ExSamp
2
- from .Function import getG_Cones, getG_Rosette, getG_Rosette_Trad, getG_Seiffert, getG_Shell3d, getG_Spiral, getG_VarDenSpiral, getG_Yarnball
3
- from .Function import setSolverMtg, setTrajRev, setGoldAng, setShuf, setMaxG0, setMaxG1, setExGEnd, setMagOv, setMagSFS, setMagGradRep, setMagTrajRep, setDbgPrint
4
- from .Utility import _calDiaphony, rotate, _calJacElip, _calCompElipInt, _calSphFibPt, cvtGrad2Traj, getGoldang, getGoldrat, rand2d
2
+ from .Function import getG_Cones, getG_Rosette, getG_Rosette_Trad, getG_Seiffert, getG_Shell3d, getG_Spiral, getG_VarDenSpiral, getG_VarDenSpiral_RT, getG_Yarnball
3
+ from .Function import setSolverMtg, setTrajRev, setGoldAng, setShuf, setMaxG0, setMaxG1, setExGEnd, setMagOverSamp, setMagSFS, setMagGradRep, setMagTrajRep, setDbgPrint
4
+ from .Utility import _calDiaphony, rotate, _calJacElip, _calCompElipInt, _calSphFibPt, cvtGrad2Traj, getGoldang, getGoldrat, rand3d
5
5
 
6
6
  from . import trajfunc