00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00018
00023
00024
00025
00026 #ifndef __vtkDiffusionTensorMathematics_h
00027 #define __vtkDiffusionTensorMathematics_h
00028
00029 #include "vtkTeemConfigure.h"
00030 #include "vtkThreadedImageAlgorithm.h"
00031
00032 class vtkMatrix4x4;
00033 class vtkImageData;
00034 class VTK_Teem_EXPORT vtkDiffusionTensorMathematics : public vtkThreadedImageAlgorithm
00035 {
00036 public:
00037 static vtkDiffusionTensorMathematics *New();
00038 vtkTypeMacro(vtkDiffusionTensorMathematics,vtkThreadedImageAlgorithm);
00039 void PrintSelf(ostream& os, vtkIndent indent);
00040
00043 vtkGetMacro(Operation,int);
00044 vtkSetClampMacro(Operation,int, VTK_TENS_TRACE, VTK_TENS_PERPENDICULAR_DIFFUSIVITY);
00045
00046
00048
00049 enum
00050 {
00051 VTK_TENS_TRACE,
00052 VTK_TENS_DETERMINANT,
00053 VTK_TENS_RELATIVE_ANISOTROPY,
00054 VTK_TENS_FRACTIONAL_ANISOTROPY,
00055 VTK_TENS_MAX_EIGENVALUE,
00056 VTK_TENS_MID_EIGENVALUE,
00057 VTK_TENS_MIN_EIGENVALUE,
00058 VTK_TENS_LINEAR_MEASURE,
00059 VTK_TENS_PLANAR_MEASURE,
00060 VTK_TENS_SPHERICAL_MEASURE,
00061 VTK_TENS_COLOR_ORIENTATION,
00062 VTK_TENS_D11,
00063 VTK_TENS_D22,
00064 VTK_TENS_D33,
00065 VTK_TENS_MODE,
00066 VTK_TENS_COLOR_MODE,
00067 VTK_TENS_MAX_EIGENVALUE_PROJX,
00068 VTK_TENS_MAX_EIGENVALUE_PROJY,
00069 VTK_TENS_MAX_EIGENVALUE_PROJZ,
00070 VTK_TENS_RAI_MAX_EIGENVEC_PROJX,
00071 VTK_TENS_RAI_MAX_EIGENVEC_PROJY,
00072 VTK_TENS_RAI_MAX_EIGENVEC_PROJZ,
00073 VTK_TENS_PARALLEL_DIFFUSIVITY,
00074 VTK_TENS_PERPENDICULAR_DIFFUSIVITY,
00075 };
00076
00077
00078
00081 void SetOperationToTrace()
00082 {this->SetOperation(VTK_TENS_TRACE);};
00083
00086 void SetOperationToDeterminant()
00087 {this->SetOperation(VTK_TENS_DETERMINANT);};
00088
00091 void SetOperationToRelativeAnisotropy()
00092 {this->SetOperation(VTK_TENS_RELATIVE_ANISOTROPY);};
00093 void SetOperationToFractionalAnisotropy()
00094 {this->SetOperation(VTK_TENS_FRACTIONAL_ANISOTROPY);};
00095 void SetOperationToLinearMeasure()
00096 {this->SetOperation(VTK_TENS_LINEAR_MEASURE);};
00097 void SetOperationToPlanarMeasure()
00098 {this->SetOperation(VTK_TENS_PLANAR_MEASURE);};
00099 void SetOperationToSphericalMeasure()
00100 {this->SetOperation(VTK_TENS_SPHERICAL_MEASURE);};
00103 void SetOperationToMode()
00104 {this->SetOperation(VTK_TENS_MODE);};
00105 void SetOperationToParallelDiffusivity()
00106 {this->SetOperation(VTK_TENS_PARALLEL_DIFFUSIVITY);};
00107 void SetOperationToPerpendicularDiffusivity()
00108 {this->SetOperation(VTK_TENS_PERPENDICULAR_DIFFUSIVITY);};
00109
00112 void SetOperationToMaxEigenvalue()
00113 {this->SetOperation(VTK_TENS_MAX_EIGENVALUE);};
00114 void SetOperationToMiddleEigenvalue()
00115 {this->SetOperation(VTK_TENS_MID_EIGENVALUE);};
00116 void SetOperationToMinEigenvalue()
00117 {this->SetOperation(VTK_TENS_MIN_EIGENVALUE);};
00118
00121 void SetOperationToMaxEigenvalueProjectionX()
00122 {this->SetOperation(VTK_TENS_MAX_EIGENVALUE_PROJX);};
00123 void SetOperationToMaxEigenvalueProjectionY()
00124 {this->SetOperation(VTK_TENS_MAX_EIGENVALUE_PROJY);};
00125 void SetOperationToMaxEigenvalueProjectionZ()
00126 {this->SetOperation(VTK_TENS_MAX_EIGENVALUE_PROJZ);};
00127
00130 void SetOperationToRAIMaxEigenvecX()
00131 {this->SetOperation(VTK_TENS_RAI_MAX_EIGENVEC_PROJX);}
00132 void SetOperationToRAIMaxEigenvecY()
00133 {this->SetOperation(VTK_TENS_RAI_MAX_EIGENVEC_PROJY);}
00134 void SetOperationToRAIMaxEigenvecZ()
00135 {this->SetOperation(VTK_TENS_RAI_MAX_EIGENVEC_PROJZ);}
00136
00139 void SetOperationToD11()
00140 {this->SetOperation(VTK_TENS_D11);};
00141 void SetOperationToD22()
00142 {this->SetOperation(VTK_TENS_D22);};
00143 void SetOperationToD33()
00144 {this->SetOperation(VTK_TENS_D33);};
00145
00150 void SetOperationToColorByOrientation()
00151 {this->SetOperation(VTK_TENS_COLOR_ORIENTATION);};
00152
00158 void SetOperationToColorByMode()
00159 {this->SetOperation(VTK_TENS_COLOR_MODE);};
00160
00164 vtkSetMacro(ScaleFactor,double);
00165 vtkGetMacro(ScaleFactor,double);
00166
00169 vtkSetMacro(ExtractEigenvalues,int);
00170 vtkBooleanMacro(ExtractEigenvalues,int);
00171 vtkGetMacro(ExtractEigenvalues,int);
00172
00177
00180
00191
00192 virtual void SetTensorRotationMatrix(vtkMatrix4x4*);
00193 vtkGetObjectMacro(TensorRotationMatrix, vtkMatrix4x4);
00194
00198 vtkBooleanMacro(MaskWithScalars, int);
00199 vtkSetMacro(MaskWithScalars, int);
00200 vtkGetMacro(MaskWithScalars, int);
00201
00202 vtkBooleanMacro(FixNegativeEigenvalues, int);
00203 vtkSetMacro(FixNegativeEigenvalues, int);
00204 vtkGetMacro(FixNegativeEigenvalues, int);
00205
00208 virtual void SetScalarMask(vtkImageData*);
00209 vtkGetObjectMacro(ScalarMask, vtkImageData);
00210
00213 vtkSetMacro(MaskLabelValue, int);
00214 vtkGetMacro(MaskLabelValue, int);
00215
00217 static void ModeToRGB(double Mode, double FA,
00218 double &R, double &G, double &B);
00219
00220
00223 static int FixNegativeEigenvaluesMethod(double w[3]);
00224 static double Determinant(double D[3][3]);
00225 static double Trace(double D[3][3]);
00226 static double Trace(double w[3]);
00227 static double RelativeAnisotropy(double w[3]);
00228 static double FractionalAnisotropy(double w[3]);
00229 static double LinearMeasure(double w[3]);
00230 static double PlanarMeasure(double w[3]);
00231 static double SphericalMeasure(double w[3]);
00232 static double MaxEigenvalue(double w[3]);
00233 static double MiddleEigenvalue(double w[3]);
00234 static double ParallelDiffusivity(double w[3]);
00235 static double PerpendicularDiffusivity(double w[3]);
00236 static double MinEigenvalue(double w[3]);
00237 static double RAIMaxEigenvecX(double **v, double w[3]);
00238 static double RAIMaxEigenvecY(double **v, double w[3]);
00239 static double RAIMaxEigenvecZ(double **v, double w[3]);
00240 static double MaxEigenvalueProjectionX(double **v, double w[3]);
00241 static double MaxEigenvalueProjectionY(double **v, double w[3]);
00242 static double MaxEigenvalueProjectionZ(double **v, double w[3]);
00243 static double Mode(double w[3]);
00244 static void ColorByMode(double w[3], double &R,double &G, double &B);
00245
00246
00247
00248 static int TeemEigenSolver(double **m, double *w, double **v);
00249 void ComputeTensorIncrements(vtkImageData *imageData, vtkIdType incr[3]);
00250
00251 protected:
00252 vtkDiffusionTensorMathematics();
00253 ~vtkDiffusionTensorMathematics();
00254
00255 int Operation;
00256 double ScaleFactor;
00257 int ExtractEigenvalues;
00258
00259 int MaskWithScalars;
00260 vtkImageData *ScalarMask;
00261 int MaskLabelValue;
00262
00263 vtkMatrix4x4 *TensorRotationMatrix;
00264 int FixNegativeEigenvalues;
00265
00266 virtual int RequestInformation (vtkInformation*,
00267 vtkInformationVector**,
00268 vtkInformationVector*);
00269
00270 virtual void ThreadedRequestData(vtkInformation *request,
00271 vtkInformationVector **inputVector,
00272 vtkInformationVector *outputVector,
00273 vtkImageData ***inData,
00274 vtkImageData **outData,
00275 int extent[6], int threadId);
00276
00277 int FillInputPortInformation(int port, vtkInformation* info);
00278
00279
00280 private:
00281 vtkDiffusionTensorMathematics(const vtkDiffusionTensorMathematics&);
00282 void operator=(const vtkDiffusionTensorMathematics&);
00283 };
00284
00285 #endif
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298