]> Creatis software - gdcm.git/blobdiff - src/gdcmOrientation.h
ENH: sagital -> sagittal
[gdcm.git] / src / gdcmOrientation.h
index cbe498cabc52f5134a69940c82a73d9e8c1bb1f8..407f69a4ae8be59b562c1e3b0159af2fa1548fe0 100644 (file)
@@ -3,8 +3,8 @@
   Program:   gdcm
   Module:    $RCSfile: gdcmOrientation.h,v $
   Language:  C++
-  Date:      $Date: 2005/09/02 07:10:03 $
-  Version:   $Revision: 1.5 $
+  Date:      $Date: 2008/08/18 12:27:10 $
+  Version:   $Revision: 1.21 $
                                                                                 
   Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
   l'Image). All rights reserved. See Doc/License.txt or
                                                                                 
 =========================================================================*/
 
-#ifndef GDCMORIENTATION_H
-#define GDCMORIENTATION_H
+#ifndef _GDCMORIENTATION_H_
+#define _GDCMORIENTATION_H_
 
-#include "gdcmBase.h"
+#include "gdcmRefCounter.h"
 #include <map>
 
-namespace gdcm 
+namespace GDCM_NAME_SPACE 
 {
 typedef struct
 {
@@ -34,23 +34,90 @@ typedef struct
 typedef std::pair<double, double> Res;
 class File;
 
+typedef enum {
+   NotApplicable = 0,
+   Axial = 1,
+   AxialInvert = -1,
+   Coronal = 2,
+   CoronalInvert = -2,
+   Sagittal = 3,
+   SagittalInvert = -3,
+   HeartAxial = 4,
+   HeartAxialInvert = -4,
+   HeartCoronal = 5,
+   HeartCoronalInvert = -5,
+   HeartSagittal = 6,
+   HeartSagittalInvert = -6
+} OrientationType;
+
 //-----------------------------------------------------------------------------
 /**
  * \brief Orientation class for dealing with DICOM image orientation
+ *
+ * A gentle reminder for non-medical user:
+ * PatientPosition (0x0010,0x5100) tells us the way the patient was introduced in the imager
+ *  - HFS : Head First Supine
+ *  - FFS : Feet First Supine
+ *  - HFP : Head First Prone
+ *  - FFP : Feet First Prone
+ * Note: HFP and FFP are not very common values, since the position must
+ *        be pretty unconfortable for the Patient -the patient is lying on his belly; but, if he has handcuffs there is no other way ...-
+ *
+ * ImageOrientationPatient (0x0020,0x0037) gives 6 cosines (2 for each plane)
+ * Patient Orientation (as found in the optional 0x0020,0x0020, or computed by
+ * std::string Orientation::GetOrientation ( File *f ), tells us about the direction of X and Y axes.
+ * 
+ * The values can be
+ *  - A/P anterior/posterior
+ *  - L/R left/right
+ *  - H/F head/feet
+ * One can see it as "values within a 'Patient referential".
+ *
+ * Example #1:
+ * Imagine the patient, in "HFS" position.
+ * Full body sagittal images are requested.
+ * All the cosines will be -1, 0, or +1;
+ * "Patient Orientation" (deduced) will be "A/F".
+ * Positive X axis is oriented 'towards patient's nose
+ * Positive Y axis  is oriented 'towards patient's feet
+ *
+ * Example #2:
+ * Imagine now that patient has a stiffneck and his head is *turned* 30 degrees towards the left.
+ * Head sagittal images are requested.
+ * One of the cosines will be almost 0.5
+ * Deduced "Patient Orientation" will be "AL\F"
+ * (main X axis orientation is towards patient's nose, and a little bit towards the left)
+ * but the image looks *perfectly* sagittal (for the head, not for the patient) !
+ *
+ * Imagine the patient's stiffneck causes head to be *bended* 30 degrees towards the left AND *turned* left.
+ * Sagittal images are requested...
+ * You'll probabely have 3 letters for X axis and  Y axis, and the image remains *perfectly* sagittal !
+ * The values are given within the 'Patient referential', *not* within the 'Organ referential' ...
  */
-class GDCM_EXPORT Orientation : public Base
+
+class GDCM_EXPORT Orientation : public RefCounter
 {
+   gdcmTypeMacro(Orientation);
 public:
-  Orientation() {}
-  ~Orientation() {}
+/// \brief Constructs a gdcm::Orientation with a RefCounter
+   static Orientation *New() {return new Orientation();}
 
-   double TypeOrientation( File* file );
+  OrientationType GetOrientationType( File *file );
+  std::string GetOrientation ( File *file );  
+  
+  static const char* GetOrientationTypeString(OrientationType const o);
 
+protected:
+/// \brief Constructor
+  Orientation() {}
+/// \brief Canonical Destructor
+  ~Orientation() {}
 private:
-   Res VerfCriterion(int typeCriterion, double criterionNew, Res const & res);
-   double CalculLikelyhood2Vec(vector3D const & refA, vector3D const & refB, 
-                               vector3D const & ori1, vector3D const & ori2);
-   vector3D ProductVectorial(vector3D const & vec1, vector3D const & vec2);
+   Res VerfCriterion(int typeCriterion, double criterionNew, Res const &res);
+   double CalculLikelyhood2Vec(vector3D const &refA, vector3D const &refB, 
+                               vector3D const &ori1, vector3D const &ori2);
+   vector3D ProductVectorial(vector3D const &vec1, vector3D const &vec2);
+   std::string GetSingleOrientation ( float *iop);
 };
 } // end namespace gdcm
 //-----------------------------------------------------------------------------