Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
F
fdt
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
FSL
fdt
Commits
5e6cded9
Commit
5e6cded9
authored
13 years ago
by
Stamatios Sotiropoulos
Browse files
Options
Downloads
Patches
Plain Diff
Computes model predicted signal from bedpostx estimates
parent
c564791e
No related branches found
No related tags found
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
xfibres_pred.cc
+159
-0
159 additions, 0 deletions
xfibres_pred.cc
with
159 additions
and
0 deletions
xfibres_pred.cc
0 → 100755
+
159
−
0
View file @
5e6cded9
/* Copyright (C) 2010 University of Oxford */
/* Stam Sotiropoulos */
/* CCOPYRIGHT */
#include
<iostream>
#include
<fstream>
#include
<iomanip>
#include
<string>
#include
<cmath>
#include
"newimage/newimageall.h"
using
namespace
std
;
using
namespace
NEWIMAGE
;
using
namespace
NEWMAT
;
//Computes the model 1 predicted signal from the mode of the bedpostx samples
//An f0 compartment could also be included in the model
int
main
(
int
argc
,
char
*
argv
[]){
if
(
argc
<
6
||
argc
>
7
){
cerr
<<
" "
<<
endl
;
cerr
<<
"usage: xfibres_pred data_dir samples_dir fibres_num f0(0 or 1) [brain_mask] ouput"
<<
endl
;
cerr
<<
" "
<<
endl
;
exit
(
1
);
}
Matrix
bvecs
,
bvals
;
//Read Input
volume
<
float
>
mask
;
int
num_fibres
;
volume
<
float
>
d
,
S0
,
f0
,
temp
;
volume4D
<
float
>
temp4D
;
vector
<
volume
<
float
>
>
f
;
vector
<
volume4D
<
float
>
>
dyads
;
string
dir_name
=
argv
[
1
],
temp_name
;
temp_name
=
dir_name
+
"/bvals"
;
bvals
=
read_ascii_matrix
(
temp_name
);
temp_name
=
dir_name
+
"/bvecs"
;
bvecs
=
read_ascii_matrix
(
temp_name
);
temp_name
=
argv
[
3
];
num_fibres
=
atoi
(
temp_name
.
c_str
());
if
(
bvecs
.
Nrows
()
>
3
)
bvecs
=
bvecs
.
t
();
//Make sure the bvecs entries are normalized unit vectors
if
(
bvals
.
Nrows
()
>
1
)
bvals
=
bvals
.
t
();
for
(
int
i
=
1
;
i
<=
bvecs
.
Ncols
();
i
++
){
float
tmpsum
=
sqrt
(
bvecs
(
1
,
i
)
*
bvecs
(
1
,
i
)
+
bvecs
(
2
,
i
)
*
bvecs
(
2
,
i
)
+
bvecs
(
3
,
i
)
*
bvecs
(
3
,
i
));
if
(
tmpsum
!=
0
){
bvecs
(
1
,
i
)
=
bvecs
(
1
,
i
)
/
tmpsum
;
bvecs
(
2
,
i
)
=
bvecs
(
2
,
i
)
/
tmpsum
;
bvecs
(
3
,
i
)
=
bvecs
(
3
,
i
)
/
tmpsum
;
}
}
dir_name
=
argv
[
2
];
temp_name
=
dir_name
+
"/mean_dsamples"
;
//Read bedpostx results
if
(
!
fsl_imageexists
(
temp_name
)){
cout
<<
"No mean_dsamples file exists!"
<<
endl
;
exit
(
1
);
}
else
read_volume
(
d
,
temp_name
);
temp_name
=
dir_name
+
"/mean_S0samples"
;
//In case no S0samples is saved, use the mean b=0 from the data
if
(
!
fsl_imageexists
(
temp_name
)){
string
dir_name2
=
argv
[
1
];
temp_name
=
dir_name2
+
"/data"
;
if
(
!
fsl_imageexists
(
temp_name
)){
cerr
<<
"No mean_S0samples file exists or data file exists!"
<<
endl
;
exit
(
1
);
}
else
{
cout
<<
"No mean_SOsamples found, getting the average of b=0's from data..."
<<
endl
;
volume4D
<
float
>
data
;
read_volume4D
(
data
,
temp_name
);
S0
.
reinitialize
(
data
.
xsize
(),
data
.
ysize
(),
data
.
zsize
());
S0
=
0
;
int
b0count
=
0
;
for
(
int
l
=
1
;
l
<=
bvals
.
Ncols
();
l
++
)
if
(
bvals
(
1
,
l
)
==
0
){
S0
+=
data
[
l
-
1
];
b0count
++
;
}
S0
/=
b0count
;
}
}
else
read_volume
(
S0
,
temp_name
);
for
(
int
n
=
0
;
n
<
num_fibres
;
n
++
){
//Read dyads
temp_name
=
dir_name
+
"/dyads"
+
num2str
(
n
+
1
);
if
(
!
fsl_imageexists
(
temp_name
)){
cerr
<<
"No dyads"
<<
n
+
1
<<
" file exists!"
<<
endl
;
exit
(
1
);
}
else
{
read_volume4D
(
temp4D
,
temp_name
);
dyads
.
push_back
(
temp4D
);
}
temp_name
=
dir_name
+
"/mean_f"
+
num2str
(
n
+
1
)
+
"samples"
;
if
(
!
fsl_imageexists
(
temp_name
)){
cerr
<<
"No mean_f"
<<
n
+
1
<<
"samples file exists!"
<<
endl
;
exit
(
1
);
}
else
{
read_volume
(
temp
,
temp_name
);
f
.
push_back
(
temp
);
}
}
string
argv4
=
argv
[
4
];
if
(
argv4
==
"1"
){
//Read f0
temp_name
=
dir_name
+
"/mean_f0samples"
;
if
(
!
fsl_imageexists
(
temp_name
)){
cout
<<
"No mean_f0samples file exists!"
<<
endl
;
exit
(
1
);
}
else
read_volume
(
f0
,
temp_name
);
}
if
(
argc
==
7
)
//Read Brain Mask
read_volume
(
mask
,
argv
[
5
]);
else
{
mask
.
reinitialize
(
d
.
xsize
(),
d
.
ysize
(),
d
.
zsize
());
mask
=
1
;
}
volume4D
<
float
>
output
;
copybasicproperties
(
d
,
output
);
output
.
reinitialize
(
d
.
xsize
(),
d
.
ysize
(),
d
.
zsize
(),
bvals
.
Ncols
());
output
=
0
;
for
(
int
z
=
d
.
minz
();
z
<=
d
.
maxz
();
z
++
){
//Compute predicted signal for each voxel
for
(
int
y
=
d
.
miny
();
y
<=
d
.
maxy
();
y
++
){
for
(
int
x
=
d
.
minx
();
x
<=
d
.
maxx
();
x
++
){
if
(
mask
(
x
,
y
,
z
)
!=
0
){
for
(
int
l
=
0
;
l
<
bvals
.
Ncols
();
l
++
){
float
sumf
=
0
;
for
(
int
n
=
0
;
n
<
num_fibres
;
n
++
){
sumf
+=
f
[
n
](
x
,
y
,
z
);
float
angp
=
dyads
[
n
](
x
,
y
,
z
,
0
)
*
bvecs
(
1
,
l
+
1
)
+
dyads
[
n
](
x
,
y
,
z
,
1
)
*
bvecs
(
2
,
l
+
1
)
+
dyads
[
n
](
x
,
y
,
z
,
2
)
*
bvecs
(
3
,
l
+
1
);
output
(
x
,
y
,
z
,
l
)
+=
f
[
n
](
x
,
y
,
z
)
*
exp
(
-
bvals
(
1
,
l
+
1
)
*
d
(
x
,
y
,
z
)
*
angp
*
angp
);
}
if
(
argv4
==
"1"
)
output
(
x
,
y
,
z
,
l
)
+=
(
f0
(
x
,
y
,
z
)
+
(
1
-
sumf
-
f0
(
x
,
y
,
z
))
*
exp
(
-
bvals
(
1
,
l
+
1
)
*
d
(
x
,
y
,
z
)));
else
output
(
x
,
y
,
z
,
l
)
+=
(
1
-
sumf
)
*
exp
(
-
bvals
(
1
,
l
+
1
)
*
d
(
x
,
y
,
z
));
output
(
x
,
y
,
z
,
l
)
*=
S0
(
x
,
y
,
z
);
}
}
}
}
cout
<<
z
+
1
<<
" slices processed"
<<
endl
;
}
save_volume4D
(
output
,
argv
[
argc
-
1
]);
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment