File: 00odin.h

package info (click to toggle)
odin 2.0.5-8
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 9,196 kB
  • sloc: cpp: 62,638; sh: 4,541; makefile: 779
file content (683 lines) | stat: -rw-r--r-- 29,855 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
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
/**
  * \page odinseq_doc ODIN sequence modelling framework (odinseq library)
  *
  * This page describes the design guidelines of the module \ref odinseq
  *
  * \section odinseq_intro Introduction
  * This is a framework for NMR sequence design. It follows
  * a hardware independent, object oriented design approach to
  * reach a high degree of flexibilty and portability while
  * keeping the amount of source code to a minimum.
  *
  * \section motivation Motivation
  * An NMR sequence typically consists of different components
  * like pulses, gradient shapes and so on. From the physicists
  * point of view these objects and their relations can be exclusively
  * described by physical parameters (pulse duration, gradient stength,
  * echo time, ...). This description does not depend on the current
  * hardware the sequence is used on.
  * Furthermore, at this level of abstraction these objects can
  * be grouped together in different ways to form a variety of NMR
  * sequences.
  *
  * Unfortunately most programming enviroments of contemporary
  * spectrometers/scanners do not reflect this modularity. A sequence
  * written in the native enviroment of the machine often contains
  * a vast amount of redundant source code repeated in every method
  * and a difficult low-level interface.
  * Furthermore each manufacturer follows his own approach to write
  * unportable sequences, which may be a disadvantage for scientists
  * working on different spectrometers.
  *
  * This is the point where this framework could come into play.
  * It offers a hardware independent programming interface to a C++
  * class library. This library then performs all the low-level
  * operations that are required for playing out the sequence.
  *
  * \section design Design Principles
  * The class hierachy (\ref odinseq) is designed according to the following guidelines:
  *
  * \subsection design_hierachy Class Hierachy
  *   Each type of component in an NMR sequence (RF-pulse, gradient pulse, ...)
  *   is identified with a class in the C++ programming language.
  *   The components are ordered in a 'family tree' where each child
  *   is a specialisation of its parent. For instance a constant
  *   gradient (SeqGradConst) on one of the gradient channels has a parent
  *   (SeqGradChan) that represents arbitrarily shaped gradient waveforms.
  *   This inheritance graph is modelled by the inheritence mechanisms for
  *   classes in C++. This approach minimises the amount of code that perform
  *   certain operations on the objects, e.g. a function for
  *   rotating the SeqGradChan class in the spatial domain (set_gradrotmatrix())
  *   is automatically available for all derived classes.
  *
  * \subsection design_seqobj Sequence Objects
  *   In this manual the term 'sequence objects' refers to all components
  *   of an NMR experiment that control the timing of the sequence.
  *   For example RF-pulses, delays and acquisition windows are all specialised
  *   sequence objects.
  *   An (abstract) base class SeqObjBase exists for all sequence objects.
  *   These objects then have a common
  *   interface, e.g. they know how to write themselve to the pulse/gradient
  *   program.
  *
  * \subsection design_seqgradobj Gradient Objects
  *   The term 'gradient objects' refers to all components of an NMR sequence
  *   that control the timecourse of the gradient fields, e.g. constant gradients,
  *   phase encoding gradients, gradient waveforms.
  *   An (abstract) base class SeqGradInterface exists for all gradient objects
  *   in the sequence. These objects
  *   then have a common interface, i.e. they know how to write themselve to the gradient
  *   program or how to be combined among themselves.
  *
  * \subsection design_seqgrouping Grouping of Sequence Objects 
  *   Sequence objects can be grouped together by ordering them along
  *   the time axis. The result is then a new, more complex sequence object.
  *   In analogy to notations commonly used in scientific papers, this
  *   is done by using the \p + operator. For instance two RF-pulses
  *   represented by two objects called \p alpha and \p beta can build
  *   a new sequence object
  *\code{.cpp}
alpha + beta
\endcode
  *   which results in a sequence
  *   object which will play out the first pulse and then the second pulse.
  *
  * \subsection design_gradgrouping Grouping of Gradient Objects 
  *   Gradient objects can also be serialised by using the \p + operator. Furthermore
  *   the \p / operator tries to build a new object that plays out the two operands
  *   in parallel if the timing is apropriate. For example two gradient pulses
  *   \p gp1 and \p gp2, one for the read and another for the phase channel, can be
  *   played out in parallel by using the combination
  *\code{.cpp}
gp1 / gp2
\endcode
  *
  * \subsection design_seqparallel Combining Sequence and Gradient objects
  *   Sequence and gradient objects can also be serialised by the \p + operator. To
  *   play out a gradient and a sequence object in parallel, the \p / operator can be
  *   used. For example let \p alpha be an excitation pulse and \p constgrad a constant
  *   gradient, then the combination
  *\code{.cpp}
alpha / constgrad
\endcode
  *   would give a slice selective pulse.
  *
  * \subsection design_seqcontainer Container for Sequence Objects 
  *   The sequence object SeqObjList can be used as a container for other
  *   sequence objects. That is, each SeqObjList can have its own sub-sequence that
  *   consists of other sequence components.
  *   If a certain operation is applied to a SeqObjList object, the operation
  *   will also be applied to all elements of the sub-sequence. For example:
  *\code{.cpp}
      SeqPuls           alpha;                   // excitation pulse
      SeqGradConstPulse constgrad;               // constant gradient
      SeqObjList   objlist = alpha + constgrad;  // alpha is played out after constgrad
\endcode
  *   Calling the member function
  *\code{.cpp}
objlist.get_duration()
\endcode
would then return the sum of the durations of \p alpha and \p constgrad.
  *
  * \subsection design_seqgradcontainer Container for Gradient Objects
  *   The gradient object SeqGradChanList can be used as a container for other
  *   gradient objects which share the same gradient channel. That is, each SeqGradChanList
  *   can have its own sub-sequence that consists of other gradient components.
  *   These sub-objects are then played out subsequently.
  *   This analogous to the above described sequence container.
  *
  * \subsection design_append Appending to Container Objects 
  *   New objects can be added to the container class SeqObjList
  *   by using the \p += operator.
  *
  * \subsection design_loops Sequence Loops ans Vectors
  *   Loops are special sequence containers. They are used to repeat
  *   a certain part of the sequence. Within ODIN, the class SeqObjLoop
  *   accomplishes this task. Two kind of loops are possible when using
  *   this class: Pure repitition loops and vector loops. Repitition
  *   loops simply repeat the specified part of the sequence without
  *   altering it. Let \p loop be of type SeqObjLoop, then heir syntax is:
  *\code{.cpp}
loop ( kernel ) [ n ];
\endcode
  *   This statement will return a sequence object that repeats the sequence
  *   object \p kernel \p n times, where \p n is an integer number.
  *
  *   Vector loops also repeat a specified part of the sequence. Furthermore
  *   they increment the value of a sequence vector each time it is played out.
  *   Sequence vectors are for example phase encoding gradients or pulses
  *   with a frequency list. All sequence vectors share the same base class
  *   SeqVector. Let \p loop be of type SeqObjLoop, then the syntax for vector loops is: 
  *\code{.cpp}
loop ( kernel ) [ vector1 ] [ vector2 ] ...;
\endcode
  *   This statement will return a sequence object that repeats the sequence
  *   object \p kernel while incrementing the values of the attached sequence
  *   vectors  \p vector1, \p vector2, ...
  *   The vectors must contain the same number of values. The loop is then
  *   repeated this number of times.
  *
  * \subsection design_vectors Specialialized Sequence Vectors
  *   - Gradient pulses with different gradient strengths for phase encoding or diffusion weighting (SeqGradVectorPulse, SeqGradPhaseEnc).
  *   - Sequence objects that drive the transmitter (RF pulses) or receiver (acquisition windows)
  *   contain two vector objects for frequency and phase switching to be used for multislice
  *   experiments or phase cycling (SeqFreqChan and SeqPhaseListVector).
  *   - Delay objects with a variable duration, which is changed for each iteration (SeqDelayVector).
  *   - A list of user-defined rotation matrices that can be attached to gradient-related objects in order
  *   to alter their direction subsequently (SeqRotMatrixVector).
  *   - A container object that holds a list of other sequence objects which are played out
  *   sequentially for each repetition (SeqObjVector).
  *
  *
  * \section units Physical Units
  * ODIN is consistent corncerning the physical units. That is, everywhere in the library the
  * following units and their combinations are used:
  * - [mT] for magnetic field strength
  * - [mm] as the spatial unit
  * - [ms] for durations
  *
  * This system has shown to be of practical value for NMR because the numbers are then
  * in a reasonable range.
  * For example the gradient strength is then given in mT/mm and the frequency is given in
  * 1/ms=kHz.
  * The only exception is the angular unit which is treated internally as rad but can be
  * specified at the interface functions in degree for phaselists and flipangles.
  *
  *
  *
  * \section coding Coding Standards
  * \subsection coding_class Building new classes
  * If you want to write your own class that can be plugged into the ODIN framework,
  * please use the following form for your class 'SeqMyClass' that is derived from
  * 'SeqBaseClass':
  *\code{.cpp}

/////////////// *.h stuff: //////////////////////////////

class SeqMyClass : public SeqBaseClass {

 public:
  SeqMyClass(const STD_string& object_label, float parameter1, ... );

  SeqMyClass(const STD_string& object_label = "unnamedSeqMyClass" );

  SeqMyClass(const SeqMyClass& sct);

  SeqMyClass& operator = (const SeqMyClass& sct);

  ~SeqMyClass();

 private:
  float parameter1;

};

/////////////// *.cpp stuff: ////////////////////////////


SeqMyClass::SeqMyClass(const STD_string& object_label, float parameter1_value, ...  ) : SeqBaseClass(object_label) {

  parameter1=parameter1_value;
  ...

}

SeqMyClass::SeqMyClass(const STD_string& object_label ) : SeqBaseClass(object_label) {

  parameter1=0.0;
  ...

}


SeqMyClass::SeqMyClass(const SeqMyClass& sct) {
  SeqMyClass::operator = (sct);
}

SeqMyClass& SeqMyClass::operator = (const SeqMyClass& sct) {
  SeqBaseClass::operator = (sct);

  parameter1=sct.parameter1;
  ...

  return *this;
}

SeqMyClass::~SeqMyClass() {
}
\endcode
  * Following this standard prevents the base classes from getting confused by not
  * correctly initialising or copying them.
  *
  * \subsection coding_stl Using the C++ standard library
  * Unfortunately, on some systems the stanard C++ library seems to be either broken
  * or absent. For these platforms, ODIN contains its own implementation that is a subset of
  * the original library.
  * To use the same source code on different platforms, classes of the standard
  * library are used together with the prefix STD_, e.g. STD_list
  * instead of std::list. These macros will be replaced by the appropriate classes on
  * each platform.
  *
  * \subsection coding_debug Debugging/Tracing
  * To generate debugging and tracing output, please use the Log template class instead
  * of using streams.
  * Instances of that class offer a stream to log trace messages via the ODINLOG macro:
  *\code{.cpp}
int MyClass::myfunction() {
  Log<Seq> odinlog("MyClass","myfunction");

  ODINLOG(odinlog,significantDebug) << "Hello World" << STD_endl;
}
\endcode
  * Which will result in the following output:
  *\code{.cpp}
Seq    |          MyClass.myfunction : START
Seq    |          MyClass.myfunction : Hello World
Seq    |          MyClass.myfunction : END
\endcode
  * It can generate debugging output at different levels of verbosity
  * and the output is redirected to the native logging channel (console, log file) of
  * the current platform. Furthermore, it can be completely removed from the executable
  * for release compilations in a safe way without changing the source code.
  */



