MRArbGrad 4.1.1__tar.gz → 4.2.0__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 (41) hide show
  1. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0/MRArbGrad.egg-info}/PKG-INFO +1 -1
  2. {mrarbgrad-4.1.1/MRArbGrad.egg-info → mrarbgrad-4.2.0}/PKG-INFO +1 -1
  3. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/Function.py +2 -0
  4. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/__init__.py +1 -1
  5. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/mag/Mag.cpp +20 -18
  6. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/mag/Mag.h +7 -7
  7. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/main.cpp +20 -0
  8. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/MrTraj.h +7 -3
  9. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/LinIntp.h +0 -2
  10. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/SplineIntp.h +0 -2
  11. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/v3.cpp +16 -9
  12. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/pyproject.toml +1 -1
  13. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/LICENSE +0 -0
  14. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/MANIFEST.in +0 -0
  15. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/MRArbGrad.egg-info/SOURCES.txt +0 -0
  16. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/MRArbGrad.egg-info/dependency_links.txt +0 -0
  17. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/MRArbGrad.egg-info/requires.txt +0 -0
  18. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/MRArbGrad.egg-info/top_level.txt +0 -0
  19. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/README.md +0 -0
  20. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/example/example_BuiltInTraj.py +0 -0
  21. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/example/example_ExternalFunction2D.py +0 -0
  22. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/example/example_ExternalSamples2D.py +0 -0
  23. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/example/example_ExternalSamples3D.py +0 -0
  24. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/Utility.py +0 -0
  25. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/Cones.h +0 -0
  26. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/MrTraj_2D.h +0 -0
  27. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/Rosette.h +0 -0
  28. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/Seiffert.h +0 -0
  29. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/Shell3d.h +0 -0
  30. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/Spiral.h +0 -0
  31. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/TrajFunc.h +0 -0
  32. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/VDSpiral.h +0 -0
  33. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/traj/Yarnball.h +0 -0
  34. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/Intp.h +0 -0
  35. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/global.cpp +0 -0
  36. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/global.h +0 -0
  37. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/ext/utility/v3.h +0 -0
  38. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/trajfunc/__init__.py +0 -0
  39. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/mrarbgrad_src/trajfunc/main.py +0 -0
  40. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/setup.cfg +0 -0
  41. {mrarbgrad-4.1.1 → mrarbgrad-4.2.0}/setup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MRArbGrad
3
- Version: 4.1.1
3
+ Version: 4.2.0
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
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: MRArbGrad
3
- Version: 4.1.1
3
+ Version: 4.2.0
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
@@ -371,6 +371,8 @@ def setGoldAng(x): ext.setGoldAng(x)
371
371
  def setShuf(x): ext.setShuf(x)
372
372
  def setMaxG0(x): ext.setMaxG0(x)
373
373
  def setMaxG1(x): ext.setMaxG1(x)
374
+ def setMagGradSamp(x): ext.setMagGradSamp(x)
375
+ def setMagTrajSamp(x): ext.setMagTrajSamp(x)
374
376
  def setMagOverSamp(x): ext.setMagOverSamp(x)
375
377
  def setMagSFS(x): ext.setMagSFS(x)
376
378
  def setMagGradRep(x): ext.setMagGradRep(x)
@@ -1,6 +1,6 @@
1
1
  from .Function import calGrad4ExFunc, calGrad4ExSamp
2
2
  from .Function import getG_Cones, getG_Rosette, getG_Rosette_Trad, getG_Seiffert, getG_Shell3d, getG_Spiral, getG_VDSpiral, getG_VDSpiral_RT, getG_Yarnball, getG_Yarnball_RT
3
- from .Function import setSolverMtg, setTrajRev, setGoldAng, setShuf, setMaxG0, setMaxG1, setMagOverSamp, setMagSFS, setMagGradRep, setMagTrajRep, setDbgPrint, saveF64, loadF64, saveF32, loadF32
3
+ from .Function import setSolverMtg, setTrajRev, setGoldAng, setShuf, setMaxG0, setMaxG1, setMagGradSamp, setMagTrajSamp, setMagOverSamp, setMagSFS, setMagGradRep, setMagTrajRep, setDbgPrint, saveF64, loadF64, saveF32, loadF32
4
4
  from .Utility import _calDiaphony, rotate, _calJacElip, _calCompElipInt, _calSphFibPt, cvtGrad2Traj, getGoldang, getGoldrat, rand3d, gradClip
