forked from MRtrix3/mrtrix3
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcknormalise.cpp
129 lines (93 loc) · 2.96 KB
/
tcknormalise.cpp
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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/* Copyright (c) 2008-2017 the MRtrix3 contributors.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, you can obtain one at http://mozilla.org/MPL/2.0/.
*
* MRtrix is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
*
* For more details, see http://www.mrtrix.org/.
*/
#include "command.h"
#include "progressbar.h"
#include "image.h"
#include "interp/linear.h"
#include "thread_queue.h"
#include "dwi/tractography/file.h"
#include "dwi/tractography/properties.h"
using namespace MR;
using namespace MR::DWI;
using namespace App;
void usage ()
{
AUTHOR = "J-Donald Tournier ([email protected])";
SYNOPSIS = "Apply a normalisation map to a tracks file";
ARGUMENTS
+ Argument ("tracks", "the input track file.").type_tracks_in()
+ Argument ("transform", "the image containing the transform.").type_image_in()
+ Argument ("output", "the output track file").type_tracks_out();
}
using value_type = float;
using TrackType = Tractography::Streamline<value_type>;
class Loader { MEMALIGN(Loader)
public:
Loader (const std::string& file) : reader (file, properties) {}
bool operator() (TrackType& item) {
return reader (item);
}
Tractography::Properties properties;
protected:
Tractography::Reader<value_type> reader;
};
class Warper { MEMALIGN(Warper)
public:
Warper (const Image<value_type>& warp) :
interp (warp) { }
bool operator () (const TrackType& in, TrackType& out) {
out.resize (in.size());
for (size_t n = 0; n < in.size(); ++n)
out[n] = pos(in[n]);
return true;
}
Eigen::Matrix<value_type,3,1> pos (const Eigen::Matrix<value_type,3,1>& x) {
Eigen::Matrix<value_type,3,1> p;
if (interp.scanner (x)) {
interp.index(3) = 0; p[0] = interp.value();
interp.index(3) = 1; p[1] = interp.value();
interp.index(3) = 2; p[2] = interp.value();
}
return p;
}
protected:
Interp::Linear< Image<value_type> > interp;
};
class Writer { MEMALIGN(Writer)
public:
Writer (const std::string& file, const Tractography::Properties& properties) :
progress ("normalising tracks"),
writer (file, properties) { }
bool operator() (const TrackType& item) {
writer (item);
++progress;
return true;
}
protected:
ProgressBar progress;
Tractography::Properties properties;
Tractography::Writer<value_type> writer;
};
void run ()
{
Loader loader (argument[0]);
auto data = Image<value_type>::open (argument[1]).with_direct_io (3);
Warper warper (data);
Writer writer (argument[2], loader.properties);
Thread::run_queue (
loader,
Thread::batch (TrackType(), 1024),
Thread::multi (warper),
Thread::batch (TrackType(), 1024),
writer);
}