/**
  * @defgroup odinseq Classes for sequence design (odinseq library)
  *
  * \ref odinseq_doc
  *
  */

/**
  *
  * @defgroup odinseq_internals Internal Classes for sequence design (odinseq library)
  *
  * PLEASE DO NOT USE THESE CLASSES DIRECTLY WHEN WRITING SEQUENCES!
  */

///////////////////////////////////////////////////////////////////////////////////////

/**
  * \page tjutils_doc Basic data types, vectors and arrays used by ODIN (tjutils library)
  *
  *
  * \section tjutils_intro Introduction
  * Well known data types, such as integers, floating point numbers, complex numbers, strings,
  * vectors (1-dimensional) and arrays (multi-dimensional) are used in ODIN.
  * For all these basic types discussed in this section,
  * there exists a corresponding labeled data record (LDR) type (\ref ldr).
  * This LDR type is prefixed by 'LDR' followed the data type, e.g. 'float' has a LDR
  * counterpart 'LDRfloat' with the same basic functionality.
  * In addition, LDR parameters can be assigned a label, grouped together with other LDR parameters,
  * written to and read from file etc.
  *
  * \section vectors Vectors
  * Vectors are implemented by the tjvector template class which is
  * derived from the STL vector class. Its interface is therefore
  * equivalent to that of the std::vector class.
  * In addition, some useful functions are added.
  * Some predefined vector classes are created by using the tjvector
  * template class:
  * - fvector: vector of float numbers
  * - dvector: vector of double precision float numbers
  * - ivector: vector of int numbers
  * - svector: vector of strings (STD_string objects)
  * - cvector: vector of complex numbers (STD_complex objects)
  *
  * \section arrays Arrays
  * Multidimensional arrays are covered by the tjarray template class.
  * It is derived from the tjvector class to store the data. In addition,
  * the information about the dimensionality and extent in each dimension
  * is stored separately in the class by an ndim object.
  * Some predefined array classes and their corresponding LDR type are
  * created by using the tjarray template class:
  * - farray / LDRfloatArr:   array of float numbers
  * - darray / LDRdoubleArr:  array of double precision float numbers
  * - iarray / LDRintArr:     array of int numbers
  * - sarray / LDRstringArr:  array of strings (STD_string objects)
  * - carray / LDRcomplexArr: array of complex numbers (STD_complex objects)
  *
  * Some examples on how to use these arrays:
  *\code{.cpp}
farray   fa1(3,3);    // creates a 2-dimensional 3x3 array

fa1(0,1)=5.7;         // assigns 5.7 to the second element in the firs row

farray   fa2(3,3);    // creates another 2-dimensional 3x3 array

fa1+fa2;              // returns the element-wise sum of the two arrays

fa1.redim(1,2,3);     // resizes fa1 to a 3-dimensional 1x2x3 array

\endcode
  * Please see the class documention for a complete reference.
  *
  */