5
5
 
6
6
  from . import trajfunc
@@ -8,29 +8,31 @@ i64 gMag_oversamp = -1; // oversample ratio, overwrite the set value
8
8
  bool gMag_enSFS = false; // Single Forward Sweep flag
9
9
  bool gMag_enGradRep = true; // Gradient Reparameterization
10
10
  bool gMag_enTrajRep = true; // use trajectory reparameterization for MAG solver
11
- i64 gMag_nTrajSamp = 1000; // num. of samp. when doing Traj. Rep.
12
11
 
13
- Mag::Mag()
12
+ Mag::Mag(i64 nGradSampRsv, i64 nTrajSampRsv)
14
13
  {
15
14
  // for solver
16
- m_dt = 10e-6; m_oversamp = 8;
17
- i64 nSampReserve = i64(100e-3/m_dt); // reserve for 100ms
15
+ if (nGradSampRsv)
16
+ {
17
+ m_vf64P_Bac.reserve(nGradSampRsv * 8);
18
+ m_vv3G_Bac.reserve(nGradSampRsv * 8);
19
+ m_vf64GNorm_Bac.reserve(nGradSampRsv * 8);
18
20
 
19
- m_vf64P_Bac.reserve(nSampReserve*m_oversamp);
20
- m_vv3G_Bac.reserve(nSampReserve*m_oversamp);
21
- m_vf64GNorm_Bac.reserve(nSampReserve*m_oversamp);
21
+ m_vf64P_For.reserve(nGradSampRsv * 8);
22
+ m_vv3G_For.reserve(nGradSampRsv * 8);
22
23
 
23
- m_vf64P_For.reserve(nSampReserve*m_oversamp);
24
- m_vv3G_For.reserve(nSampReserve*m_oversamp);
24
+ m_vf64P.reserve(nGradSampRsv);
25
+ m_vv3G.reserve(nGradSampRsv);
25
26
 
26
- m_vf64P.reserve(nSampReserve);
27
- m_vv3G.reserve(nSampReserve);
28
-
29
- // for trajectory reparameterization
30
- m_vv3TrajSamp.resize(gMag_nTrajSamp);
27
+ m_intp.init(nGradSampRsv * 8);
28
+ m_intp.m_eSearchMode = Intp::ECached;
29
+ }
31
30
 
32
- m_intp.init(nSampReserve*m_oversamp);
33
- m_intp.m_eSearchMode = Intp::ECached;
31
+ // for trajectory reparameterization
32
+ if (gMrTraj_nTrajSampRsv)
33
+ {
34
+ m_vv3TrajSamp.resize(gMrTraj_nTrajSampRsv);
35
+ }
34
36
  }
35
37
 
36
38
  bool Mag::init
