File: test_epg.c

package info (click to toggle)
bart-cuda 0.8.00-2
  • links: PTS, VCS
  • area: contrib
  • in suites: bookworm, sid
  • size: 7,752 kB
  • sloc: ansic: 100,267; python: 717; makefile: 576; sh: 564; cpp: 104
file content (90 lines) | stat: -rw-r--r-- 1,969 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include <stdio.h>
#include <complex.h>
#include <math.h>
#include <assert.h>
#include "misc/mri.h"
#include "num/flpmath.h"

#include "simu/epg.h"

#include "utest.h"

static bool test_cpmg_epg(void)
{
	int N = 4;
	int M = 2 * N;
	complex float signal[N];
	float B1 = 0.8;
	float rf_exc = 90.0 / B1;
	float rf_ref = 180.0 / B1;
	float T1 = 1.000;
	float T2 = 0.100;
	float TE = 0.010;
	float omega = 0.0;

	cpmg_epg_der(N, M, signal, NULL, NULL, NULL, rf_exc, rf_ref, TE, T1, T2, B1, omega);
	float monoexp = expf(-N * TE / T2);

	UT_ASSERT(1E-5 > (cabsf(signal[N - 1]) - monoexp));
 
	return true;
}

UT_REGISTER_TEST(test_cpmg_epg);


static bool test_CPMG_ideal_der(void)
{
	int N = 4;
	int M = 2 * N;
	complex float signal[N];
	complex float states[3][M][N];
	complex float dsignal[4][N];
	complex float dstates[4][3][M][N];
	float B1 = 0.8;
	float rf_exc = 90.0 / B1;
	float rf_ref = 180.0 / B1;
	float T1 = 1.000;
	float T2 = 0.100;
	float TE = 0.010;
	float omega = 0.0;

	cpmg_epg_der(N, M, signal, states, dsignal, dstates, rf_exc, rf_ref, TE, T1, T2, B1, omega);
	float signal_monoexp = expf(-N * TE / T2);
	float dsignal_dT2_monoexp = signal_monoexp * N * TE / (T2 * T2);

	UT_ASSERT(
		   (1E-5 > cabsf(signal[N-1] - signal_monoexp))
		&& (1E-5 > cabsf(dsignal[0][N-1] - (float)0.0)) // close-to-zero T1 dependency
		&& (1E-5 > cabsf(dsignal[1][N-1] - dsignal_dT2_monoexp))
	);
}

UT_REGISTER_TEST(test_CPMG_ideal_der);


static bool test_hyperecho_epg(void)
{
	int N = 23;
	int M = 2 * N;
	complex float signal[N];
	complex float states[3][M][N];
	float B1 = 0.8;
	float FA = 10.0;
	float rf_exc = 10.0 / B1;
	float rf_ref = 180.0 / B1;
	float T1 = 1000;
	float T2 = 100;
	float TE = 10;
	float omega = 0.0;

	float signal_monoexp = expf(-N * TE / T2);

	hyperecho_epg(N, M, signal, states, rf_exc, rf_ref, TE, FA, T1, T2, B1, omega);

	UT_ASSERT(1E-5 > (cabsf(signal[N - 1]) - signal_monoexp));

    return true;
}

UT_REGISTER_TEST(test_hyperecho_epg);