/**
  * @defgroup tjutils Classes for basic data types and vectors/arrays (tjutils library)
  *
  * \ref tjutils_doc
  *
  */

///////////////////////////////////////////////////////////////////////////////////////

/**
  * @defgroup ldr Labeled Data Record (LDR) implementation (odinpara library)
  *
  * This page describes the design guidelines of the module \ref ldr
  *
  * The following framework can be used to deal with single parameters of different
  * type (int,float,string,...) and multidimensional arrays that are build from these
  * base types. It is possible to build blocks of parameter, i.e. parameter lists,
  * that can be written/loaded to/from disk in an easily editable ASCII format.
  * The file format is designed roughly according to the JCAMP-DX [1,2] standard, but
  * its main aim was to be compatible with the PARX[3] file format.
  *
  *
  * A very simple examples on how to use this module:
  *\code{.cpp}

LDRint mynumber(23,"mynumber");  // Create an integer parameter with initial value 23

mynumber+=42;                    // LDRint can be used just as a native int for arithmetics

LDRblock block;              // A block (list) of parameters

block.append(mynumber);          // Append the parameter to the block

block.write("block.jdx");        // Write block and its parameters to file 'block.jdx'

block.load("block.jdx");         // Load block and its parameters from file 'block.jdx'

\endcode
  * Please see the class documention for a complete reference.
  *
  *
  *  References:
  * -# JCAMP-DX: A Standard Form of Exchange of Infrared Spectra in Computer
  *     Readable Form, McDONALD, R.S., WILKS, P.A., Apllied Spectroscopy,
  *     Vol.42, No.1, 1988
  * -# JCAMP-DX for NMR, DAVIES, A.N., LAMPEN, P., Apllied Spectroscopy,
  *     Vol.47, No.8, 1993
  * -# PARX is a preprocessor/compiler framework to interactively modify parameters
  *     that can also be embedded into C-code.
  *     It is part of the Bruker software 'Paravision' that serves as an user interface
  *     for their medical MR-scanners.
  *
  *
  *@author Thies H. Jochimsen
  */