@@ -52,9 +54,9 @@ bool Mag::init
52
54
  {
53
55
  f64 p0 = ptTraj->getP0();
54
56
  f64 p1 = ptTraj->getP1();
55
- for (i64 i = 0; i < gMag_nTrajSamp; ++i)
57
+ for (i64 i = 0; i < gMrTraj_nTrajSampRsv; ++i)
56
58
  {
57
- f64 p = p0 + (p1-p0) * (i)/f64(gMag_nTrajSamp-1);
59
+ f64 p = p0 + (p1-p0) * (i)/f64(gMrTraj_nTrajSampRsv-1);
58
60
  ptTraj->getK(&m_vv3TrajSamp[i], p);
59
61
  }
60
62
  m_sptfTraj = Spline_TrajFunc(m_vv3TrajSamp);
@@ -16,7 +16,7 @@ extern i64 gMag_oversamp;
16
16
  extern bool gMag_enSFS;
17
17
  extern bool gMag_enGradRep;
18
18
  extern bool gMag_enTrajRep;
19
- extern i64 gMag_nTrajSamp;
19
+ extern i64 gMrTraj_nTrajSampRsv;
20
20
 
21
21
  // virtual TrajFunc, take in discrete samples and construct a Segmentied Cubic Polynomial function
22
22
  class Spline_TrajFunc: public TrajFunc
@@ -24,9 +24,9 @@ class Spline_TrajFunc: public TrajFunc
24
24
  public:
25
25
  Spline_TrajFunc():
26
26
  TrajFunc(0,0),
27
- m_intpX(gMag_nTrajSamp),
28
- m_intpY(gMag_nTrajSamp),
29
- m_intpZ(gMag_nTrajSamp)
27
+ m_intpX(gMrTraj_nTrajSampRsv),
28
+ m_intpY(gMrTraj_nTrajSampRsv),
29
+ m_intpZ(gMrTraj_nTrajSampRsv)
30
30
  {}
31
31
 
32
32
  Spline_TrajFunc(const vv3& vv3K):
@@ -97,19 +97,19 @@ protected:
97
97
  class Mag
98
98
  {
99
99
  public:
100
- Mag();
100
+ Mag(i64 nSampReserve=0, i64 nTrajSampRsv=0);
101
101
  bool init
102
102
  (
103
103
  TrajFunc* ptTraj,
104
104
  f64 sLim, f64 gLim,
105
- f64 dt=10e-6, i64 oversamp=10,
105
+ f64 dt=10e-6, i64 oversamp=8,
106
106
  f64 dG0Norm=0e0, f64 dG1Norm=0e0
107
107
  );
108
108
  bool init
109
109
  (
110
110
  const vv3& vv3TrajSamp,
111
111
  f64 sLim, f64 gLim,
112
- f64 dt=10e-6, i64 oversamp=10,
112
+ f64 dt=10e-6, i64 oversamp=8,
113
113
  f64 dG0Norm=0e0, f64 dG1Norm=0e0
114
114
  );
115
115
  ~Mag();
@@ -644,6 +644,24 @@ PyObject* setMaxG1(PyObject* self, PyObject* const* args, Py_ssize_t narg)
644
644
  return Py_None;
645
645
  }
646
646
 
647
+ PyObject* setMagGradSamp(PyObject* self, PyObject* const* args, Py_ssize_t narg)
648
+ {
649
+ extern i64 gMrTraj_nGradSampRsv;
650
+ chkNarg(narg, 1);
651
+ gMrTraj_nGradSampRsv = PyLong_AsLong(args[0]);
652
+ Py_INCREF(Py_None);
653
+ return Py_None;
654
+ }
655
+
656
+ PyObject* setMagTrajSamp(PyObject* self, PyObject* const* args, Py_ssize_t narg)
657
+ {
658
+ extern i64 gMrTraj_nTrajSampRsv;
659
+ chkNarg(narg, 1);
660
+ gMrTraj_nTrajSampRsv = PyLong_AsLong(args[0]);
661
+ Py_INCREF(Py_None);
662
+ return Py_None;
663
+ }
664
+
647
665
  PyObject* setMagOverSamp(PyObject* self, PyObject* const* args, Py_ssize_t narg)
648
666
  {
649
667
  extern i64 gMag_oversamp;
@@ -822,6 +840,8 @@ static PyMethodDef aMeth[] =
822
840
  {"setShuf", (PyCFunction)setShuf, METH_FASTCALL, ""},
823
841
  {"setMaxG0", (PyCFunction)setMaxG0, METH_FASTCALL, ""},
824
842
  {"setMaxG1", (PyCFunction)setMaxG1, METH_FASTCALL, ""},
843
+ {"setMagGradSamp", (PyCFunction)setMagGradSamp, METH_FASTCALL, ""},
844
+ {"setMagTrajSamp", (PyCFunction)setMagTrajSamp, METH_FASTCALL, ""},
825
845
  {"setMagOverSamp", (PyCFunction)setMagOverSamp, METH_FASTCALL, ""},
826
846
  {"setMagSFS", (PyCFunction)setMagSFS, METH_FASTCALL, ""},
827
847
  {"setMagGradRep", (PyCFunction)setMagGradRep, METH_FASTCALL, ""},
@@ -13,6 +13,8 @@
13
13
  bool gMrTraj_enMtg = false; // whether to use Lustig's minTimeGrad solver
14
14
  f64 gMrTraj_g0Norm = 0e0; // initial gradient amplitude
15
15
  f64 gMrTraj_g1Norm = 0e0; // final gradient amplitude
16
+ i64 gMrTraj_nGradSampRsv = 10000; // buffer size of mag solver
17
+ i64 gMrTraj_nTrajSampRsv = 10000; // num. of samp. when doing Traj. Rep.
16
18
 
17
19
  /*
18
20
  * A set of trajectories sufficient to fully-sample the k-space
@@ -51,7 +53,11 @@ public:
51
53
  m_nAcq(m_nAcq),
52
54
  m_nSampMax(m_nSampMax)
53
55
  {
54
- m_mag = Mag();
56
+ m_mag = Mag
57
+ (
58
+ gMrTraj_nGradSampRsv,
59
+ gMrTraj_nTrajSampRsv
60
+ );
55
61
  m_vv3GRampFront.reserve(1000);
56
62
  m_vv3GRampBack.reserve(1000);
57
63
  }
@@ -361,8 +367,6 @@ protected:
361
367
  bool calGrad(v3* pv3M0PE, vv3* pvv3GRO, vf64* pvf64P, TrajFunc& tfTraj, GradPara& objGradPara, i64 oversamp=8)
362
368
  {
363
369
  bool ret = true;
364
- const f64& sLim = objGradPara.sLim;
365
- const f64& dt = objGradPara.dt;
366
370
 
367
371
  // calculate GRO
368
372
  TIC;
@@ -27,8 +27,6 @@ public:
27
27
 
28
28
  virtual bool fit(const vf64& vf64X, const vf64& vf64Y)
29
29
  {
30
- ASSERT((i64)vf64X.size() <= m_sizCache);
31
- ASSERT((i64)vf64Y.size() <= m_sizCache);
32
30
  ASSERT(vf64X.size() == vf64Y.size());
33
31
  const i64 nSamp = vf64X.size();
34
32
  ASSERT(nSamp >= 2);
@@ -37,8 +37,6 @@ public:
37
37
 
38
38
  virtual bool fit(const vf64& vf64X, const vf64& vf64Y)
39
39
  {
40
- ASSERT((i64)vf64X.size() <= m_sizCache);
41
- ASSERT((i64)vf64Y.size() <= m_sizCache);
42
40
  ASSERT(vf64X.size() == vf64Y.size());
43
41
  const i64 nSamp = vf64X.size();
44
42
  ASSERT(nSamp >= 2);
@@ -1,6 +1,5 @@
1
1
  #include "v3.h"
2
2
  #include <array>
3
- #include <cinttypes>
4
3
  #include <cstring> // test
5
4
 
6
5
  v3::v3() :x(0e0), y(0e0), z(0e0) {}
@@ -386,11 +385,15 @@ bool v3::saveF64(FILE* pfHdr, FILE* pfBin, const vv3& vv3Data)
386
385
  bool v3::loadF64(FILE* pfHdr, FILE* pfBin, vv3* pvv3Data)
387
386
  {
388
387
  bool ret = true;
389
- i64 lenData = 0;
390
388
  pvv3Data->clear();
391
- int nRead = fscanf(pfHdr, "float64[%" SCNi64 "][3];\n", &lenData);
392
- if (nRead==EOF) return true; // EOF
393
- else if (nRead!=1) return false;
389
+ i64 lenData = 0;
390
+ {
391
+ long _;
392
+ int nRead = fscanf(pfHdr, "float64[%ld][3];\n", &_);
393
+ lenData = (i64)_;
394
+ if (nRead == EOF) return true; // EOF
395
+ else if (nRead != 1) return false;
396
+ }
394
397
  pvv3Data->resize(lenData);
395
398
 
396
399
  f64* bufFile = (f64*)malloc(lenData*3*sizeof(f64));
@@ -424,11 +427,15 @@ bool v3::saveF32(FILE* pfHdr, FILE* pfBin, const vv3& vv3Data)
424
427
  bool v3::loadF32(FILE* pfHdr, FILE* pfBin, vv3* pvv3Data)
425
428
  {
426
429
  bool ret = true;
427
- i64 lenData = 0;
428
430
  pvv3Data->clear();
429
- int nRead = fscanf(pfHdr, "float32[%" SCNi64 "][3];\n", &lenData);
430
- if (nRead==EOF) return true; // EOF
431
- else if (nRead!=1) return false;
431
+ i64 lenData = 0;
432
+ {
433
+ long _;
434
+ int nRead = fscanf(pfHdr, "float32[%ld][3];\n", &_);
435
+ lenData = (i64)_;
436
+ if (nRead == EOF) return true; // EOF
437
+ else if (nRead != 1) return false;
438
+ }
432
439
  pvv3Data->resize(lenData);
433
440
 
434
441
  f32* bufFile = (f32*)malloc(lenData*3*sizeof(f32));
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "MRArbGrad"
7
- version = "4.1.1"
7
+ version = "4.2.0"
8
8
  dependencies = ["numpy"]
9
9
 
10
10
  description = "Gradient waveform design tool for arbitrary k-space trajectories."
File without changes
File without changes
File without changes
File without changes
File without changes