Program: gdcm
Module: $RCSfile: gdcmFile.cxx,v $
Language: C++
- Date: $Date: 2005/07/22 03:33:13 $
- Version: $Revision: 1.256 $
+ Date: $Date: 2005/09/20 09:07:56 $
+ Version: $Revision: 1.269 $
Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
l'Image). All rights reserved. See Doc/License.txt or
// in the images.
//
// Remember also :
-// Patient Position (0018,5100) values : HFP = Head First-Prone
-// HFS = Head First-Supine
-// HFDR = Head First-Decubitus Right
-// HFDL = Head First-Decubitus Left
-// FFDR = Feet First-Decubitus Right
-// FFDL = Feet First-Decubitus Left
-// FFP = Feet First-Prone
-// FFS = Feet First-Supine
-// can also find SEMIERECT
-// SUPINE
+// Patient Position (0018,5100) values :
+
+// HFS = Head First-Supine, where increasing (positive axis direction) :
+// X -> to the direction pointed to by the patient's oustretched left arm
+// Y -> to the anterior-to-posterior direction in the patient's body
+// Z -> to the feet-to-head direction in the patient's body
+
+// HFP = Head First-Prone, where increasing (positive axis direction) :
+// X -> to the direction pointed to by the patient's oustretched left arm
+// Y -> to the anterior-to-posterior direction in the patient's body
+// Z -> to the feet-to-head direction in the patient's body
+
+// FFS = Feet First-Supine, where increasing (positive axis direction) :
+// X -> to the direction pointed to by the patient's oustretched left arm
+// Y -> to the anterior-to-posterion direction in the patient's body
+// Z -> to the feet-to-head direction in the patient's body
+
+// FFP = Feet First-Prone, where increasing (positive axis direction) :
+// X -> to the direction pointed to by the patient's oustretched left arm
+// Y -> to the posterior-to-anterior direction in the patient's body
+// Z -> to the feet-to-head direction in the patient's body
+
+// HFDR = Head First-Decubitus Right
+// HFDL = Head First-Decubitus Left
+// FFDR = Feet First-Decubitus Right
+// FFDL = Feet First-Decubitus Left
+
+// we can also find
+
+// SEMIERECT
+// SUPINE
+
// CS 2 Patient Orientation (0020 0020)
-// When the coordinates of the image
-// are always present, this field is almost never used.
-// Better we don't tust it too much ...
-// Found Values are : L\P
-// L\FP
-// P\F
-// L\F
-// P\FR
-// R\F
+// When the coordinates of the image
+// are always present, this field is almost never used.
+// Better we don't trust it too much ...
+// Found Values are :
+// L\P
+// L\FP
+// P\F
+// L\F
+// P\FR
+// R\F
//
// (0020|0037) [Image Orientation (Patient)] [1\0\0\0\1\0 ]
-
+
// ---------------------------------------------------------------
//
#include "gdcmFile.h"
#include "gdcmJPEGFragmentsInfo.h"
#include <vector>
-#include <stdio.h> //sscanf
+#include <stdio.h> //sscanf
#include <stdlib.h> // for atoi
-#include <math.h> // for powf
namespace gdcm
{
+
//-----------------------------------------------------------------------------
// Constructor / Destructor
/**
* \brief Retrieve the number of Bits Allocated
- * (8, 12 -compacted ACR-NEMA files-, 16, ...)
- * @return The encountered number of Bits Allocated, 0 by default.
+ * (8, 12 -compacted ACR-NEMA files-, 16, 24 -old RGB ACR-NEMA files-,)
+ * @return The encountered Number of Bits Allocated, 0 by default.
* 0 means the file is NOT USABLE. The caller has to check it !
*/
int File::GetBitsAllocated()
}
else if ( bitsAlloc == "24" )
{
- // (in order no to be messed up
- bitsAlloc = "8"; // by old RGB images)
+ // (in order no to be messed up by old RGB images)
+ bitsAlloc = "8";
}
std::string sign = GetEntryValue(0x0028, 0x0103);//"Pixel Representation"
el.Group = group;
el.Elem = elem;
el.Value = value;
- AnonymizeList.push_back(el);
+ UserAnonymizeList.push_back(el);
}
/**
uint32_t lgth;
uint32_t valLgth = 0;
std::string *spaces;
- for (ListElements::iterator it = AnonymizeList.begin();
- it != AnonymizeList.end();
+ for (ListElements::iterator it = UserAnonymizeList.begin();
+ it != UserAnonymizeList.end();
++it)
{
d = GetDocEntry( (*it).Group, (*it).Elem);
if ( d == NULL)
continue;
- if ( dynamic_cast<SeqEntry *>(d) )
- {
- gdcmWarningMacro( "You cannot 'Anonymize a SeqEntry ");
- continue;
- }
+ if ( dynamic_cast<SeqEntry *>(d) )
+ {
+ gdcmWarningMacro( "You cannot 'Anonymize' a SeqEntry ");
+ continue;
+ }
offset = d->GetOffset();
lgth = d->GetLength();
bool File::AnonymizeFile()
{
// If Anonymisation list is empty, let's perform some basic anonymization
- if ( AnonymizeList.begin() == AnonymizeList.end() )
+ if ( UserAnonymizeList.begin() == UserAnonymizeList.end() )
{
// If exist, replace by spaces
SetValEntry (" ",0x0010, 0x2154); // Telephone
}
else
{
- SetValEntry("anonymised", 0x0010, 0x0010);
+ SetValEntry("anonymized", 0x0010, 0x0010);
}
}
}
else
{
gdcm::DocEntry *d;
- for (ListElements::iterator it = AnonymizeList.begin();
- it != AnonymizeList.end();
+ for (ListElements::iterator it = UserAnonymizeList.begin();
+ it != UserAnonymizeList.end();
++it)
{
d = GetDocEntry( (*it).Group, (*it).Elem);
if ( e0000 )
{
std::ostringstream sLen;
- sLen << ComputeGroup0002Length(writetype);
+ sLen << ComputeGroup0002Length( );
e0000->SetValue(sLen.str());
}
itemTagGroup = ReadInt16();
itemTagElem = ReadInt16();
}
- catch ( FormatError e )
+ catch ( FormatError /*e*/ )
{
//std::cerr << e << std::endl;
return false;
RLEInfo = new RLEFramesInfo;
JPEGInfo = new JPEGFragmentsInfo;
- Load( filename ); // gdcm::Document is first Loaded, then the 'File part'
+ SetFileName( filename );
+ Load( ); // gdcm::Document is first Loaded, then the 'File part'
}
/**
}
#endif
-// -----------------------------------------------------------------------------------------
-// THERALYS Algorithm to determine the most similar basic orientation
-//
-// Transliterated from original Python code.
-// Kept as close as possible to the original code
-// in order to speed up any further modif of Python code :-(
-// ------------------------------------------------------------------------------------------
-
-/**
- * \brief THERALYS' Algorithm to determine the most similar basic orientation
- * (Axial, Coronal, Sagital) of the image
- * \note Should be run on the first gdcm::File of a 'coherent' Serie
- * @return orientation code
- * @return orientation code
- * # 0 : Not Applicable (neither 0020,0037 Image Orientation Patient
- * # nor 0020,0032Image Position found )
- * # 1 : Axial
- * # -1 : Axial invert
- * # 2 : Coronal
- * # -2 : Coronal invert
- * # 3 : Sagital
- * # -3 : Sagital invert
- * # 4 : Heart Axial
- * # -4 : Heart Axial invert
- * # 5 : Heart Coronal
- * # -5 : Heart Coronal invert
- * # 6 : Heart Sagital
- * # -6 : Heart Sagital invert
- */
-float File::TypeOrientation( )
-{
- float *iop = new float[6];
- bool succ = GetImageOrientationPatient( iop );
- if ( !succ )
- {
- delete iop;
- return 0.;
- }
-
- vector3D ori1;
- vector3D ori2;
-
- ori1.x = iop[0]; ori1.y = iop[1]; ori1.z = iop[2];
- ori1.x = iop[3]; ori2.y = iop[4]; ori2.z = iop[5];
-
- // two perpendicular vectors describe one plane
- float dicPlane[6][2][3] =
- { { {1, 0, 0 },{0, 1, 0 } }, // Axial
- { {1, 0, 0 },{0, 0, -1 } }, // Coronal
- { {0, 1, 0 },{0, 0, -1 } }, // Sagittal
- { { 0.8, 0.5, 0.0 },{-0.1, 0.1 , -0.95 } }, // Axial - HEART
- { { 0.8, 0.5, 0.0 },{-0.6674, 0.687, 0.1794} }, // Coronal - HEART
- { {-0.1, 0.1, -0.95},{-0.6674, 0.687, 0.1794} } // Sagittal - HEART
- };
-
- vector3D refA;
- vector3D refB;
- int i = 0;
- Res res; // [ <result> , <memory of the last succes calcule> ]
- res.first = 0;
- res.second = 99999;
- for (int numDicPlane=0; numDicPlane<6; numDicPlane++)
- {
- i = i + 1;
- // refA=plane[0]
- refA.x = dicPlane[numDicPlane][0][0];
- refA.y = dicPlane[numDicPlane][0][1];
- refA.z = dicPlane[numDicPlane][0][2];
- // refB=plane[1]
- refB.x = dicPlane[numDicPlane][1][0];
- refB.y = dicPlane[numDicPlane][1][1];
- refB.z = dicPlane[numDicPlane][1][2];
- res=VerfCriterion( i, CalculLikelyhood2Vec(refA,refB,ori1,ori2), res );
- res=VerfCriterion( -i, CalculLikelyhood2Vec(refB,refA,ori1,ori2), res );
- }
- delete iop;
- return res.first;
-/*
-// i=0
-// res=[0,99999] ## [ <result> , <memory of the last succes calculus> ]
-// for plane in dicPlane:
-// i=i+1
-// refA=plane[0]
-// refB=plane[1]
-// res=self.VerfCriterion( i , self.CalculLikelyhood2Vec(refA,refB,ori1,ori2) , res )
-// res=self.VerfCriterion( -i , self.CalculLikelyhood2Vec(refB,refA,ori1,ori2) , res )
-// return res[0]
-*/
-
-}
-
-Res File::VerfCriterion(int typeCriterion, float criterionNew, Res res)
-{
- float type = res.first;
- float criterion = res.second;
- if (criterionNew < criterion)
- {
- res.first = criterionNew;
- res.second = typeCriterion;
- }
-/*
-// type = res[0]
-// criterion = res[1]
-// # if criterionNew<0.1 and criterionNew<criterion:
-// if criterionNew<criterion:
-// criterion=criterionNew
-// type=typeCriterion
-// return [ type , criterion ]
-*/
- return res;
-}
-
-float File::CalculLikelyhood2Vec(vector3D refA, vector3D refB,
- vector3D ori1, vector3D ori2)
-{
-// # ------------------------- Purpose : -----------------------------------
-// # - This function determines the orientation similarity of two planes.
-// # Each plane is described by two vectors.
-// # ------------------------- Parameters : --------------------------------
-// # - <refA> : - type : vector 3D (float)
-// # - <refB> : - type : vector 3D (float)
-// # - Description of the first plane
-// # - <ori1> : - type : vector 3D (float)
-// # - <ori2> : - type : vector 3D (float)
-// # - Description of the second plane
-// # ------------------------- Return : ------------------------------------
-// # float : 0 if the planes are perpendicular. While the difference of
-// # the orientation between the planes are big more enlarge is
-// # the criterion.
-// # ------------------------- Other : -------------------------------------
-// # The calculus is based with vectors normalice
-
- vector3D ori3 = ProductVectorial(ori1,ori2);
- vector3D refC = ProductVectorial(refA,refB);
- float res = powf(refC.x-ori3.x, 2.) +
- powf(refC.y-ori3.y, 2.) +
- powf(refC.z-ori3.z, 2.);
-
-/*
-// ori3=self.ProductVectorial(ori1,ori2)
-// refC=self.ProductVectorial(refA,refB)
-// res=math.pow(refC[0]-ori3[0],2) + math.pow(refC[1]-ori3[1],2) + math.pow(refC[2]-ori3[2],2)
-// return math.sqrt(res)
-*/
- return sqrt(res);
-}
-
-vector3D File::ProductVectorial(vector3D vec1, vector3D vec2)
-{
-
-// # ------------------------- Purpose : -----------------------------------
-// # - Calculus of the poduct vectorial between two vectors 3D
-// # ------------------------- Parameters : --------------------------------
-// # - <vec1> : - type : vector 3D (float)
-// # - <vec2> : - type : vector 3D (float)
-// # ------------------------- Return : ------------------------------------
-// # (vec) : - Vector 3D
-// # ------------------------- Other : -------------------------------------
-
- vector3D vec3;
- vec3.x = vec1.y*vec3.z - vec1.z*vec2.y;
- vec3.y = -( vec1.x*vec2.z - vec1.z*vec2.x);
- vec3.z = vec1.x*vec2.y - vec1.y*vec2.x;
-/*
-// vec3=[0,0,0]
-// vec3[0]=vec1[1]*vec2[2] - vec1[2]*vec2[1]
-// vec3[1]=-( vec1[0]*vec2[2] - vec1[2]*vec2[0])
-// vec3[2]=vec1[0]*vec2[1] - vec1[1]*vec2[0]
-*/
- return vec3;
-}
-
//-----------------------------------------------------------------------------
// Print