///////////////////////////////////////////////////////////////////////////////////////

/**
  * @defgroup odinpara  MR Parameters  (odinpara library)
  *
  * This page describes the design guidelines of the module \ref odinpara_doc
  *
  *
  *@author Thies H. Jochimsen
  */

/**
  * \page odinpara_doc Protocol classes in ODIN (odinpara library)
  *
  * This module/library contains a set of classes which describe
  * different aspects of an MR measurement, i.e. the measurement protocol:
  * - System: The MR system used
  * - Geometry: The geometry of the scan
  * - SeqPars: Common sequence parameters
  * - Study:   Information about the current study (patient data, etc.)
  * - RecoPars: Parameters for automatic reconstruction
  *
  * The class Protocol combines the first four of the above in a single
  * class for convenient access.
  *
  * Within sequence classes, instances of these classes are
  * accessible via the pointers systemInfo, geometryInfo,
  * commonPars, studyInfo and recoInfo
  */


///////////////////////////////////////////////////////////////////////////////////////


/**
  * \page odindata_doc ODIN data processing framework (odindata library)
  *
  * This page describes the design guidelines of the module  \ref odindata
  *
  * \section blitz4nmr Blitz++ for NMR
  * The Blitz++ library is great for numerical calculations, but it lacks
  * some functionality that is crucial when using it together with NMR data:
  * - Convenient input/output of medical image data
  * - Numerical routines essential for NMR (FFT, gridding, fitting, ...)
  * - Associating large data files on disk with arrays in memory
  *
  * For this reason, ODIN contains two classes that help dealing with these tasks:
  * - Data: A template class derived from the Blitz++ Array class that
  * has the ability to be associated with a raw data file for read and
  * write access. This is done by using the mmap function so that no extra
  * memory is allocated on contstruction. Instead, the task of reading/writing
  * is handled transparently by the operating system. Any changes made
  * to the array in memory are also visible in the file on disk. With this
  * mechanism, arrays that are larger than the available RAM can be handled
  * without extra effort.
  * In addition, member functions Data::autoread() and Data::autowrite() are available to load/store
  * the data in different file formats using the FileIO module (\ref fileio_doc ).
  *
  * - ComplexData: A template class with a
  * fixed storage type of complex numbers. It contains useful functions
  * to deal with NMR data (FFT,...). On construction, it can be
  * associated with raw data on disk (16bit, 32bit, float) and blocks
  * of the file can be loaded subsequently into memory for further
  * processing.
  *
  *
  * \section numerics Common Numerical Operations
  *
  * In order to offer a framework for other numerical calculations,
  * the following functions/classes are available within ODIN:
  *
  * \subsection numerics_gridding Gridding
  * Regridding an array from one Cartesian grid to another can be
  * done using the Data::congrid() member function.
  * In addition, the functor Gridding can be used to data from a
  * non-Cartesian grid to a Cartesian grid.
  *
  * \subsection numerics_transform Coordinate Transformation
  * Transforming an array to a new coordinate system by
  * rotation, scaling and shifting can be done by using
  * the CoordTransformation functor.
  *
  * \subsection numerics_fft Fourier Transform
  * FFT of a whole complex data set can be calculated by the ComplexData::fft() member function.
  * If the FFT has to be applied only for certain dimensions, use ComplexData::partial_fft()
  *
  * \subsection numerics_linalg Linear Algebra
  * The functions solve_linear(), pseudo_inverse() and eigenvalues() will solve a sets of linear equations,
  * calculate the pseudo inverse and eigenvalues, respectively.
  *
  * \subsection numerics_fitting Non-Linear Function Fitting
  * Fitting of functions is accomplished by the two classes
  * ModelFunction and FunctionFit. The former is
  * used as a base class to specify the modelling function
  * by implementing its virtual functions.
  * The latter is used to do the actual fitting and to
  * store temporary data of the fit.
  *
  * \subsection numerics_linfit Linear Regression
  * The class LinearFunction can be used for linear fitting.
  *
  * \subsection numerics_polfit Polynomial Fit
  * The function polyniomial_fit() provides pixel-wise fitting
  * of polynomials using the values of neighbouring pixels.
  *
  * \subsection numerics_integration Integration of Functions
  * Integration of one-dimensional functions can be achieved
  * by the two classes Integrand and FunctionIntegral.
  * The former is used as a base class to specify the function
  * by implementing a virtual functions.
  * The latter is used to do the actual integration and to
  * store temporary data.
  *
  * \subsection numerics_statistics Basic Statistics
  * Simple statistics (mean, standard deviation) can be
  * calculated by the statistics() function.
  *
  * \subsection numerics_correlation Correlation Analysis
  * Correlation of two vectors can be calculated by
  * the correlation() function.
  *
  * \subsection numerics_fileio Convenient File Input/Output
  * The functions inside FileIO (\ref fileio_doc ) are a convenient way ro
  * read/write 4-dim Arrays, a variety of formats common
  * for medical image are supported.
  *
  *
  *
  */

///////////////////////////////////////////////////////////////////////////////////////


/**
  * \page fileio_doc Input/Output of medical image data (odindata library)
  *
  * \section fileio A unified approach for handling medical image data
  * This page describes the functionality of the FileIO module.
  *
  * \subsection fileio_intro Introduction
  * When working with different systems for generating and processing of medical images very quickly one problem arises: These systems use different data formats and the available export features of any toolkit mostly support only a subset of the needed formats. The following report describes an approach to design a unified and extensible interface to medical image data. Implemented in an function library this interface can be used to efficently enable custom-built applications to read and write medical image data.
  *
  * \subsection fileio_pdmap The Protocol-Data-Map
  * Unified access to different data formats implies a common interface for accessing this data.
  * Thus a data structure, which provides a superset of all features of all data formats which shall be supported.
  * Every medical image consists of image data of any type and metadata related to this image data. This data pair will be dicussed in the following.
  *
  * The metadata
  * which belong to an image usually describe the technical and administrative characteristics of an image.
  * They consist of some required information like image dimension and used data type, some common information like the age of the subject or the date the image was taken and some optional information like used field strength for MR data. These parameters are either in a header inside the imagefile or in a separate header file. The required and the common parameter are very usefull to distinguish images. They, and with them the whole metadataset, can be used as a unique key to reference this image. In the following this paremeter set will be called the Protocol.
  *
  * Some imagefile formats are only capable of storing at least two-dimensional images. In this case N-dimensional datasets are often stored by using several two-dimensional images. The protocols of these images differ only in the remaining coordinates (which needs to be specified in this case). 
  * The system must recognize this and combine them into one N-dimensional dataset when reading. And the inverse approach appiles to writing N-dimensional data in a fileformat which does not support that many dimensions.
  * 
  * The pair of protocol and dataset can be used as a universal interface to access image data.
  * While the protocol offers all information to interpret the data, the dataset serves as a coordinate-based interface to the data for reading and writing.
  * 
  * Multiple protocol-dataset-pairs can efficiently be stored in a associative container where the protocol is the key which maps to the dataset. This enables the system to handle multiple datasets. A particular dataset can always be referenced by its protocol and a list of the available datasets can be obtained by iterating through this protocol-dataset-map (FileIO::ProtocolDataMap).
  * Also, when reading multiple low-dimensional image files which are part of an high-dimensional image, they all will have the same protocol and thus will be automaticly sorted into one high-dimensional dataset referenced by this protocol.
  * 
  * \subsection fileio_formats read and write different file formats
  * To guarantee the flexibility of the system, the input from and the output to files is done via plugins (classes derived from FileFormat) which use the described protocol-dataset-map as front end.
  * These plugins are gathered at the initialisation and held in a map with the file suffixes they support as key. If available, they are also referenced by a regular expression to detect the supported format directly from that data.
  * 
  * The selection of the right plugin is done in two ways. If a fileformat is directly requested, the corresponding plugin is used. If the format is not selected explicitly, the system at first tries to get the suffix of the file requested for read or write and guesses the format.
  * 
  * Many medical image formats exist in several different dialects or have optional extensions which makes it necessary to fine tune them. Thus every plugin can bring a set of additional parameters which than can be used by the client to modify their behavior.
  *
  *@author Enrico Reimer
  */


/**
  * @defgroup odindata Classes of the ODIN data processing framework (odindata library)
  *
  * \ref odindata_doc
  * \ref fileio_doc
  *
  */

///////////////////////////////////////////////////////////////////////////////////////

/**
  * @defgroup odinreco The reconstruction framework (odinreco)
  *
  * \ref odinreco_doc
  *
  */

///////////////////////////////////////////////////////////////////////////////////////

/**
  * @defgroup odinreco_steps Steps(functors) of the reconstruction framework (odinreco)
  *
  * These steps(functors) can be used within the \ref odinreco_doc
  *
  */

///////////////////////////////////////////////////////////////////////////////////////

/**
  * \page cmdline_utils Command-line utilities
  *
  * miconv: \ref miconv
  *
  * micalc: \ref micalc
  *
  * miview: \ref miview
  *
  * odinreco: \ref odinreco_usage
  *
  * gencoil: \ref gencoil
  *
  * genmakefile: \ref genmakefile
  *
  * gensample: \ref gensample
  *
  * swab: \ref swab
  *
  * For command-line-based simulation of Odin sequences (e.g. for sequence 'mysequence'):
  * - Create a Makefile using 'genmakefile' on the command line:
  *   \verbatim
       genmakefile mysequence > Makefile
      \endverbatim
  * - Copy mysequence.cpp to the same directory, then use 'make' to build the executable 'mysequence'
  * - Calling the executable without arguments shows the options. For instance, the simulation can be started with:
  *   \verbatim
       mysequence simulate -magsi -s <The virtual sample file> -p <The file with the measurement protocol> -scandir <output-dir>
      \endverbatim
  */

///////////////////////////////////////////////////////////////////////////////////////



/*! \mainpage ODIN Reference Manual
 *
 *
 * \section quick_start Quick Start
 *
 * I want to see documentation about ...
 *
 * \ref odin_doc
 *
 * \ref cmdline_utils
 *
 * \ref odinseq_doc
 *
 * \ref odinseq
 *
 * \ref odindata_doc
 *
 * \ref fileio_doc
 *
 * \ref odinreco_doc
 *
 * \ref odinreco_steps
 *
 * \ref tjutils_doc
 *
 * \ref odinpara_doc
 *
 *
 *@author Thies H. Jochimsen
 */