Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages

gdcm::File Class Reference

DICOM elements and their corresponding values (and additionaly the corresponding DICOM dictionary entry) of the header of a DICOM file. More...

#include <gdcmFile.h>

Inheritance diagram for gdcm::File:

gdcm::Document gdcm::ElementSet gdcm::DocEntrySet gdcm::Base List of all members.

Public Types

typedef std::list< ElementListElements

Public Member Functions

 File ()
 Constructor used when we want to generate dicom files from scratch.

 File (std::string const &filename)
 Constructor.

 ~File ()
 Canonical destructor.

bool IsReadable ()
 This predicate, based on hopefully reasonable heuristics, decides whether or not the current File was properly parsed and contains the mandatory information for being considered as a well formed and usable Dicom/Acr File.

int GetImageNumber ()
 gets the info from 0020,0013 : Image Number else 0.

ModalityType GetModality ()
 gets the info from 0008,0060 : Modality

int GetXSize ()
 Retrieve the number of columns of image.

int GetYSize ()
 Retrieve the number of lines of image.

int GetZSize ()
 Retrieve the number of planes of volume or the number of frames of a multiframe.

float GetXSpacing ()
 gets the info from 0028,0030 : Pixel Spacing else 1.0

float GetYSpacing ()
 gets the info from 0028,0030 : Pixel Spacing else 1.0

float GetZSpacing ()
 gets the info from 0018,0088 : Space Between Slices else from 0018,0050 : Slice Thickness else 1.0

float GetXOrigin ()
 gets the info from 0020,0032 : Image Position Patient else from 0020,0030 : Image Position (RET) else 0.

float GetYOrigin ()
 gets the info from 0020,0032 : Image Position Patient else from 0020,0030 : Image Position (RET) else 0.

float GetZOrigin ()
 gets the info from 0020,0032 : Image Position Patient else from 0020,0030 : Image Position (RET) else from 0020,1041 : Slice Location else from 0020,0050 : Location else 0.

void GetImageOrientationPatient (float iop[6])
 gets the info from 0020,0037 : Image Orientation Patient (needed to organize DICOM files based on their x,y,z position)

int GetBitsStored ()
 Retrieve the number of Bits Stored (actually used) (as opposed to number of Bits Allocated).

int GetBitsAllocated ()
 Retrieve the number of Bits Allocated (8, 12 -compacted ACR-NEMA files, 16, ...).

int GetHighBitPosition ()
 Retrieve the high bit position.

int GetSamplesPerPixel ()
 Retrieve the number of Samples Per Pixel (1 : gray level, 3 : RGB -1 or 3 Planes-).

int GetPlanarConfiguration ()
 Retrieve the Planar Configuration for RGB images (0 : RGB Pixels , 1 : R Plane + G Plane + B Plane).

int GetPixelSize ()
 Return the size (in bytes) of a single pixel of data.

std::string GetPixelType ()
 Build the Pixel Type of the image. Possible values are: -8U unsigned 8 bit, -8S signed 8 bit, -16U unsigned 16 bit, -16S signed 16 bit, -32U unsigned 32 bit, -32S signed 32 bit, -FD floating double 64 bits (Not kosher DICOM, but so usefull!).

bool IsSignedPixelData ()
 Check whether the pixels are signed or UNsigned data.

bool IsMonochrome ()
 Check whether this a monochrome picture or not by accessing the "Photometric Interpretation" tag ( 0x0028, 0x0004 ).

bool IsPaletteColor ()
 Check whether this a "PALETTE COLOR" picture or not by accessing the "Photometric Interpretation" tag ( 0x0028, 0x0004 ).

bool IsYBRFull ()
 Check whether this a "YBR_FULL" color picture or not by accessing the "Photometric Interpretation" tag ( 0x0028, 0x0004 ).

bool HasLUT ()
 tells us if LUT are used

int GetLUTNbits ()
 gets the info from 0028,1101 : Lookup Table Desc-Red else 0

float GetRescaleIntercept ()
 gets the info from 0028,1052 : Rescale Intercept

float GetRescaleSlope ()
 gets the info from 0028,1053 : Rescale Slope

int GetNumberOfScalarComponents ()
 This function is intended to user who doesn't want to have to manage a LUT and expects to get an RBG Pixel image (or a monochrome one ...).

int GetNumberOfScalarComponentsRaw ()
 This function is intended to user that DOESN'T want to get RGB pixels image when it's stored as a PALETTE COLOR image -the (vtk) user is supposed to know how deal with LUTs -.

uint16_t GetGrPixel ()
 Accessor to File::GrPixel.

uint16_t GetNumPixel ()
 Accessor to File::NumPixel.

size_t GetPixelOffset ()
 Recover the offset (from the beginning of the file) of *image* pixels (not *icone image* pixels, if any !).

size_t GetPixelAreaLength ()
 Recover the pixel area length (in Bytes).

RLEFramesInfoGetRLEInfo ()
 returns the RLE info

JPEGFragmentsInfoGetJPEGInfo ()
 Returns the JPEG Fragments info.

void AddAnonymizeElement (uint16_t group, uint16_t elem, std::string const &value)
 Adds the characteristics of a new element we want to anonymize.

void ClearAnonymizeList ()
 Clears the list of elements to be anonymized.

void AnonymizeNoLoad ()
 Overwrites in the file the values of the DicomElements held in the list.

bool AnonymizeFile ()
 anonymize a File (removes Patient's personal info passed with AddAnonymizeElement()

bool Write (std::string fileName, FileType filetype)
 Performs some consistency checking on various 'File related' (as opposed to 'DicomDir related') entries then writes in a file all the (Dicom Elements) included the Pixels.

DictGetPubDict ()
 Get the public dictionary used.

DictGetShaDict ()
 Get the shadow dictionary used.

bool SetShaDict (Dict *dict)
 Set the shadow dictionary used.

bool SetShaDict (DictKey const &dictName)
 Set the shadow dictionary used.

bool IsDicomV3 ()
 Predicate for dicom version 3 file.

bool IsPapyrus ()
 Predicate for Papyrus file Dedicated to whomsoever it may concern.

FileType GetFileType ()
 returns the File Type (ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown)

std::string GetTransferSyntax ()
 Accessor to the Transfer Syntax (when present) of the current document (it internally handles reading the value from disk when only parsing occured).

std::string GetTransferSyntaxName ()
 Accesses the info from 0002,0010 : Transfer Syntax and TS.

int GetSwapCode ()
 'Swap code' accessor (see SwapCode )

uint16_t SwapShort (uint16_t)
 Swaps the bytes so they agree with the processor order.

uint32_t SwapLong (uint32_t)
 Swaps back the bytes of 4-byte long integer accordingly to processor order.

uint16_t UnswapShort (uint16_t a)
 Unswaps back the bytes of 2-bytes long integer so they agree with the processor order.

uint32_t UnswapLong (uint32_t a)
 Unswaps back the bytes of 4-byte long integer so they agree with the processor order.

const std::string & GetFileName () const
 Accessor to Filename.

void SetFileName (std::string const &fileName)
 Accessor to Filename.

std::ifstream * OpenFile ()
 Tries to open the file Document::Filename and checks the preamble when existing.

bool CloseFile ()
 closes the file

void WriteContent (std::ofstream *fp, FileType type)
 Writes in a file all the Header Entries (Dicom Elements).

virtual void LoadEntryBinArea (uint16_t group, uint16_t elem)
 Loads (from disk) the element content when a string is not suitable.

virtual void LoadEntryBinArea (BinEntry *entry)
 Loads (from disk) the element content when a string is not suitable.

void LoadDocEntrySafe (DocEntry *entry)
 Loads the element while preserving the current underlying file position indicator as opposed to LoadDocEntry that modifies it.

bool operator< (Document &document)
 Compares two documents, according to DicomDir rules.

virtual void Print (std::ostream &os=std::cout, std::string const &indent="")
 Prints the Header Entries (Dicom Elements) from the H Table.

bool AddEntry (DocEntry *Entry)
 add a new Dicom Element pointer to the H Table

bool RemoveEntry (DocEntry *EntryToRemove)
 Clear the hash table from given entry AND delete the entry.

bool RemoveEntryNoDestroy (DocEntry *EntryToRemove)
 Clear the hash table from given entry BUT keep the entry.

void ClearEntry ()
 delete all entries in the ElementSet

DocEntryGetFirstEntry ()
 Get the first entry while visiting *the* 'zero level' DocEntrySet (DocEntries out of any Sequence).

DocEntryGetNextEntry ()
 Get the next entry while visiting *the* 'zero level' DocEntrySet (DocEntries out of any Sequence).

DocEntryGetDocEntry (uint16_t group, uint16_t elem)
 retrieves a Dicom Element using (group, element)

bool IsEmpty ()
 Tells us if the ElementSet contains no entry.

virtual std::string GetEntryValue (uint16_t group, uint16_t elem)
 Get the "std::string representable" value of the Dicom entry.

virtual void * GetEntryBinArea (uint16_t group, uint16_t elem)
 Gets (from Header) a 'non string' element value.

virtual int GetEntryLength (uint16_t group, uint16_t elem)
 Searches within Header Entries (Dicom Elements) parsed with the public and private dictionaries for the value length of a given tag..

virtual std::string GetEntryVR (uint16_t group, uint16_t elem)
 Searches within Header Entries (Dicom Elements) parsed with the public [and private dictionaries] for the element value representation of a given tag.. Obtaining the VR (Value Representation) might be needed by caller to convert the string typed content to caller's native type (think of C++ vs Python). The VR is actually of a higher level of semantics than just the native C++ type.

ValEntryGetValEntry (uint16_t group, uint16_t elem)
 Same as Document::GetDocEntry except it only returns a result when the corresponding entry is of type ValEntry.

BinEntryGetBinEntry (uint16_t group, uint16_t elem)
 Same as Document::GetDocEntry except it only returns a result when the corresponding entry is of type BinEntry.

SeqEntryGetSeqEntry (uint16_t group, uint16_t elem)
 Same as Document::GetDocEntry except it only returns a result when the corresponding entry is of type SeqEntry.

bool SetValEntry (std::string const &content, uint16_t group, uint16_t elem)
 Accesses an existing DocEntry (i.e. a Dicom Element) through it's (group, element) and modifies it's content with the given value.

bool SetValEntry (std::string const &content, ValEntry *entry)
 Accesses an existing DocEntry (i.e. a Dicom Element) and modifies it's content with the given value.

bool SetBinEntry (uint8_t *content, int lgth, uint16_t group, uint16_t elem)
 Accesses an existing DocEntry (i.e. a Dicom Element) through it's (group, element) and modifies it's content with the given value.

bool SetBinEntry (uint8_t *content, int lgth, BinEntry *entry)
 Accesses an existing BinEntry (i.e. a Dicom Element) and modifies it's content with the given value.

ValEntryInsertValEntry (std::string const &value, uint16_t group, uint16_t elem, TagName const &vr=GDCM_UNKNOWN)
 Modifies the value of a given Doc Entry (Dicom Element) when it exists. Create it with the given value when unexistant.

BinEntryInsertBinEntry (uint8_t *binArea, int lgth, uint16_t group, uint16_t elem, TagName const &vr=GDCM_UNKNOWN)
 Modifies the value of a given Header Entry (Dicom Element) when it exists. Create it with the given value when unexistant. A copy of the binArea is made to be kept in the Document.

SeqEntryInsertSeqEntry (uint16_t group, uint16_t elem)
 Modifies the value of a given Doc Entry (Dicom Element) when it exists. Creates it when unexistant.

virtual bool CheckIfEntryExist (uint16_t group, uint16_t elem)
 Checks if a given Dicom Element exists within the H table.

ValEntryNewValEntry (uint16_t group, uint16_t elem, TagName const &vr=GDCM_UNKNOWN)
 Build a new Val Entry from all the low level arguments. Check for existence of dictionary entry, and build a default one when absent.

BinEntryNewBinEntry (uint16_t group, uint16_t elem, TagName const &vr=GDCM_UNKNOWN)
 Build a new Bin Entry from all the low level arguments. Check for existence of dictionary entry, and build a default one when absent.

SeqEntryNewSeqEntry (uint16_t group, uint16_t elem)
 Build a new Seq Entry from all the low level arguments. Check for existence of dictionary entry, and build a default one when absent.

DictEntryNewVirtualDictEntry (uint16_t group, uint16_t elem, TagName const &vr=GDCM_UNKNOWN, TagName const &vm=GDCM_UNKNOWN, TagName const &name=GDCM_UNKNOWN)
 Request a new virtual dict entry to the dict set.

void SetPrintLevel (int level)
 Sets the print level for the Dicom Header Elements.

int GetPrintLevel ()
 Gets the print level for the Dicom Entries.


Protected Member Functions

void InitializeDefaultFile ()
 Initialize a default DICOM File that should contain all the field require by other reader. DICOM standard does not explicitely defines those fields, heuristic has been choosen. This is not perfect as we are writting a CT image...

uint16_t ReadInt16 () throw ( FormatError )
 Reads a supposed to be 16 Bits integer (swaps it depending on processor endianness).

uint32_t ReadInt32 () throw ( FormatError )
 Reads a supposed to be 32 Bits integer (swaps it depending on processor endianness).

void SkipBytes (uint32_t)
 skips bytes inside the source file

int ComputeGroup0002Length (FileType filetype)
 Re-computes the length of a ACR-NEMA/Dicom group from a DcmHeader.

DictEntryGetDictEntry (uint16_t group, uint16_t elem)
 Searches [both] the public [and the shadow dictionary (when they exist)] for the presence of the DictEntry with given group and element. The public dictionary has precedence on the shadow one.

DictEntryGetDictEntry (uint16_t group, uint16_t elem, TagName const &vr)
 Searches [both] the public [and the shadow dictionary (when they exist)] for the presence of the DictEntry with given group and element, and create a new virtual DictEntry if necessary.


Protected Attributes

RLEFramesInfoRLEInfo
 Store the RLE frames info obtained during parsing of pixels.

JPEGFragmentsInfoJPEGInfo
 Store the JPEG fragments info obtained during parsing of pixels.

uint16_t NumPixel
 In some cases (e.g. for some ACR-NEMA images) the Entry Element Number of the 'Pixel Element' is *not* found at 0x0010. In order to make things easier the parser shall store the proper value in NumPixel to provide a unique access facility.

uint16_t GrPixel
 In some cases (e.g. for some ACR-NEMA images) the header entry for the group of pixels is *not* found at 0x7fe0. In order to make things easier the parser shall store the proper value in GrPixel to provide a unique access facility.

std::string Filename
 Refering underlying filename.

int SwapCode
 Swap code gives an information on the byte order of a supposed to be an int32, as it's read on disc (depending on the image Transfer Syntax *and* on the processor endianess) as opposed as it should in memory to be dealt as an int32. For instance :
  • a 'Little Endian' image, read with a little endian processor will have a SwapCode= 1234 (the order is OK; nothing to do)
  • a 'Little Endian' image, read with a big endian procesor will have a SwapCode= 4321 (the order is wrong; int32 an int16 must be swapped) note : values 2143, 4321, 3412 remain for the ACR-NEMA time, and the well known 'Bad Big Endian' and 'Bad Little Endian' codes.


bool Group0002Parsed
 whether we already parsed group 0002 (Meta Elements)

bool HasDCMPreamble
 whether file has a DCM Preamble

std::ifstream * Fp
 File Pointer, opened during Document parsing.

FileType Filetype
 ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown.

ListElements AnonymizeList
 List of element to Anonymize.

int PrintLevel
 Amount of printed details for each Dicom Entries : 0 : stands for the least detail level.


Static Protected Attributes

const unsigned int HEADER_LENGTH_TO_READ
 After opening the file, we read HEADER_LENGTH_TO_READ bytes.

const unsigned int MAX_SIZE_LOAD_ELEMENT_VALUE = 0xfff
 Elements whose value is longer than MAX_SIZE_LOAD_ELEMENT_VALUE are NOT loaded.

const unsigned int MAX_SIZE_PRINT_ELEMENT_VALUE = 0x7fffffff
 Elements whose value is longer than MAX_SIZE_PRINT_ELEMENT_VALUE are NOT printed.


Private Member Functions

void ComputeRLEInfo ()
 Parse pixel data from disk of [multi-]fragment RLE encoding. Compute the RLE extra information and store it in RLEInfo for later pixel retrieval usage.

void ComputeJPEGFragmentInfo ()
 Parse pixel data from disk of [multi-]fragment Jpeg encoding. Compute the jpeg extra information (fragment[s] offset[s] and length) and store it[them] in JPEGInfo for later pixel retrieval usage.

bool ReadTag (uint16_t, uint16_t)
 Assuming the internal file pointer Document::Fp is placed at the beginning of a tag check whether this tag is (TestGroup, TestElement).

uint32_t ReadTagLength (uint16_t, uint16_t)
 Assuming the internal file pointer Document::Fp is placed at the beginning of a tag (TestGroup, TestElement), read the length associated to the Tag.

void ReadAndSkipEncapsulatedBasicOffsetTable ()
 When parsing the Pixel Data of an encapsulated file, read the basic offset table (when present, and BTW dump it).


Detailed Description

DICOM elements and their corresponding values (and additionaly the corresponding DICOM dictionary entry) of the header of a DICOM file.

The typical usage of instances of class File is to classify a set of dicom files according to header information e.g. to create a file hierarchy reflecting the Patient/Study/Serie informations, or extracting a given SerieId. Accessing the content (image[s] or volume[s]) is beyond the functionality of this class and belongs to gdmcFile.

Note:
The various entries of the explicit value representation (VR) shall be managed within a dictionary which is shared by all File instances.

The File::Set*Tag* family members cannot be defined as protected due to Swig limitations for as Has_a dependency between File and FileHelper.

Definition at line 95 of file gdcmFile.h.


Member Typedef Documentation

typedef std::list<Element> gdcm::Document::ListElements [inherited]
 

Definition at line 47 of file gdcmDocument.h.


Constructor & Destructor Documentation

gdcm::File::File  ) 
 

Constructor used when we want to generate dicom files from scratch.

Definition at line 152 of file gdcmFile.cxx.

References InitializeDefaultFile(), JPEGInfo, and RLEInfo.

00152           :
00153    Document()
00154 {
00155    RLEInfo  = new RLEFramesInfo;
00156    JPEGInfo = new JPEGFragmentsInfo;
00157    InitializeDefaultFile();
00158 }

gdcm::File::File std::string const &  filename  ) 
 

Constructor.

Parameters:
filename name of the file whose header we want to analyze

Definition at line 53 of file gdcmFile.cxx.

References gdcm::ElementSet::AddEntry(), gdcm::Document::CloseFile(), ComputeJPEGFragmentInfo(), ComputeRLEInfo(), gdcm::ContentEntry::Copy(), gdcm::GDCM_UNFOUND, gdcm::BinEntry::GetBinArea(), GetBitsAllocated(), gdcm::ElementSet::GetDocEntry(), gdcm::DocEntrySet::GetEntryValue(), gdcm::DocEntry::GetOffset(), gdcm::Document::GetTransferSyntax(), gdcm::DocEntry::GetVR(), GrPixel, gdcm::BinEntry::IsSelfArea(), JPEGInfo, gdcm::DocEntrySet::NewVirtualDictEntry(), NumPixel, gdcm::Document::OpenFile(), gdcm::ElementSet::RemoveEntry(), RLEInfo, gdcm::BinEntry::SetBinArea(), and gdcm::BinEntry::SetSelfArea().

00054      :Document( filename )
00055 {    
00056    RLEInfo  = new RLEFramesInfo;
00057    JPEGInfo = new JPEGFragmentsInfo;
00058 
00059    // for some ACR-NEMA images GrPixel, NumPixel is *not* 7fe0,0010
00060    // We may encounter the 'RETired' (0x0028, 0x0200) tag
00061    // (Image Location") . This entry contains the number of
00062    // the group that contains the pixel data (hence the "Pixel Data"
00063    // is found by indirection through the "Image Location").
00064    // Inside the group pointed by "Image Location" the searched element
00065    // is conventionally the element 0x0010 (when the norm is respected).
00066    // When the "Image Location" is missing we default to group 0x7fe0.
00067    // Note: this IS the right place for the code
00068  
00069    // Image Location
00070    const std::string &imgLocation = GetEntryValue(0x0028, 0x0200);
00071    if ( imgLocation == GDCM_UNFOUND )
00072    {
00073       // default value
00074       GrPixel = 0x7fe0;
00075    }
00076    else
00077    {
00078       GrPixel = (uint16_t) atoi( imgLocation.c_str() );
00079    }   
00080 
00081    // sometimes Image Location value doesn't follow
00082    // the supposed processor endianness.
00083    // see gdcmData/cr172241.dcm
00084    if ( GrPixel == 0xe07f )
00085    {
00086       GrPixel = 0x7fe0;
00087    }
00088 
00089    if ( GrPixel != 0x7fe0 )
00090    {
00091       // This is a kludge for old dirty Philips imager.
00092       NumPixel = 0x1010;
00093    }
00094    else
00095    {
00096       NumPixel = 0x0010;
00097    }
00098 
00099    // Now, we know GrPixel and NumPixel.
00100    // Let's create a VirtualDictEntry to allow a further VR modification
00101    // and force VR to match with BitsAllocated.
00102    DocEntry *entry = GetDocEntry(GrPixel, NumPixel); 
00103    if ( entry != 0 )
00104    {
00105       // Compute the RLE or JPEG info
00106       OpenFile();
00107       std::string ts = GetTransferSyntax();
00108       Fp->seekg( entry->GetOffset(), std::ios::beg );
00109       if ( Global::GetTS()->IsRLELossless(ts) ) 
00110          ComputeRLEInfo();
00111       else if ( Global::GetTS()->IsJPEG(ts) )
00112          ComputeJPEGFragmentInfo();
00113       CloseFile();
00114 
00115       // Create a new BinEntry to change the the DictEntry
00116       // The changed DictEntry will have 
00117       // - a correct PixelVR OB or OW)
00118       // - a VM to "PXL"
00119       // - the name to "Pixel Data"
00120       BinEntry *oldEntry = dynamic_cast<BinEntry *>(entry);
00121       if(oldEntry)
00122       {
00123          std::string PixelVR;
00124          // 8 bits allocated is a 'O Bytes' , as well as 24 (old ACR-NEMA RGB)
00125          // more than 8 (i.e 12, 16) is a 'O Words'
00126          if ( GetBitsAllocated() == 8 || GetBitsAllocated() == 24 ) 
00127             PixelVR = "OB";
00128          else
00129             PixelVR = "OW";
00130 
00131          // Change only made if usefull
00132          if( PixelVR != oldEntry->GetVR() )
00133          {
00134             DictEntry* newDict = NewVirtualDictEntry(GrPixel,NumPixel,
00135                                                      PixelVR,"1","Pixel Data");
00136 
00137             BinEntry *newEntry = new BinEntry(newDict);
00138             newEntry->Copy(entry);
00139             newEntry->SetBinArea(oldEntry->GetBinArea(),oldEntry->IsSelfArea());
00140             oldEntry->SetSelfArea(false);
00141 
00142             RemoveEntry(oldEntry);
00143             AddEntry(newEntry);
00144          }
00145       }
00146    }
00147 }

gdcm::File::~File  ) 
 

Canonical destructor.

Definition at line 163 of file gdcmFile.cxx.

References JPEGInfo, and RLEInfo.

00164 {
00165    if( RLEInfo )
00166       delete RLEInfo;
00167    if( JPEGInfo )
00168       delete JPEGInfo;
00169 }


Member Function Documentation

void gdcm::File::AddAnonymizeElement uint16_t  group,
uint16_t  elem,
std::string const &  value
 

Adds the characteristics of a new element we want to anonymize.

Definition at line 1144 of file gdcmFile.cxx.

References gdcm::Element::Elem, gdcm::Element::Group, and gdcm::Element::Value.

01147 { 
01148    Element el;
01149    el.Group = group;
01150    el.Elem  = elem;
01151    el.Value = value;
01152    AnonymizeList.push_back(el); 
01153 }

bool gdcm::ElementSet::AddEntry DocEntry newEntry  )  [virtual, inherited]
 

add a new Dicom Element pointer to the H Table

Parameters:
newEntry entry to add

Implements gdcm::DocEntrySet.

Definition at line 69 of file gdcmElementSet.cxx.

References gdcmWarningMacro, gdcm::DocEntry::GetKey(), gdcm::ElementSet::TagHT, and gdcm::TagKey.

Referenced by File(), gdcm::DocEntryArchive::Push(), and gdcm::DocEntryArchive::Restore().

00070 {
00071    const TagKey &key = newEntry->GetKey();
00072 
00073    if( TagHT.count(key) == 1 )
00074    {
00075       gdcmWarningMacro( "Key already present: " << key.c_str());
00076       return false;
00077    }
00078    else
00079    {
00080       TagHT.insert(TagDocEntryHT::value_type(newEntry->GetKey(), newEntry));
00081       return true;
00082    }
00083 }

bool gdcm::File::AnonymizeFile  ) 
 

anonymize a File (removes Patient's personal info passed with AddAnonymizeElement()

Definition at line 1206 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcm::ElementSet::GetDocEntry(), gdcm::DocEntrySet::GetEntryValue(), and gdcm::DocEntrySet::SetValEntry().

01207 {
01208    // If Anonymisation list is empty, let's perform some basic anonymization
01209    if ( AnonymizeList.begin() == AnonymizeList.end() )
01210    {
01211       // If exist, replace by spaces
01212       SetValEntry ("  ",0x0010, 0x2154); // Telephone   
01213       SetValEntry ("  ",0x0010, 0x1040); // Adress
01214       SetValEntry ("  ",0x0010, 0x0020); // Patient ID
01215 
01216       DocEntry* patientNameHE = GetDocEntry (0x0010, 0x0010);
01217   
01218       if ( patientNameHE ) // we replace it by Study Instance UID (why not ?)
01219       {
01220          std::string studyInstanceUID =  GetEntryValue (0x0020, 0x000d);
01221          if ( studyInstanceUID != GDCM_UNFOUND )
01222          {
01223             SetValEntry(studyInstanceUID, 0x0010, 0x0010);
01224          }
01225          else
01226          {
01227             SetValEntry("anonymised", 0x0010, 0x0010);
01228          }
01229       }
01230    }
01231    else
01232    {
01233       gdcm::DocEntry *d;
01234       for (ListElements::iterator it = AnonymizeList.begin();  
01235                                   it != AnonymizeList.end();
01236                                 ++it)
01237       {  
01238          d = GetDocEntry( (*it).Group, (*it).Elem);
01239 
01240          if ( d == NULL)
01241             continue;
01242 
01243          if ( dynamic_cast<BinEntry *>(d)
01244            || dynamic_cast<SeqEntry *>(d) )
01245             continue;
01246 
01247          SetValEntry ((*it).Value, (*it).Group, (*it).Elem);
01248       }
01249 }
01250 
01251   // In order to make definitively impossible any further identification
01252   // remove or replace all the stuff that contains a Date
01253 
01254 //0008 0012 DA ID Instance Creation Date
01255 //0008 0020 DA ID Study Date
01256 //0008 0021 DA ID Series Date
01257 //0008 0022 DA ID Acquisition Date
01258 //0008 0023 DA ID Content Date
01259 //0008 0024 DA ID Overlay Date
01260 //0008 0025 DA ID Curve Date
01261 //0008 002a DT ID Acquisition Datetime
01262 //0018 9074 DT ACQ Frame Acquisition Datetime
01263 //0018 9151 DT ACQ Frame Reference Datetime
01264 //0018 a002 DT ACQ Contribution Date Time
01265 //0020 3403 SH REL Modified Image Date (RET)
01266 //0032 0032 DA SDY Study Verified Date
01267 //0032 0034 DA SDY Study Read Date
01268 //0032 1000 DA SDY Scheduled Study Start Date
01269 //0032 1010 DA SDY Scheduled Study Stop Date
01270 //0032 1040 DA SDY Study Arrival Date
01271 //0032 1050 DA SDY Study Completion Date
01272 //0038 001a DA VIS Scheduled Admission Date
01273 //0038 001c DA VIS Scheduled Discharge Date
01274 //0038 0020 DA VIS Admitting Date
01275 //0038 0030 DA VIS Discharge Date
01276 //0040 0002 DA PRC Scheduled Procedure Step Start Date
01277 //0040 0004 DA PRC Scheduled Procedure Step End Date
01278 //0040 0244 DA PRC Performed Procedure Step Start Date
01279 //0040 0250 DA PRC Performed Procedure Step End Date
01280 //0040 2004 DA PRC Issue Date of Imaging Service Request
01281 //0040 4005 DT PRC Scheduled Procedure Step Start Date and Time
01282 //0040 4011 DT PRC Expected Completion Date and Time
01283 //0040 a030 DT PRC Verification Date Time
01284 //0040 a032 DT PRC Observation Date Time
01285 //0040 a120 DT PRC DateTime
01286 //0040 a121 DA PRC Date
01287 //0040 a13a DT PRC Referenced Datetime
01288 //0070 0082 DA ??? Presentation Creation Date
01289 //0100 0420 DT ??? SOP Autorization Date and Time
01290 //0400 0105 DT ??? Digital Signature DateTime
01291 //2100 0040 DA PJ Creation Date
01292 //3006 0008 DA SSET Structure Set Date
01293 //3008 0024 DA ??? Treatment Control Point Date
01294 //3008 0054 DA ??? First Treatment Date
01295 //3008 0056 DA ??? Most Recent Treatment Date
01296 //3008 0162 DA ??? Safe Position Exit Date
01297 //3008 0166 DA ??? Safe Position Return Date
01298 //3008 0250 DA ??? Treatment Date
01299 //300a 0006 DA RT RT Plan Date
01300 //300a 022c DA RT Air Kerma Rate Reference Date
01301 //300e 0004 DA RT Review Date
01302 
01303    return true;
01304 }

void gdcm::File::AnonymizeNoLoad  ) 
 

Overwrites in the file the values of the DicomElements held in the list.

Definition at line 1159 of file gdcmFile.cxx.

References gdcm::ElementSet::GetDocEntry(), gdcm::DocEntry::GetLength(), and gdcm::DocEntry::GetOffset().

01160 {
01161    std::fstream *fp = new std::fstream(Filename.c_str(), 
01162                               std::ios::in | std::ios::out | std::ios::binary);
01163  
01164    // TODO : FIXME
01165    // how to white out disk space if longer than 50 ?
01166    
01167    
01168    gdcm::DocEntry *d;
01169    uint32_t offset;
01170    uint32_t lgth;
01171    uint32_t valLgth;
01172    std::string *spaces;
01173    for (ListElements::iterator it = AnonymizeList.begin();  
01174                                it != AnonymizeList.end();
01175                              ++it)
01176    { 
01177       d = GetDocEntry( (*it).Group, (*it).Elem);
01178 
01179       if ( d == NULL)
01180          continue;
01181 
01182       if ( dynamic_cast<BinEntry *>(d)
01183         || dynamic_cast<SeqEntry *>(d) )
01184          continue;
01185 
01186       offset = d->GetOffset();
01187       lgth =   d->GetLength();
01188       if (valLgth < lgth)
01189       {
01190          spaces = new std::string( lgth-valLgth, ' ');
01191          (*it).Value = (*it).Value + *spaces;
01192          delete spaces;
01193       }
01194       fp->seekp( offset, std::ios::beg );
01195       fp->write( (*it).Value.c_str(), lgth );
01196      
01197    }
01198    fp->close();
01199    delete fp;
01200 }

bool gdcm::DocEntrySet::CheckIfEntryExist uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

Checks if a given Dicom Element exists within the H table.

Parameters:
group Group number of the searched Dicom Element
elem Element number of the searched Dicom Element
Returns:
true is found

Definition at line 434 of file gdcmDocEntrySet.cxx.

References gdcm::DocEntrySet::GetDocEntry().

00435 {
00436    return GetDocEntry(group,elem)!=NULL;
00437 }

void gdcm::File::ClearAnonymizeList  )  [inline]
 

Clears the list of elements to be anonymized.

Definition at line 162 of file gdcmFile.h.

00162 { AnonymizeList.clear(); }      

void gdcm::ElementSet::ClearEntry  )  [virtual, inherited]
 

delete all entries in the ElementSet

Implements gdcm::DocEntrySet.

Definition at line 125 of file gdcmElementSet.cxx.

References gdcm::ElementSet::TagHT.

Referenced by gdcm::DicomDir::CreateDicomDir(), gdcm::DicomDir::SetElements(), and gdcm::ElementSet::~ElementSet().

00126 {
00127    for(TagDocEntryHT::iterator cc = TagHT.begin();cc != TagHT.end(); ++cc)
00128    {
00129       if ( cc->second )
00130       {
00131          delete cc->second;
00132       }
00133    }
00134    TagHT.clear();
00135 }

bool gdcm::Document::CloseFile  )  [inherited]
 

closes the file

Returns:
TRUE if the close was successfull

Definition at line 464 of file gdcmDocument.cxx.

References gdcm::Document::Fp.

Referenced by gdcm::Document::Document(), File(), gdcm::FileHelper::GetRaw(), gdcm::Document::LoadEntryBinArea(), and gdcm::Document::OpenFile().

00465 {
00466    if( Fp )
00467    {
00468       Fp->close();
00469       delete Fp;
00470       Fp = 0;
00471    }
00472    return true; //FIXME how do we detect a non-closed ifstream ?
00473 }

int gdcm::Document::ComputeGroup0002Length FileType  filetype  )  [protected, inherited]
 

Re-computes the length of a ACR-NEMA/Dicom group from a DcmHeader.

Parameters:
filetype Type of the File to be written

Definition at line 717 of file gdcmDocument.cxx.

References gdcm::ExplicitVR, gdcm::DocEntry::GetElement(), gdcm::ElementSet::GetFirstEntry(), gdcm::DocEntry::GetGroup(), gdcm::DocEntry::GetLength(), gdcm::ElementSet::GetNextEntry(), and gdcm::DocEntry::GetVR().

Referenced by Write().

00718 {
00719    uint16_t gr;
00720    std::string vr;
00721    
00722    int groupLength = 0;
00723    bool found0002 = false;   
00724   
00725    // for each zero-level Tag in the DCM Header
00726    DocEntry *entry = GetFirstEntry();
00727    while( entry )
00728    {
00729       gr = entry->GetGroup();
00730 
00731       if( gr == 0x0002 )
00732       {
00733          found0002 = true;
00734 
00735          if( entry->GetElement() != 0x0000 )
00736          {
00737             vr = entry->GetVR();
00738  
00739             if( filetype == ExplicitVR )
00740             {
00741                if ( (vr == "OB") || (vr == "OW") || (vr == "SQ") ) 
00742                {
00743                   // explicit VR AND OB, OW, SQ : 4 more bytes
00744                   groupLength +=  4;
00745                }
00746             }
00747             groupLength += 2 + 2 + 4 + entry->GetLength();   
00748          }
00749       }
00750       else if (found0002 )
00751          break;
00752 
00753       entry = GetNextEntry();
00754    }
00755    return groupLength; 
00756 }

void gdcm::File::ComputeJPEGFragmentInfo  )  [private]
 

Parse pixel data from disk of [multi-]fragment Jpeg encoding. Compute the jpeg extra information (fragment[s] offset[s] and length) and store it[them] in JPEGInfo for later pixel retrieval usage.

Definition at line 1588 of file gdcmFile.cxx.

References gdcm::JPEGFragmentsInfo::AddFragment(), gdcmWarningMacro, gdcm::Document::GetTransferSyntax(), JPEGInfo, ReadAndSkipEncapsulatedBasicOffsetTable(), ReadTag(), ReadTagLength(), gdcm::JPEGFragment::SetLength(), gdcm::JPEGFragment::SetOffset(), and gdcm::Document::SkipBytes().

Referenced by File().

01589 {
01590    // If you need to, look for comments of ComputeRLEInfo().
01591    std::string ts = GetTransferSyntax();
01592    if ( ! Global::GetTS()->IsJPEG(ts) )
01593    {
01594       return;
01595    }
01596 
01597    ReadAndSkipEncapsulatedBasicOffsetTable();
01598 
01599    // Loop on the fragments[s] and store the parsed information in a
01600    // JPEGInfo.
01601    long fragmentLength;
01602    while ( (fragmentLength = ReadTagLength(0xfffe, 0xe000)) )
01603    { 
01604       long fragmentOffset = Fp->tellg();
01605 
01606        // Store the collected info
01607        JPEGFragment *newFragment = new JPEGFragment;
01608        newFragment->SetOffset(fragmentOffset);
01609        newFragment->SetLength(fragmentLength);
01610        JPEGInfo->AddFragment(newFragment);
01611 
01612        SkipBytes(fragmentLength);
01613    }
01614 
01615    // Make sure that at the end of the item we encounter a 'Sequence
01616    // Delimiter Item':
01617    if ( !ReadTag(0xfffe, 0xe0dd) )
01618    {
01619       gdcmWarningMacro( "No sequence delimiter item at end of JPEG item sequence");
01620    }
01621 }

void gdcm::File::ComputeRLEInfo  )  [private]
 

Parse pixel data from disk of [multi-]fragment RLE encoding. Compute the RLE extra information and store it in RLEInfo for later pixel retrieval usage.

Definition at line 1492 of file gdcmFile.cxx.

References gdcm::RLEFramesInfo::AddFrame(), gdcmWarningMacro, gdcm::Document::GetTransferSyntax(), ReadAndSkipEncapsulatedBasicOffsetTable(), gdcm::Document::ReadInt32(), ReadTag(), ReadTagLength(), RLEInfo, gdcm::RLEFrame::SetLength(), gdcm::RLEFrame::SetNumberOfFragments(), gdcm::RLEFrame::SetOffset(), and gdcm::Document::SkipBytes().

Referenced by File().

01493 {
01494    std::string ts = GetTransferSyntax();
01495    if ( !Global::GetTS()->IsRLELossless(ts) ) 
01496    {
01497       return;
01498    }
01499 
01500    // Encoded pixel data: for the time being we are only concerned with
01501    // Jpeg or RLE Pixel data encodings.
01502    // As stated in PS 3.5-2003, section 8.2 p44:
01503    // "If sent in Encapsulated Format (i.e. other than the Native Format) the
01504    //  value representation OB is used".
01505    // Hence we expect an OB value representation. Concerning OB VR,
01506    // the section PS 3.5-2003, section A.4.c p 58-59, states:
01507    // "For the Value Representations OB and OW, the encoding shall meet the
01508    //   following specifications depending on the Data element tag:"
01509    //   [...snip...]
01510    //    - the first item in the sequence of items before the encoded pixel
01511    //      data stream shall be basic offset table item. The basic offset table
01512    //      item value, however, is not required to be present"
01513    ReadAndSkipEncapsulatedBasicOffsetTable();
01514 
01515    // Encapsulated RLE Compressed Images (see PS 3.5-2003, Annex G)
01516    // Loop on the individual frame[s] and store the information
01517    // on the RLE fragments in a RLEFramesInfo.
01518    // Note: - when only a single frame is present, this is a
01519    //         classical image.
01520    //       - when more than one frame are present, then we are in 
01521    //         the case of a multi-frame image.
01522    long frameLength;
01523    while ( (frameLength = ReadTagLength(0xfffe, 0xe000)) )
01524    { 
01525       // Parse the RLE Header and store the corresponding RLE Segment
01526       // Offset Table information on fragments of this current Frame.
01527       // Note that the fragment pixels themselves are not loaded
01528       // (but just skipped).
01529       long frameOffset = Fp->tellg();
01530 
01531       uint32_t nbRleSegments = ReadInt32();
01532       if ( nbRleSegments > 16 )
01533       {
01534          // There should be at most 15 segments (refer to RLEFrame class)
01535          gdcmWarningMacro( "Too many segments.");
01536       }
01537  
01538       uint32_t rleSegmentOffsetTable[16];
01539       for( int k = 1; k <= 15; k++ )
01540       {
01541          rleSegmentOffsetTable[k] = ReadInt32();
01542       }
01543 
01544       // Deduce from both the RLE Header and the frameLength the
01545       // fragment length, and again store this info in a
01546       // RLEFramesInfo.
01547       long rleSegmentLength[15];
01548       // skipping (not reading) RLE Segments
01549       if ( nbRleSegments > 1)
01550       {
01551          for(unsigned int k = 1; k <= nbRleSegments-1; k++)
01552          {
01553              rleSegmentLength[k] =  rleSegmentOffsetTable[k+1]
01554                                   - rleSegmentOffsetTable[k];
01555              SkipBytes(rleSegmentLength[k]);
01556           }
01557        }
01558 
01559        rleSegmentLength[nbRleSegments] = frameLength 
01560                                       - rleSegmentOffsetTable[nbRleSegments];
01561        SkipBytes(rleSegmentLength[nbRleSegments]);
01562 
01563        // Store the collected info
01564        RLEFrame *newFrame = new RLEFrame;
01565        newFrame->SetNumberOfFragments(nbRleSegments);
01566        for( unsigned int uk = 1; uk <= nbRleSegments; uk++ )
01567        {
01568           newFrame->SetOffset(uk,frameOffset + rleSegmentOffsetTable[uk]);
01569           newFrame->SetLength(uk,rleSegmentLength[uk]);
01570        }
01571        RLEInfo->AddFrame(newFrame);
01572    }
01573 
01574    // Make sure that at the end of the item we encounter a 'Sequence
01575    // Delimiter Item':
01576    if ( !ReadTag(0xfffe, 0xe0dd) )
01577    {
01578       gdcmWarningMacro( "No sequence delimiter item at end of RLE item sequence");
01579    }
01580 }

BinEntry * gdcm::DocEntrySet::GetBinEntry uint16_t  group,
uint16_t  elem
[inherited]
 

Same as Document::GetDocEntry except it only returns a result when the corresponding entry is of type BinEntry.

Parameters:
group Group number of the searched Dicom Element
elem Element number of the searched Dicom Element
Returns:
When present, the corresponding BinEntry.

Definition at line 127 of file gdcmDocEntrySet.cxx.

References gdcmWarningMacro, and gdcm::DocEntrySet::GetDocEntry().

Referenced by gdcm::DocEntrySet::GetEntryBinArea(), and gdcm::DocEntrySet::SetBinEntry().

00128 {
00129    DocEntry *currentEntry = GetDocEntry(group, elem);
00130    if ( !currentEntry )
00131    {
00132       gdcmWarningMacro( "No corresponding BinEntry " << std::hex << group <<
00133                          "," << elem);
00134       return NULL;
00135    }
00136 
00137    return dynamic_cast<BinEntry*>(currentEntry);
00138 }

int gdcm::File::GetBitsAllocated  ) 
 

Retrieve the number of Bits Allocated (8, 12 -compacted ACR-NEMA files, 16, ...).

Returns:
The encountered number of Bits Allocated, 0 by default. 0 means the file is NOT USABLE. The caller has to check it !

Definition at line 675 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::FileHelper::CheckWriteIntegrity(), File(), gdcm::PixelReadConvert::GrabInformationsFromFile(), gdcm::FileHelper::SetWriteToRaw(), and gdcm::FileHelper::SetWriteToRGB().

00676 {
00677    std::string strSize = GetEntryValue(0x0028,0x0100);
00678    if ( strSize == GDCM_UNFOUND )
00679    {
00680       gdcmWarningMacro( "(0028,0100) is supposed to be mandatory");
00681       return 0; // It's supposed to be mandatory
00682                 // the caller will have to check
00683    }
00684    return atoi( strSize.c_str() );
00685 }

int gdcm::File::GetBitsStored  ) 
 

Retrieve the number of Bits Stored (actually used) (as opposed to number of Bits Allocated).

Returns:
The encountered number of Bits Stored, 0 by default. 0 means the file is NOT USABLE. The caller has to check it !

Definition at line 657 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00658 {
00659    std::string strSize = GetEntryValue( 0x0028, 0x0101 );
00660    if ( strSize == GDCM_UNFOUND )
00661    {
00662       gdcmWarningMacro("(0028,0101) is supposed to be mandatory");
00663       return 0;  // It's supposed to be mandatory
00664                  // the caller will have to check
00665    }
00666    return atoi( strSize.c_str() );
00667 }

DictEntry * gdcm::DocEntrySet::GetDictEntry uint16_t  group,
uint16_t  elem,
TagName const &  vr
[protected, inherited]
 

Searches [both] the public [and the shadow dictionary (when they exist)] for the presence of the DictEntry with given group and element, and create a new virtual DictEntry if necessary.

Parameters:
group group number of the searched DictEntry
elem element number of the searched DictEntry
vr Value Representation to use, if necessary
Returns:
Corresponding DictEntry when it exists, NULL otherwise.

Definition at line 558 of file gdcmDocEntrySet.cxx.

References gdcm::GDCM_UNKNOWN, gdcm::DocEntrySet::GetDictEntry(), gdcm::DictEntry::GetName(), gdcm::DictEntry::GetVR(), gdcm::DocEntrySet::NewVirtualDictEntry(), and gdcm::TagName.

00560 {
00561    DictEntry *dictEntry = GetDictEntry(group,elem);
00562    DictEntry *goodEntry = dictEntry;
00563    std::string goodVR = vr;
00564 
00565    if (elem == 0x0000) goodVR="UL";
00566 
00567    if ( goodEntry )
00568    {
00569       if ( goodVR != goodEntry->GetVR()
00570         && goodVR != GDCM_UNKNOWN )
00571       {
00572          goodEntry = NULL;
00573       }
00574    }
00575 
00576    // Create a new virtual DictEntry if necessary
00577    if (!goodEntry)
00578    {
00579       if (dictEntry)
00580       {
00581          goodEntry = NewVirtualDictEntry(group, elem, goodVR, "FIXME", 
00582                                          dictEntry->GetName() );
00583       }
00584       else
00585       {
00586          goodEntry = NewVirtualDictEntry(group, elem, goodVR);
00587       }
00588    }
00589    return goodEntry;
00590 }

DictEntry * gdcm::DocEntrySet::GetDictEntry uint16_t  group,
uint16_t  elem
[protected, inherited]
 

Searches [both] the public [and the shadow dictionary (when they exist)] for the presence of the DictEntry with given group and element. The public dictionary has precedence on the shadow one.

Parameters:
group group number of the searched DictEntry
elem element number of the searched DictEntry
Returns:
Corresponding DictEntry when it exists, NULL otherwise.

Definition at line 534 of file gdcmDocEntrySet.cxx.

References gdcmWarningMacro, and gdcm::Dict::GetEntry().

Referenced by gdcm::DocEntrySet::GetDictEntry(), gdcm::DocEntrySet::NewBinEntry(), gdcm::DocEntrySet::NewSeqEntry(), gdcm::DocEntrySet::NewValEntry(), and gdcm::Document::ReadNextDocEntry().

00535 {
00536    DictEntry *found = 0;
00537    Dict *pubDict = Global::GetDicts()->GetDefaultPubDict();
00538    if (!pubDict) 
00539    {
00540       gdcmWarningMacro( "We SHOULD have a default dictionary");
00541    }
00542    else
00543    {
00544       found = pubDict->GetEntry(group, elem);  
00545    }
00546    return found;
00547 }

DocEntry * gdcm::ElementSet::GetDocEntry uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

retrieves a Dicom Element using (group, element)

Parameters:
group Group number of the searched Dicom Element
elem Element number of the searched Dicom Element
Returns:

Implements gdcm::DocEntrySet.

Definition at line 172 of file gdcmElementSet.cxx.

References gdcm::ElementSet::TagHT, and gdcm::TagKey.

Referenced by AnonymizeFile(), AnonymizeNoLoad(), gdcm::FileHelper::CopyBinEntry(), gdcm::FileHelper::CopyValEntry(), gdcm::DicomDir::CreateDicomDir(), gdcm::DicomDir::DicomDir(), File(), GetPixelAreaLength(), GetPixelOffset(), gdcm::Document::GetTransferSyntax(), HasLUT(), gdcm::Document::IsDicomV3(), gdcm::Document::IsPapyrus(), IsReadable(), gdcm::Document::LoadEntryBinArea(), gdcm::DocEntryArchive::Push(), gdcm::DocEntryArchive::Restore(), gdcm::FileHelper::SetWriteToLibido(), gdcm::FileHelper::SetWriteToNoLibido(), and Write().

00173 {
00174    TagKey key = DictEntry::TranslateToKey(group, elem);
00175    TagDocEntryHT::iterator it = TagHT.find(key);
00176 
00177    if ( it!=TagHT.end() )
00178       return it->second;
00179    return NULL;
00180 }

void * gdcm::DocEntrySet::GetEntryBinArea uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

Gets (from Header) a 'non string' element value.

Parameters:
group group number of the Entry
elem element number of the Entry
Returns:
Pointer to the 'non string' area

Definition at line 57 of file gdcmDocEntrySet.cxx.

References gdcm::BinEntry::GetBinArea(), and gdcm::DocEntrySet::GetBinEntry().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00058 {
00059    BinEntry *entry = GetBinEntry(group, elem);
00060    if( entry )
00061       return entry->GetBinArea();
00062    return 0;
00063 }

int gdcm::DocEntrySet::GetEntryLength uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

Searches within Header Entries (Dicom Elements) parsed with the public and private dictionaries for the value length of a given tag..

Parameters:
group Group number of the searched tag.
elem Element number of the searched tag.
Returns:
Corresponding element length; -2 if not found

Definition at line 73 of file gdcmDocEntrySet.cxx.

References gdcm::DocEntrySet::GetDocEntry(), and gdcm::DocEntry::GetLength().

Referenced by gdcm::DicomDir::SetElement(), and Write().

00074 {
00075    DocEntry *entry = GetDocEntry(group, elem);
00076    if( entry )
00077       return entry->GetLength();
00078    return -1;
00079 }

std::string gdcm::DocEntrySet::GetEntryValue uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

Get the "std::string representable" value of the Dicom entry.

Parameters:
group Group number of the searched tag.
elem Element number of the searched tag.
Returns:
Corresponding element value when it exists, and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise.

Definition at line 43 of file gdcmDocEntrySet.cxx.

References gdcm::GDCM_UNFOUND, gdcm::DocEntrySet::GetDocEntry(), and gdcm::ContentEntry::GetValue().

Referenced by gdcm::SerieHelper::AddFileName(), AnonymizeFile(), gdcm::Document::Document(), File(), GetBitsAllocated(), GetBitsStored(), GetHighBitPosition(), GetImageNumber(), GetImageOrientationPatient(), GetLUTNbits(), GetModality(), GetNumberOfScalarComponents(), GetPixelType(), GetPlanarConfiguration(), GetRescaleIntercept(), GetRescaleSlope(), GetSamplesPerPixel(), gdcm::Document::GetTransferSyntaxName(), GetXOrigin(), GetXSize(), GetXSpacing(), GetYOrigin(), GetYSize(), GetYSpacing(), GetZOrigin(), GetZSize(), GetZSpacing(), gdcm::PixelReadConvert::GrabInformationsFromFile(), IsMonochrome(), IsPaletteColor(), IsReadable(), IsSignedPixelData(), IsYBRFull(), gdcm::Document::operator<(), gdcm::DicomDir::SetElement(), and Write().

00044 {
00045    ContentEntry *entry = dynamic_cast<ContentEntry *>(GetDocEntry(group,elem));
00046    if( entry )
00047       return entry->GetValue();
00048    return GDCM_UNFOUND;
00049 }

std::string gdcm::DocEntrySet::GetEntryVR uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

Searches within Header Entries (Dicom Elements) parsed with the public [and private dictionaries] for the element value representation of a given tag.. Obtaining the VR (Value Representation) might be needed by caller to convert the string typed content to caller's native type (think of C++ vs Python). The VR is actually of a higher level of semantics than just the native C++ type.

Parameters:
group Group number of the searched tag.
elem Element number of the searched tag.
Returns:
Corresponding element value representation when it exists, and the string GDCM_UNFOUND ("gdcm::Unfound") otherwise.

Definition at line 94 of file gdcmDocEntrySet.cxx.

References gdcm::GDCM_UNFOUND, gdcm::DocEntrySet::GetDocEntry(), and gdcm::DocEntry::GetVR().

00095 {
00096    DocEntry *entry = GetDocEntry(group, elem);
00097    if( entry )
00098       return entry->GetVR();
00099    return GDCM_UNFOUND;
00100 }

const std::string& gdcm::Document::GetFileName  )  const [inline, inherited]
 

Accessor to Filename.

Definition at line 79 of file gdcmDocument.h.

Referenced by gdcm::SerieHelper::FileNameLessThan(), gdcm::DicomDir::ParseDirectory(), and gdcm::DicomDir::SetElement().

00079 { return Filename; }

FileType gdcm::Document::GetFileType  )  [inherited]
 

returns the File Type (ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown)

Returns:
the FileType code

Definition at line 276 of file gdcmDocument.cxx.

References gdcm::Document::Filetype, and gdcm::FileType.

00277 {
00278    return Filetype;
00279 }

DocEntry * gdcm::ElementSet::GetFirstEntry  )  [virtual, inherited]
 

Get the first entry while visiting *the* 'zero level' DocEntrySet (DocEntries out of any Sequence).

Returns:
The first DocEntry if found, otherwhise NULL

Implements gdcm::DocEntrySet.

Definition at line 142 of file gdcmElementSet.cxx.

References gdcm::ElementSet::ItTagHT, and gdcm::ElementSet::TagHT.

Referenced by gdcm::Document::ComputeGroup0002Length(), gdcm::DicomDir::DicomDir(), and gdcm::DicomDir::NewMeta().

00143 {
00144    ItTagHT = TagHT.begin();
00145    if (ItTagHT != TagHT.end())
00146       return  ItTagHT->second;
00147    return NULL;
00148 }

uint16_t gdcm::File::GetGrPixel  )  [inline]
 

Accessor to File::GrPixel.

Definition at line 146 of file gdcmFile.h.

00146 { return GrPixel; }

int gdcm::File::GetHighBitPosition  ) 
 

Retrieve the high bit position.

Warning:
The method defaults to 0 when information is Missing. The responsability of checking this value is left to the caller.
Returns:
The high bit positin when present. 0 when Missing.

Definition at line 693 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00694 {
00695    std::string strSize = GetEntryValue( 0x0028, 0x0102 );
00696    if ( strSize == GDCM_UNFOUND )
00697    {
00698       gdcmWarningMacro( "(0028,0102) is supposed to be mandatory");
00699       return 0;
00700    }
00701    return atoi( strSize.c_str() );
00702 }

int gdcm::File::GetImageNumber  ) 
 

gets the info from 0020,0013 : Image Number else 0.

Returns:
image number

Definition at line 217 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::SerieHelper::ImageNumberLessThan().

00218 {
00219    // The function i atoi() takes the address of an area of memory as
00220    // parameter and converts the string stored at that location to an integer
00221    // using the external decimal to internal binary conversion rules. This may
00222    // be preferable to sscanf() since atoi() is a much smaller, simpler and
00223    // faster function. sscanf() can do all possible conversions whereas
00224    // atoi() can only do single decimal integer conversions.
00225    //0020 0013 IS REL Image Number
00226    std::string strImNumber = GetEntryValue(0x0020,0x0013);
00227    if ( strImNumber != GDCM_UNFOUND )
00228    {
00229       return atoi( strImNumber.c_str() );
00230    }
00231    return 0;   //Hopeless
00232 }

void gdcm::File::GetImageOrientationPatient float  iop[6]  ) 
 

gets the info from 0020,0037 : Image Orientation Patient (needed to organize DICOM files based on their x,y,z position)

Parameters:
iop adress of the (6)float aray to receive values
Returns:
cosines of image orientation patient

Definition at line 624 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

00625 {
00626    std::string strImOriPat;
00627    //iop is supposed to be float[6]
00628    iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0.;
00629 
00630    // 0020 0037 DS REL Image Orientation (Patient)
00631    if ( (strImOriPat = GetEntryValue(0x0020,0x0037)) != GDCM_UNFOUND )
00632    {
00633       if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", 
00634           &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
00635       {
00636          gdcmWarningMacro( "Wrong Image Orientation Patient (0020,0037). Less than 6 values were found." );
00637       }
00638    }
00639    //For ACR-NEMA
00640    // 0020 0035 DS REL Image Orientation (RET)
00641    else if ( (strImOriPat = GetEntryValue(0x0020,0x0035)) != GDCM_UNFOUND )
00642    {
00643       if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f", 
00644           &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
00645       {
00646          gdcmWarningMacro( "wrong Image Orientation Patient (0020,0035). Less than 6 values were found." );
00647       }
00648    }
00649 }

JPEGFragmentsInfo* gdcm::File::GetJPEGInfo  )  [inline]
 

Returns the JPEG Fragments info.

Definition at line 156 of file gdcmFile.h.

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00156 { return JPEGInfo; }

int gdcm::File::GetLUTNbits  ) 
 

gets the info from 0028,1101 : Lookup Table Desc-Red else 0

Returns:
Lookup Table number of Bits , 0 by default when (0028,0004),Photometric Interpretation = [PALETTE COLOR ] @ return bit number of each LUT item

Definition at line 961 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, and gdcm::DocEntrySet::GetEntryValue().

00962 {
00963    std::vector<std::string> tokens;
00964    int lutNbits;
00965 
00966    //Just hope Lookup Table Desc-Red = Lookup Table Desc-Red
00967    //                                = Lookup Table Desc-Blue
00968    // Consistency already checked in GetLUTLength
00969    std::string lutDescription = GetEntryValue(0x0028,0x1101);
00970    if ( lutDescription == GDCM_UNFOUND )
00971    {
00972       return 0;
00973    }
00974 
00975    tokens.clear(); // clean any previous value
00976    Util::Tokenize ( lutDescription, tokens, "\\" );
00977    //LutLength=atoi(tokens[0].c_str());
00978    //LutDepth=atoi(tokens[1].c_str());
00979 
00980    lutNbits = atoi( tokens[2].c_str() );
00981    tokens.clear();
00982 
00983    return lutNbits;
00984 }

ModalityType gdcm::File::GetModality  ) 
 

gets the info from 0008,0060 : Modality

Returns:
Modality Type

Todo:
throw error return value ??? specified <> unknown in our database

Definition at line 238 of file gdcmFile.cxx.

References gdcm::AS, gdcm::AU, gdcm::BI, gdcm::CF, gdcm::CP, gdcm::CR, gdcm::CS, gdcm::CT, gdcm::DD, gdcm::DF, gdcm::DG, gdcm::DM, gdcm::DS, gdcm::DX, gdcm::ECG, gdcm::EPS, gdcm::FA, gdcm::FS, gdcm::GDCM_UNFOUND, gdcm::DocEntrySet::GetEntryValue(), gdcm::HC, gdcm::HD, gdcm::LP, gdcm::LS, gdcm::MA, gdcm::ModalityType, gdcm::MR, gdcm::NM, gdcm::OT, gdcm::PT, gdcm::RF, gdcm::RG, gdcm::RTDOSE, gdcm::RTIMAGE, gdcm::RTPLAN, gdcm::RTSTRUCT, gdcm::SM, gdcm::ST, gdcm::TG, gdcm::Unknow, gdcm::US, gdcm::VF, gdcm::XA, and gdcm::XC.

00239 {
00240    // 0008 0060 CS ID Modality
00241    std::string strModality = GetEntryValue(0x0008,0x0060);
00242    if ( strModality != GDCM_UNFOUND )
00243    {
00244            if ( strModality.find("AU") < strModality.length()) return AU;
00245       else if ( strModality.find("AS") < strModality.length()) return AS;
00246       else if ( strModality.find("BI") < strModality.length()) return BI;
00247       else if ( strModality.find("CF") < strModality.length()) return CF;
00248       else if ( strModality.find("CP") < strModality.length()) return CP;
00249       else if ( strModality.find("CR") < strModality.length()) return CR;
00250       else if ( strModality.find("CT") < strModality.length()) return CT;
00251       else if ( strModality.find("CS") < strModality.length()) return CS;
00252       else if ( strModality.find("DD") < strModality.length()) return DD;
00253       else if ( strModality.find("DF") < strModality.length()) return DF;
00254       else if ( strModality.find("DG") < strModality.length()) return DG;
00255       else if ( strModality.find("DM") < strModality.length()) return DM;
00256       else if ( strModality.find("DS") < strModality.length()) return DS;
00257       else if ( strModality.find("DX") < strModality.length()) return DX;
00258       else if ( strModality.find("ECG") < strModality.length()) return ECG;
00259       else if ( strModality.find("EPS") < strModality.length()) return EPS;
00260       else if ( strModality.find("FA") < strModality.length()) return FA;
00261       else if ( strModality.find("FS") < strModality.length()) return FS;
00262       else if ( strModality.find("HC") < strModality.length()) return HC;
00263       else if ( strModality.find("HD") < strModality.length()) return HD;
00264       else if ( strModality.find("LP") < strModality.length()) return LP;
00265       else if ( strModality.find("LS") < strModality.length()) return LS;
00266       else if ( strModality.find("MA") < strModality.length()) return MA;
00267       else if ( strModality.find("MR") < strModality.length()) return MR;
00268       else if ( strModality.find("NM") < strModality.length()) return NM;
00269       else if ( strModality.find("OT") < strModality.length()) return OT;
00270       else if ( strModality.find("PT") < strModality.length()) return PT;
00271       else if ( strModality.find("RF") < strModality.length()) return RF;
00272       else if ( strModality.find("RG") < strModality.length()) return RG;
00273       else if ( strModality.find("RTDOSE")   < strModality.length()) return RTDOSE;
00274       else if ( strModality.find("RTIMAGE")  < strModality.length()) return RTIMAGE;
00275       else if ( strModality.find("RTPLAN")   < strModality.length()) return RTPLAN;
00276       else if ( strModality.find("RTSTRUCT") < strModality.length()) return RTSTRUCT;
00277       else if ( strModality.find("SM") < strModality.length()) return SM;
00278       else if ( strModality.find("ST") < strModality.length()) return ST;
00279       else if ( strModality.find("TG") < strModality.length()) return TG;
00280       else if ( strModality.find("US") < strModality.length()) return US;
00281       else if ( strModality.find("VF") < strModality.length()) return VF;
00282       else if ( strModality.find("XA") < strModality.length()) return XA;
00283       else if ( strModality.find("XC") < strModality.length()) return XC;
00284 
00285       else
00286       {
00289          return Unknow;
00290       }
00291    }
00292 
00293    return Unknow;
00294 }

DocEntry * gdcm::ElementSet::GetNextEntry  )  [virtual, inherited]
 

Get the next entry while visiting *the* 'zero level' DocEntrySet (DocEntries out of any Sequence).

Note:
: meaningfull only if GetFirstEntry already called
Returns:
The next DocEntry if found, otherwhise NULL

Implements gdcm::DocEntrySet.

Definition at line 156 of file gdcmElementSet.cxx.

References gdcmAssertMacro, gdcm::ElementSet::ItTagHT, and gdcm::ElementSet::TagHT.

Referenced by gdcm::Document::ComputeGroup0002Length().

00157 {
00158    gdcmAssertMacro (ItTagHT != TagHT.end());
00159 
00160    ++ItTagHT;
00161    if (ItTagHT != TagHT.end())
00162       return  ItTagHT->second;
00163    return NULL;
00164 }

int gdcm::File::GetNumberOfScalarComponents  ) 
 

This function is intended to user who doesn't want to have to manage a LUT and expects to get an RBG Pixel image (or a monochrome one ...).

Warning:
to be used with GetImagePixels()
Returns:
1 if Gray level, 3 if Color (RGB, YBR or PALETTE COLOR)

Definition at line 1035 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcm::DocEntrySet::GetEntryValue(), GetSamplesPerPixel(), and HasLUT().

Referenced by vtkGdcmReader::CheckFileCoherence(), gdcm::FileHelper::SetWriteToRaw(), and gdcm::FileHelper::SetWriteToRGB().

01036 {
01037    if ( GetSamplesPerPixel() == 3 )
01038    {
01039       return 3;
01040    }
01041       
01042    // 0028 0100 US IMG Bits Allocated
01043    // (in order no to be messed up by old RGB images)
01044    if ( GetEntryValue(0x0028,0x0100) == "24" )
01045    {
01046       return 3;
01047    }
01048        
01049    std::string strPhotometricInterpretation = GetEntryValue(0x0028,0x0004);
01050 
01051    if ( ( strPhotometricInterpretation == "PALETTE COLOR ") )
01052    {
01053       if ( HasLUT() )// PALETTE COLOR is NOT enough
01054       {
01055          return 3;
01056       }
01057       else
01058       {
01059          return 1;
01060       }
01061    }
01062 
01063    // beware of trailing space at end of string      
01064    // DICOM tags are never of odd length
01065    if ( strPhotometricInterpretation == GDCM_UNFOUND   || 
01066         Util::DicomStringEqual(strPhotometricInterpretation, "MONOCHROME1") ||
01067         Util::DicomStringEqual(strPhotometricInterpretation, "MONOCHROME2") )
01068    {
01069       return 1;
01070    }
01071    else
01072    {
01073       // we assume that *all* kinds of YBR are dealt with
01074       return 3;
01075    }
01076 }

int gdcm::File::GetNumberOfScalarComponentsRaw  ) 
 

This function is intended to user that DOESN'T want to get RGB pixels image when it's stored as a PALETTE COLOR image -the (vtk) user is supposed to know how deal with LUTs -.

Warning:
to be used with GetImagePixelsRaw()
Returns:
1 if Gray level, 3 if Color (RGB or YBR - NOT 'PALETTE COLOR' -)

Definition at line 1085 of file gdcmFile.cxx.

References GetSamplesPerPixel().

Referenced by vtkGdcmReader::CheckFileCoherence().

01086 {
01087    // 0028 0100 US IMG Bits Allocated
01088    // (in order no to be messed up by old RGB images)
01089    if ( File::GetEntryValue(0x0028,0x0100) == "24" )
01090    {
01091       return 3;
01092    }
01093 
01094    // we assume that *all* kinds of YBR are dealt with
01095    return GetSamplesPerPixel();
01096 }

uint16_t gdcm::File::GetNumPixel  )  [inline]
 

Accessor to File::NumPixel.

Definition at line 148 of file gdcmFile.h.

00148 { return NumPixel; }

size_t gdcm::File::GetPixelAreaLength  ) 
 

Recover the pixel area length (in Bytes).

Returns:
Pixel Element Length, as stored in the header (NOT the memory space necessary to hold the Pixels -in case of embeded compressed image-) 0 : NOT USABLE file. The caller has to check.

Definition at line 1125 of file gdcmFile.cxx.

References gdcmDebugMacro, gdcm::ElementSet::GetDocEntry(), gdcm::DocEntry::GetLength(), GrPixel, and NumPixel.

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

01126 {
01127    DocEntry *pxlElement = GetDocEntry(GrPixel, NumPixel);
01128    if ( pxlElement )
01129    {
01130       return pxlElement->GetLength();
01131    }
01132    else
01133    {
01134       gdcmDebugMacro( "Big trouble : Pixel Element ("
01135                       << std::hex << GrPixel<<","<< NumPixel<< ") NOT found" );
01136       return 0;
01137    }
01138 }

size_t gdcm::File::GetPixelOffset  ) 
 

Recover the offset (from the beginning of the file) of *image* pixels (not *icone image* pixels, if any !).

Returns:
Pixel Offset

Definition at line 1103 of file gdcmFile.cxx.

References gdcmDebugMacro, gdcm::ElementSet::GetDocEntry(), gdcm::DocEntry::GetOffset(), GrPixel, and NumPixel.

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

01104 {
01105    DocEntry *pxlElement = GetDocEntry(GrPixel, NumPixel);
01106    if ( pxlElement )
01107    {
01108       return pxlElement->GetOffset();
01109    }
01110    else
01111    {
01112       gdcmDebugMacro( "Big trouble : Pixel Element ("
01113                       << std::hex << GrPixel<<","<< NumPixel<< ") NOT found" );
01114       return 0;
01115    }
01116 }

int gdcm::File::GetPixelSize  ) 
 

Return the size (in bytes) of a single pixel of data.

Returns:
The size in bytes of a single pixel of data; 0 by default 0 means the file is NOT USABLE; the caller will have to check

Definition at line 743 of file gdcmFile.cxx.

References gdcmWarningMacro, and GetPixelType().

Referenced by vtkGdcmReader::CheckFileCoherence(), and gdcm::PixelReadConvert::GrabInformationsFromFile().

00744 {
00745    // 0028 0100 US IMG Bits Allocated
00746    // (in order no to be messed up by old RGB images)
00747    //   if (File::GetEntryValue(0x0028,0x0100) == "24")
00748    //      return 3;
00749 
00750    std::string pixelType = GetPixelType();
00751    if ( pixelType ==  "8U" || pixelType == "8S" )
00752    {
00753       return 1;
00754    }
00755    if ( pixelType == "16U" || pixelType == "16S")
00756    {
00757       return 2;
00758    }
00759    if ( pixelType == "32U" || pixelType == "32S")
00760    {
00761       return 4;
00762    }
00763    if ( pixelType == "FD" )
00764    {
00765       return 8;
00766    }
00767    gdcmWarningMacro( "Unknown pixel type");
00768    return 0;
00769 }

std::string gdcm::File::GetPixelType  ) 
 

Build the Pixel Type of the image. Possible values are: -8U unsigned 8 bit, -8S signed 8 bit, -16U unsigned 16 bit, -16S signed 16 bit, -32U unsigned 32 bit, -32S signed 32 bit, -FD floating double 64 bits (Not kosher DICOM, but so usefull!).

Warning:
12 bit images appear as 16 bit. 24 bit images appear as 8 bit
Returns:
0S if nothing found. NOT USABLE file. The caller has to check

Definition at line 785 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by vtkGdcmReader::CheckFileCoherence(), and GetPixelSize().

00786 {
00787    std::string bitsAlloc = GetEntryValue(0x0028, 0x0100); // Bits Allocated
00788    if ( bitsAlloc == GDCM_UNFOUND )
00789    {
00790       gdcmWarningMacro( "Missing  Bits Allocated (0028,0100)");
00791       bitsAlloc = "16"; // default and arbitrary value, not to polute the output
00792    }
00793 
00794    if ( bitsAlloc == "64" )
00795    {
00796       return "FD";
00797    }
00798    else if ( bitsAlloc == "12" )
00799    {
00800       // It will be unpacked
00801       bitsAlloc = "16";
00802    }
00803    else if ( bitsAlloc == "24" )
00804    {
00805       // (in order no to be messed up
00806       bitsAlloc = "8";  // by old RGB images)
00807    }
00808 
00809    std::string sign = GetEntryValue(0x0028, 0x0103);//"Pixel Representation"
00810 
00811    if (sign == GDCM_UNFOUND )
00812    {
00813       gdcmWarningMacro( "Missing Pixel Representation (0028,0103)");
00814       sign = "U"; // default and arbitrary value, not to polute the output
00815    }
00816    else if ( sign == "0" )
00817    {
00818       sign = "U";
00819    }
00820    else
00821    {
00822       sign = "S";
00823    }
00824    return bitsAlloc + sign;
00825 }

int gdcm::File::GetPlanarConfiguration  ) 
 

Retrieve the Planar Configuration for RGB images (0 : RGB Pixels , 1 : R Plane + G Plane + B Plane).

Returns:
The encountered Planar Configuration, 0 by default.

Definition at line 727 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00728 {
00729    std::string strSize = GetEntryValue(0x0028,0x0006);
00730    if ( strSize == GDCM_UNFOUND )
00731    {
00732       gdcmWarningMacro( "Not found : Planar Configuration (0028,0006)");
00733       return 0;
00734    }
00735    return atoi( strSize.c_str() );
00736 }

int gdcm::Base::GetPrintLevel  )  [inline, inherited]
 

Gets the print level for the Dicom Entries.

Definition at line 48 of file gdcmBase.h.

00048 { return PrintLevel; };

Dict * gdcm::Document::GetPubDict  )  [inherited]
 

Get the public dictionary used.

Definition at line 183 of file gdcmDocument.cxx.

References gdcm::Document::RefPubDict.

Referenced by gdcm::DicomDir::SetElement().

00184 {
00185    return RefPubDict;
00186 }

float gdcm::File::GetRescaleIntercept  ) 
 

gets the info from 0028,1052 : Rescale Intercept

Returns:
Rescale Intercept

0028 1052 DS IMG Rescale Intercept

Definition at line 990 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

00991 {
00992    float resInter = 0.;
00994    const std::string &strRescInter = GetEntryValue(0x0028,0x1052);
00995    if ( strRescInter != GDCM_UNFOUND )
00996    {
00997       if( sscanf( strRescInter.c_str(), "%f", &resInter) != 1 )
00998       {
00999          // bug in the element 0x0028,0x1052
01000          gdcmWarningMacro( "Rescale Intercept (0028,1052) is empty." );
01001       }
01002    }
01003 
01004    return resInter;
01005 }

float gdcm::File::GetRescaleSlope  ) 
 

gets the info from 0028,1053 : Rescale Slope

Returns:
Rescale Slope

Definition at line 1011 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

01012 {
01013    float resSlope = 1.;
01014    //0028 1053 DS IMG Rescale Slope
01015    std::string strRescSlope = GetEntryValue(0x0028,0x1053);
01016    if ( strRescSlope != GDCM_UNFOUND )
01017    {
01018       if( sscanf( strRescSlope.c_str(), "%f", &resSlope) != 1)
01019       {
01020          // bug in the element 0x0028,0x1053
01021          gdcmWarningMacro( "Rescale Slope (0028,1053) is empty.");
01022       }
01023    }
01024 
01025    return resSlope;
01026 }

RLEFramesInfo* gdcm::File::GetRLEInfo  )  [inline]
 

returns the RLE info

Definition at line 154 of file gdcmFile.h.

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00154 { return RLEInfo; }

int gdcm::File::GetSamplesPerPixel  ) 
 

Retrieve the number of Samples Per Pixel (1 : gray level, 3 : RGB -1 or 3 Planes-).

Returns:
The encountered number of Samples Per Pixel, 1 by default. (Gray level Pixels)

Definition at line 710 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::FileHelper::CheckWriteIntegrity(), GetNumberOfScalarComponents(), GetNumberOfScalarComponentsRaw(), and gdcm::PixelReadConvert::GrabInformationsFromFile().

00711 {
00712    const std::string &strSize = GetEntryValue(0x0028,0x0002);
00713    if ( strSize == GDCM_UNFOUND )
00714    {
00715       gdcmWarningMacro( "(0028,0002) is supposed to be mandatory");
00716       return 1; // Well, it's supposed to be mandatory ...
00717                 // but sometimes it's missing : *we* assume Gray pixels
00718    }
00719    return atoi( strSize.c_str() );
00720 }

SeqEntry * gdcm::DocEntrySet::GetSeqEntry uint16_t  group,
uint16_t  elem
[inherited]
 

Same as Document::GetDocEntry except it only returns a result when the corresponding entry is of type SeqEntry.

Parameters:
group Group number of the searched Dicom Element
elem Element number of the searched Dicom Element
Returns:
When present, the corresponding SeqEntry.

Definition at line 148 of file gdcmDocEntrySet.cxx.

References gdcmWarningMacro, and gdcm::DocEntrySet::GetDocEntry().

00149 {
00150    DocEntry *currentEntry = GetDocEntry(group, elem);
00151    if ( !currentEntry )
00152    {
00153       gdcmWarningMacro( "No corresponding SeqEntry " << std::hex << group <<
00154                         "," << elem);
00155       return NULL;
00156    }
00157 
00158    return dynamic_cast<SeqEntry*>(currentEntry);
00159 }

Dict * gdcm::Document::GetShaDict  )  [inherited]
 

Get the shadow dictionary used.

Definition at line 191 of file gdcmDocument.cxx.

References gdcm::Document::RefShaDict.

00192 {
00193    return RefShaDict;
00194 }

int gdcm::Document::GetSwapCode  )  [inline, inherited]
 

'Swap code' accessor (see SwapCode )

Definition at line 66 of file gdcmDocument.h.

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00066 { return SwapCode; }

std::string gdcm::Document::GetTransferSyntax  )  [inherited]
 

Accessor to the Transfer Syntax (when present) of the current document (it internally handles reading the value from disk when only parsing occured).

Returns:
The encountered Transfer Syntax of the current document.

Definition at line 287 of file gdcmDocument.cxx.

References gdcm::GDCM_UNKNOWN, gdcm::ElementSet::GetDocEntry(), gdcm::ContentEntry::GetValue(), and gdcm::Document::LoadDocEntrySafe().

Referenced by ComputeJPEGFragmentInfo(), ComputeRLEInfo(), File(), gdcm::PixelReadConvert::GrabInformationsFromFile(), and gdcm::Document::HandleOutOfGroup0002().

00288 {
00289    DocEntry *entry = GetDocEntry(0x0002, 0x0010);
00290    if ( !entry )
00291    {
00292       return GDCM_UNKNOWN;
00293    }
00294 
00295    // The entry might be present but not loaded (parsing and loading
00296    // happen at different stages): try loading and proceed with check...
00297    LoadDocEntrySafe(entry);
00298    if (ValEntry *valEntry = dynamic_cast< ValEntry* >(entry) )
00299    {
00300       std::string transfer = valEntry->GetValue();
00301       // The actual transfer (as read from disk) might be padded. We
00302       // first need to remove the potential padding. We can make the
00303       // weak assumption that padding was not executed with digits...
00304       if  ( transfer.length() == 0 )
00305       {
00306          // for brain damaged headers
00307          return GDCM_UNKNOWN;
00308       }
00309       while ( !isdigit((unsigned char)transfer[transfer.length()-1]) )
00310       {
00311          transfer.erase(transfer.length()-1, 1);
00312       }
00313       return transfer;
00314    }
00315    return GDCM_UNKNOWN;
00316 }

std::string gdcm::Document::GetTransferSyntaxName  )  [inherited]
 

Accesses the info from 0002,0010 : Transfer Syntax and TS.

Returns:
The full Transfer Syntax Name (as opposed to Transfer Syntax UID)

Definition at line 322 of file gdcmDocument.cxx.

References gdcm::GDCM_NOTLOADED, gdcm::GDCM_UNFOUND, gdcmErrorMacro, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::Document::HandleOutOfGroup0002().

00323 {
00324    // use the TS (TS : Transfer Syntax)
00325    std::string transferSyntax = GetEntryValue(0x0002,0x0010);
00326 
00327    if ( (transferSyntax.find(GDCM_NOTLOADED) < transferSyntax.length()) )
00328    {
00329       gdcmErrorMacro( "Transfer Syntax not loaded. " << std::endl
00330                << "Better you increase MAX_SIZE_LOAD_ELEMENT_VALUE" );
00331       return "Uncompressed ACR-NEMA";
00332    }
00333    if ( transferSyntax == GDCM_UNFOUND )
00334    {
00335       gdcmWarningMacro( "Unfound Transfer Syntax (0002,0010)");
00336       return "Uncompressed ACR-NEMA";
00337    }
00338 
00339    // we do it only when we need it
00340    const TSKey &tsName = Global::GetTS()->GetValue( transferSyntax );
00341 
00342    // Global::GetTS() is a global static you shall never try to delete it!
00343    return tsName;
00344 }

ValEntry * gdcm::DocEntrySet::GetValEntry uint16_t  group,
uint16_t  elem
[inherited]
 

Same as Document::GetDocEntry except it only returns a result when the corresponding entry is of type ValEntry.

Parameters:
group Group number of the searched Dicom Element
elem Element number of the searched Dicom Element
Returns:
When present, the corresponding ValEntry.

Definition at line 110 of file gdcmDocEntrySet.cxx.

References gdcm::DocEntrySet::GetDocEntry().

Referenced by gdcm::DocEntrySet::SetValEntry(), and Write().

00111 {
00112    DocEntry *currentEntry = GetDocEntry(group, elem);
00113    if ( !currentEntry )
00114       return NULL;
00115 
00116    return dynamic_cast<ValEntry*>(currentEntry);
00117 }

float gdcm::File::GetXOrigin  ) 
 

gets the info from 0020,0032 : Image Position Patient else from 0020,0030 : Image Position (RET) else 0.

Returns:
up-left image corner X position

Definition at line 490 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

00491 {
00492    float xImPos, yImPos, zImPos;  
00493    std::string strImPos = GetEntryValue(0x0020,0x0032);
00494 
00495    if ( strImPos == GDCM_UNFOUND )
00496    {
00497       gdcmWarningMacro( "Unfound Image Position Patient (0020,0032)");
00498       strImPos = GetEntryValue(0x0020,0x0030); // For ACR-NEMA images
00499       if ( strImPos == GDCM_UNFOUND )
00500       {
00501          gdcmWarningMacro( "Unfound Image Position (RET) (0020,0030)");
00502          return 0.;
00503       }
00504    }
00505 
00506    if( sscanf( strImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3 )
00507    {
00508       return 0.;
00509    }
00510 
00511    return xImPos;
00512 }

int gdcm::File::GetXSize  ) 
 

Retrieve the number of columns of image.

Returns:
The encountered size when found, 0 by default. 0 means the file is NOT USABLE. The caller will have to check

Definition at line 301 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, and gdcm::DocEntrySet::GetEntryValue().

Referenced by vtkGdcmReader::CheckFileCoherence(), gdcm::FileHelper::CheckWriteIntegrity(), and gdcm::PixelReadConvert::GrabInformationsFromFile().

00302 {
00303    const std::string &strSize = GetEntryValue(0x0028,0x0011);
00304    if ( strSize == GDCM_UNFOUND )
00305    {
00306       return 0;
00307    }
00308 
00309    return atoi( strSize.c_str() );
00310 }

float gdcm::File::GetXSpacing  ) 
 

gets the info from 0028,0030 : Pixel Spacing else 1.0

Returns:
X dimension of a pixel

Definition at line 368 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmAssertMacro, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by vtkGdcmReader::CheckFileCoherence().

00369 {
00370    float xspacing = 1.0;
00371    float yspacing = 1.0;
00372    const std::string &strSpacing = GetEntryValue(0x0028,0x0030);
00373 
00374    if( strSpacing == GDCM_UNFOUND )
00375    {
00376       gdcmWarningMacro( "Unfound Pixel Spacing (0028,0030)" );
00377       return 1.;
00378    }
00379 
00380    int nbValues;
00381    if( ( nbValues = sscanf( strSpacing.c_str(), 
00382          "%f\\%f", &yspacing, &xspacing)) != 2 )
00383    {
00384       // if no values, xspacing is set to 1.0
00385       if( nbValues == 0 )
00386          xspacing = 1.0;
00387       // if single value is found, xspacing is defaulted to yspacing
00388       if( nbValues == 1 )
00389          xspacing = yspacing;
00390 
00391       if ( xspacing == 0.0 )
00392          xspacing = 1.0;
00393 
00394       return xspacing;
00395 
00396    }
00397 
00398    // to avoid troubles with David Clunie's-like images
00399    if ( xspacing == 0. && yspacing == 0.)
00400       return 1.;
00401 
00402    if ( xspacing == 0.)
00403    {
00404       gdcmWarningMacro("gdcmData/CT-MONO2-8-abdo.dcm problem");
00405       // seems to be a bug in the header ...
00406       nbValues = sscanf( strSpacing.c_str(), "%f\\0\\%f", &yspacing, &xspacing);
00407       gdcmAssertMacro( nbValues == 2 );
00408    }
00409 
00410    return xspacing;
00411 }

float gdcm::File::GetYOrigin  ) 
 

gets the info from 0020,0032 : Image Position Patient else from 0020,0030 : Image Position (RET) else 0.

Returns:
up-left image corner Y position

Definition at line 520 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

00521 {
00522    float xImPos, yImPos, zImPos;
00523    std::string strImPos = GetEntryValue(0x0020,0x0032);
00524 
00525    if ( strImPos == GDCM_UNFOUND)
00526    {
00527       gdcmWarningMacro( "Unfound Image Position Patient (0020,0032)");
00528       strImPos = GetEntryValue(0x0020,0x0030); // For ACR-NEMA images
00529       if ( strImPos == GDCM_UNFOUND )
00530       {
00531          gdcmWarningMacro( "Unfound Image Position (RET) (0020,0030)");
00532          return 0.;
00533       }  
00534    }
00535 
00536    if( sscanf( strImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3 )
00537    {
00538       return 0.;
00539    }
00540 
00541    return yImPos;
00542 }

int gdcm::File::GetYSize  ) 
 

Retrieve the number of lines of image.

Warning:
The defaulted value is 1 as opposed to File::GetXSize()
Returns:
The encountered size when found, 1 by default (The ACR-NEMA file contains a Signal, not an Image).

Definition at line 318 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcm::DocEntrySet::GetEntryValue(), and gdcm::Document::IsDicomV3().

Referenced by vtkGdcmReader::CheckFileCoherence(), gdcm::FileHelper::CheckWriteIntegrity(), and gdcm::PixelReadConvert::GrabInformationsFromFile().

00319 {
00320    const std::string &strSize = GetEntryValue(0x0028,0x0010);
00321    if ( strSize != GDCM_UNFOUND )
00322    {
00323       return atoi( strSize.c_str() );
00324    }
00325    if ( IsDicomV3() )
00326    {
00327       return 0;
00328    }
00329 
00330    // The Rows (0028,0010) entry was optional for ACR/NEMA. It might
00331    // hence be a signal (1D image). So we default to 1:
00332    return 1;
00333 }

float gdcm::File::GetYSpacing  ) 
 

gets the info from 0028,0030 : Pixel Spacing else 1.0

Returns:
Y dimension of a pixel

Definition at line 418 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by vtkGdcmReader::CheckFileCoherence().

00419 {
00420    float yspacing = 1.;
00421    std::string strSpacing = GetEntryValue(0x0028,0x0030);
00422   
00423    if ( strSpacing == GDCM_UNFOUND )
00424    {
00425       gdcmWarningMacro("Unfound Pixel Spacing (0028,0030)");
00426       return 1.;
00427     }
00428 
00429    // if sscanf cannot read any float value, it won't affect yspacing
00430    int nbValues = sscanf( strSpacing.c_str(), "%f", &yspacing);
00431 
00432    // if no values, xspacing is set to 1.0
00433    if( nbValues == 0 )
00434       yspacing = 1.0;
00435 
00436    if ( yspacing == 0.0 )
00437       yspacing = 1.0;
00438 
00439    return yspacing;
00440 } 

float gdcm::File::GetZOrigin  ) 
 

gets the info from 0020,0032 : Image Position Patient else from 0020,0030 : Image Position (RET) else from 0020,1041 : Slice Location else from 0020,0050 : Location else 0.

Returns:
up-left image corner Z position

Definition at line 552 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

00553 {
00554    float xImPos, yImPos, zImPos; 
00555    std::string strImPos = GetEntryValue(0x0020,0x0032);
00556 
00557    if ( strImPos != GDCM_UNFOUND )
00558    {
00559       if( sscanf( strImPos.c_str(), "%f\\%f\\%f", &xImPos, &yImPos, &zImPos) != 3)
00560       {
00561          gdcmWarningMacro( "Wrong Image Position Patient (0020,0032)");
00562          return 0.;  // bug in the element 0x0020,0x0032
00563       }
00564       else
00565       {
00566          return zImPos;
00567       }
00568    }
00569 
00570    strImPos = GetEntryValue(0x0020,0x0030); // For ACR-NEMA images
00571    if ( strImPos != GDCM_UNFOUND )
00572    {
00573       if( sscanf( strImPos.c_str(), 
00574           "%f\\%f\\%f", &xImPos, &yImPos, &zImPos ) != 3 )
00575       {
00576          gdcmWarningMacro( "Wrong Image Position (RET) (0020,0030)");
00577          return 0.;  // bug in the element 0x0020,0x0032
00578       }
00579       else
00580       {
00581          return zImPos;
00582       }
00583    }
00584 
00585    std::string strSliceLocation = GetEntryValue(0x0020,0x1041); // for *very* old ACR-NEMA images
00586    if ( strSliceLocation != GDCM_UNFOUND )
00587    {
00588       if( sscanf( strSliceLocation.c_str(), "%f", &zImPos) != 1)
00589       {
00590          gdcmWarningMacro( "Wrong Slice Location (0020,1041)");
00591          return 0.;  // bug in the element 0x0020,0x1041
00592       }
00593       else
00594       {
00595          return zImPos;
00596       }
00597    }
00598    gdcmWarningMacro( "Unfound Slice Location (0020,1041)");
00599 
00600    std::string strLocation = GetEntryValue(0x0020,0x0050);
00601    if ( strLocation != GDCM_UNFOUND )
00602    {
00603       if( sscanf( strLocation.c_str(), "%f", &zImPos) != 1)
00604       {
00605          gdcmWarningMacro( "Wrong Location (0020,0050)");
00606          return 0.;  // bug in the element 0x0020,0x0050
00607       }
00608       else
00609       {
00610          return zImPos;
00611       }
00612    }
00613    gdcmWarningMacro( "Unfound Location (0020,0050)");  
00614 
00615    return 0.; // Hopeless
00616 }

int gdcm::File::GetZSize  ) 
 

Retrieve the number of planes of volume or the number of frames of a multiframe.

Warning:
When present we consider the "Number of Frames" as the third dimension. When Missing we consider the third dimension as being the ACR-NEMA "Planes" tag content.
Returns:
The encountered size when found, 1 by default (single image).

Definition at line 343 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, and gdcm::DocEntrySet::GetEntryValue().

Referenced by vtkGdcmReader::CheckFileCoherence(), gdcm::FileHelper::CheckWriteIntegrity(), and gdcm::PixelReadConvert::GrabInformationsFromFile().

00344 {
00345    // Both  DicomV3 and ACR/Nema consider the "Number of Frames"
00346    // as the third dimension.
00347    const std::string &strSize = GetEntryValue(0x0028,0x0008);
00348    if ( strSize != GDCM_UNFOUND )
00349    {
00350       return atoi( strSize.c_str() );
00351    }
00352 
00353    // We then consider the "Planes" entry as the third dimension 
00354    const std::string &strSize2 = GetEntryValue(0x0028,0x0012);
00355    if ( strSize2 != GDCM_UNFOUND )
00356    {
00357       return atoi( strSize2.c_str() );
00358    }
00359 
00360    return 1;
00361 }

float gdcm::File::GetZSpacing  ) 
 

gets the info from 0018,0088 : Space Between Slices else from 0018,0050 : Slice Thickness else 1.0

Returns:
Z dimension of a voxel-to be

Definition at line 448 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by vtkGdcmReader::CheckFileCoherence().

00449 {
00450    // Spacing Between Slices : distance entre le milieu de chaque coupe
00451    // Les coupes peuvent etre :
00452    //   jointives     (Spacing between Slices = Slice Thickness)
00453    //   chevauchantes (Spacing between Slices < Slice Thickness)
00454    //   disjointes    (Spacing between Slices > Slice Thickness)
00455    // Slice Thickness : epaisseur de tissus sur laquelle est acquis le signal
00456    //   ca interesse le physicien de l'IRM, pas le visualisateur de volumes ...
00457    //   Si le Spacing Between Slices est Missing, 
00458    //   on suppose que les coupes sont jointives
00459    
00460    const std::string &strSpacingBSlices = GetEntryValue(0x0018,0x0088);
00461 
00462    if ( strSpacingBSlices == GDCM_UNFOUND )
00463    {
00464       gdcmWarningMacro("Unfound Spacing Between Slices (0018,0088)");
00465       const std::string &strSliceThickness = GetEntryValue(0x0018,0x0050);       
00466       if ( strSliceThickness == GDCM_UNFOUND )
00467       {
00468          gdcmWarningMacro("Unfound Slice Thickness (0018,0050)");
00469          return 1.;
00470       }
00471       else
00472       {
00473          // if no 'Spacing Between Slices' is found, 
00474          // we assume slices join together
00475          // (no overlapping, no interslice gap)
00476          // if they don't, we're fucked up
00477          return (float)atof( strSliceThickness.c_str() );
00478       }
00479    }
00480    //else
00481    return (float)atof( strSpacingBSlices.c_str() );
00482 }

bool gdcm::File::HasLUT  ) 
 

tells us if LUT are used

Warning:
Right now, 'Segmented xxx Palette Color Lookup Table Data' are NOT considered as LUT, since nobody knows how to deal with them Please warn me if you know sbdy that *does* know ... jprx
Returns:
true if LUT Descriptors and LUT Tables were found

Definition at line 915 of file gdcmFile.cxx.

References gdcm::ElementSet::GetDocEntry().

Referenced by vtkGdcmReader::CheckFileCoherence(), gdcm::FileHelper::CheckWriteIntegrity(), gdcm::FileHelper::GetImageData(), gdcm::FileHelper::GetImageDataIntoVector(), GetNumberOfScalarComponents(), gdcm::PixelReadConvert::GrabInformationsFromFile(), and gdcm::FileHelper::SetWriteToRaw().

00916 {
00917    // Check the presence of the LUT Descriptors, and LUT Tables    
00918    // LutDescriptorRed    
00919    if ( !GetDocEntry(0x0028,0x1101) )
00920    {
00921       return false;
00922    }
00923    // LutDescriptorGreen 
00924    if ( !GetDocEntry(0x0028,0x1102) )
00925    {
00926       return false;
00927    }
00928    // LutDescriptorBlue 
00929    if ( !GetDocEntry(0x0028,0x1103) )
00930    {
00931       return false;
00932    }
00933    // Red Palette Color Lookup Table Data
00934    if ( !GetDocEntry(0x0028,0x1201) )
00935    {
00936       return false;
00937    }
00938    // Green Palette Color Lookup Table Data       
00939    if ( !GetDocEntry(0x0028,0x1202) )
00940    {
00941       return false;
00942    }
00943    // Blue Palette Color Lookup Table Data      
00944    if ( !GetDocEntry(0x0028,0x1203) )
00945    {
00946       return false;
00947    }
00948 
00949    // FIXME : (0x0028,0x3006) : LUT Data (CTX dependent)
00950    //         NOT taken into account, but we don't know how to use it ...   
00951    return true;
00952 }

void gdcm::File::InitializeDefaultFile  )  [protected]
 

Initialize a default DICOM File that should contain all the field require by other reader. DICOM standard does not explicitely defines those fields, heuristic has been choosen. This is not perfect as we are writting a CT image...

Definition at line 1406 of file gdcmFile.cxx.

References GrPixel, gdcm::DocEntrySet::InsertBinEntry(), gdcm::DocEntrySet::InsertValEntry(), and NumPixel.

Referenced by File().

01407 {
01408    std::string date = Util::GetCurrentDate();
01409    std::string time = Util::GetCurrentTime();
01410    std::string uid  = Util::CreateUniqueUID();
01411    std::string uidMedia = uid;
01412    std::string uidInst  = uid;
01413    std::string uidClass = Util::CreateUniqueUID();
01414    std::string uidStudy = Util::CreateUniqueUID();
01415    std::string uidSerie = Util::CreateUniqueUID();
01416 
01417    // Meta Element Group Length
01418    InsertValEntry("146 ",                      0x0002, 0x0000);
01419    // Media Storage SOP Class UID (CT Image Storage)
01420    InsertValEntry("1.2.840.10008.5.1.4.1.1.2", 0x0002, 0x0002);
01421    // Media Storage SOP Instance UID
01422    InsertValEntry(uidMedia.c_str(),            0x0002, 0x0003);
01423    // Transfer Syntax UID (Explicit VR Little Endian)
01424    InsertValEntry("1.2.840.10008.1.2.1 ",      0x0002, 0x0010);
01425    // META Implementation Class UID
01426    InsertValEntry(uidClass.c_str(),            0x0002, 0x0012);
01427    // Source Application Entity Title
01428    InsertValEntry("GDCM",                      0x0002, 0x0016);
01429 
01430    // Instance Creation Date
01431    InsertValEntry(date.c_str(),                0x0008, 0x0012);
01432    // Instance Creation Time
01433    InsertValEntry(time.c_str(),                0x0008, 0x0013);
01434    // SOP Class UID
01435    InsertValEntry("1.2.840.10008.5.1.4.1.1.2", 0x0008, 0x0016);
01436    // SOP Instance UID
01437    InsertValEntry(uidInst.c_str(),             0x0008, 0x0018);
01438    // Modality    
01439    InsertValEntry("CT",                        0x0008, 0x0060);
01440    // Manufacturer
01441    InsertValEntry("GDCM",                      0x0008, 0x0070);
01442    // Institution Name
01443    InsertValEntry("GDCM",                      0x0008, 0x0080);
01444    // Institution Address
01445    InsertValEntry("http://www-creatis.insa-lyon.fr/Public/Gdcm", 0x0008, 0x0081);
01446 
01447    // Patient's Name
01448    InsertValEntry("GDCM",                      0x0010, 0x0010);
01449    // Patient ID
01450    InsertValEntry("GDCMID",                    0x0010, 0x0020);
01451 
01452    // Study Instance UID
01453    InsertValEntry(uidStudy.c_str(),            0x0020, 0x000d);
01454    // Series Instance UID
01455    InsertValEntry(uidSerie.c_str(),            0x0020, 0x000e);
01456    // StudyID
01457    InsertValEntry("1",                         0x0020, 0x0010);
01458    // SeriesNumber
01459    InsertValEntry("1",                         0x0020, 0x0011);
01460 
01461    // Samples per pixel 1 or 3
01462    InsertValEntry("1",                         0x0028, 0x0002);
01463    // photochromatic interpretation
01464    InsertValEntry("MONOCHROME1",               0x0028, 0x0004);
01465    // nbRows
01466    InsertValEntry("0",                         0x0028, 0x0010);
01467    // nbCols
01468    InsertValEntry("0",                         0x0028, 0x0011);
01469    // BitsAllocated 8 or 12 or 16
01470    InsertValEntry("8",                         0x0028, 0x0100);
01471    // BitsStored    <= BitsAllocated
01472    InsertValEntry("8",                         0x0028, 0x0101);
01473    // HighBit       <= BitsAllocated - 1
01474    InsertValEntry("7",                         0x0028, 0x0102);
01475    // Pixel Representation 0(unsigned) or 1(signed)
01476    InsertValEntry("0",                         0x0028, 0x0103);
01477 
01478    // default value
01479    // Special case this is the image (not a string)
01480    GrPixel = 0x7fe0;
01481    NumPixel = 0x0010;
01482    InsertBinEntry(0, 0, GrPixel, NumPixel);
01483 }

BinEntry * gdcm::DocEntrySet::InsertBinEntry uint8_t *  binArea,
int  lgth,
uint16_t  group,
uint16_t  elem,
TagName const &  vr = GDCM_UNKNOWN
[inherited]
 

Modifies the value of a given Header Entry (Dicom Element) when it exists. Create it with the given value when unexistant. A copy of the binArea is made to be kept in the Document.

Parameters:
binArea (binary) value to be set
lgth length of the Bin Area we want to set
group Group number of the Entry
elem Element number of the Entry
vr V(alue) R(epresentation) of the Entry -if private Entry-
Returns:
pointer to the modified/created Header Entry (NULL when creation failed).

Definition at line 309 of file gdcmDocEntrySet.cxx.

References gdcm::DocEntrySet::AddEntry(), gdcmWarningMacro, gdcm::DocEntrySet::GetDocEntry(), gdcm::DocEntry::GetVR(), gdcm::DocEntrySet::NewBinEntry(), gdcm::DocEntrySet::RemoveEntry(), gdcm::DocEntrySet::SetBinEntry(), and gdcm::TagName.

Referenced by InitializeDefaultFile(), and gdcm::FileHelper::InsertBinEntry().

00312 {
00313    BinEntry *binEntry = 0;
00314    DocEntry *currentEntry = GetDocEntry( group, elem );
00315 
00316    // Verify the currentEntry
00317    if (currentEntry)
00318    {
00319       binEntry = dynamic_cast<BinEntry *>(currentEntry);
00320 
00321       // Verify the VR
00322       if( binEntry )
00323          if( binEntry->GetVR()!=vr )
00324             binEntry = NULL;
00325 
00326       // if currentEntry doesn't correspond to the requested valEntry
00327       if( !binEntry)
00328       {
00329          if( !RemoveEntry(currentEntry) )
00330          {
00331             gdcmWarningMacro( "Removal of previous DocEntry failed.");
00332 
00333             return NULL;
00334          }
00335       }
00336    }
00337 
00338    // Create a new binEntry if necessary
00339    if( !binEntry)
00340    {
00341       binEntry = NewBinEntry(group, elem, vr);
00342 
00343       if ( !AddEntry(binEntry) )
00344       {
00345          gdcmWarningMacro( "AddEntry failed allthough this is a creation.");
00346 
00347          delete binEntry;
00348          return NULL;
00349       }
00350    }
00351 
00352    // Set the binEntry value
00353    uint8_t *tmpArea;
00354    if( lgth>0 && binArea )
00355    {
00356       tmpArea = new uint8_t[lgth];
00357       memcpy(tmpArea,binArea,lgth);
00358    }
00359    else
00360    {
00361       tmpArea = 0;
00362    }
00363    if( !SetBinEntry(tmpArea,lgth,binEntry) )
00364    {
00365       if( tmpArea )
00366       {
00367          delete[] tmpArea;
00368       }
00369    }
00370 
00371    return binEntry;
00372 }  

SeqEntry * gdcm::DocEntrySet::InsertSeqEntry uint16_t  group,
uint16_t  elem
[inherited]
 

Modifies the value of a given Doc Entry (Dicom Element) when it exists. Creates it when unexistant.

Parameters:
group Group number of the Entry
elem Element number of the Entry
Returns:
pointer to the modified/created SeqEntry (NULL when creation failed).

Definition at line 382 of file gdcmDocEntrySet.cxx.

References gdcm::DocEntrySet::AddEntry(), gdcmWarningMacro, gdcm::DocEntrySet::GetDocEntry(), gdcm::DocEntrySet::NewSeqEntry(), and gdcm::DocEntrySet::RemoveEntry().

Referenced by gdcm::FileHelper::InsertSeqEntry().

00383 {
00384    SeqEntry *seqEntry = 0;
00385    DocEntry *currentEntry = GetDocEntry( group, elem );
00386 
00387    // Verify the currentEntry
00388    if( currentEntry )
00389    {
00390       seqEntry = dynamic_cast<SeqEntry *>(currentEntry);
00391 
00392       // Verify the VR
00393       if( seqEntry )
00394          seqEntry = NULL;
00395 
00396       // if currentEntry doesn't correspond to the requested seqEntry
00397       if( !seqEntry )
00398       {
00399          if (!RemoveEntry(currentEntry))
00400          {
00401             gdcmWarningMacro( "Removal of previous DocEntry failed.");
00402 
00403             return NULL;
00404          }
00405       }
00406    }
00407    // Create a new seqEntry if necessary
00408    if( !seqEntry )
00409    {
00410       seqEntry = NewSeqEntry(group, elem);
00411 
00412       if( !AddEntry(seqEntry) )
00413       {
00414          gdcmWarningMacro( "AddEntry failed allthough this is a creation.");
00415 
00416          delete seqEntry;
00417          return NULL;
00418       }
00419    }
00420 
00421    // TODO : Find a trick to insert a SequenceDelimitationItem 
00422         //       in the SeqEntry, at the end.
00423    return seqEntry;
00424 } 

ValEntry * gdcm::DocEntrySet::InsertValEntry std::string const &  value,
uint16_t  group,
uint16_t  elem,
TagName const &  vr = GDCM_UNKNOWN
[inherited]
 

Modifies the value of a given Doc Entry (Dicom Element) when it exists. Create it with the given value when unexistant.

Parameters:
value (string) Value to be set
group Group number of the Entry
elem Element number of the Entry
vr V(alue) R(epresentation) of the Entry -if private Entry-
Returns:
pointer to the modified/created Header Entry (NULL when creation failed).

Definition at line 250 of file gdcmDocEntrySet.cxx.

References gdcm::DocEntrySet::AddEntry(), gdcmWarningMacro, gdcm::DocEntrySet::GetDocEntry(), gdcm::DocEntry::GetVR(), gdcm::DocEntrySet::NewValEntry(), gdcm::DocEntrySet::RemoveEntry(), gdcm::DocEntrySet::SetValEntry(), and gdcm::TagName.

Referenced by InitializeDefaultFile(), gdcm::FileHelper::InsertValEntry(), and Write().

00253 {
00254    ValEntry *valEntry = 0;
00255    DocEntry *currentEntry = GetDocEntry( group, elem );
00256    
00257    if (currentEntry)
00258    {
00259       valEntry = dynamic_cast<ValEntry *>(currentEntry);
00260 
00261       // Verify the VR
00262       if( valEntry )
00263          if( valEntry->GetVR()!=vr )
00264             valEntry = NULL;
00265 
00266       // if currentEntry doesn't correspond to the requested valEntry
00267       if( !valEntry)
00268       {
00269          if( !RemoveEntry(currentEntry) )
00270          {
00271             gdcmWarningMacro( "Removal of previous DocEntry failed.");
00272 
00273             return NULL;
00274          }
00275       }
00276    }
00277 
00278    // Create a new valEntry if necessary
00279    if( !valEntry )
00280    {
00281       valEntry = NewValEntry( group, elem, vr );
00282 
00283       if ( !AddEntry(valEntry) )
00284       {
00285          gdcmWarningMacro("AddEntry failed although this is a creation.");
00286 
00287          delete valEntry;
00288          return NULL;
00289       }
00290    }
00291 
00292    // Set the binEntry value
00293    SetValEntry(value, valEntry); // The std::string value
00294    return valEntry;
00295 }

bool gdcm::Document::IsDicomV3  )  [inherited]
 

Predicate for dicom version 3 file.

Returns:
True when the file is a dicom version 3.

Definition at line 245 of file gdcmDocument.cxx.

References gdcm::ElementSet::GetDocEntry().

Referenced by GetYSize(), and gdcm::PixelReadConvert::GrabInformationsFromFile().

00246 {
00247    // Checking if Transfer Syntax exists is enough
00248    // Anyway, it's to late check if the 'Preamble' was found ...
00249    // And ... would it be a rich idea to check ?
00250    // (some 'no Preamble' DICOM images exist !)
00251    return GetDocEntry(0x0002, 0x0010) != NULL;
00252 }

bool gdcm::ElementSet::IsEmpty  )  [inline, virtual, inherited]
 

Tells us if the ElementSet contains no entry.

Implements gdcm::DocEntrySet.

Definition at line 63 of file gdcmElementSet.h.

Referenced by gdcm::Document::IsReadable().

00063 { return TagHT.empty(); };

bool gdcm::File::IsMonochrome  ) 
 

Check whether this a monochrome picture or not by accessing the "Photometric Interpretation" tag ( 0x0028, 0x0004 ).

Returns:
true when "MONOCHROME1" or "MONOCHROME2". False otherwise.

Definition at line 854 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00855 {
00856    const std::string &PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
00857    if (  Util::DicomStringEqual(PhotometricInterp, "MONOCHROME1")
00858       || Util::DicomStringEqual(PhotometricInterp, "MONOCHROME2") )
00859    {
00860       return true;
00861    }
00862    if ( PhotometricInterp == GDCM_UNFOUND )
00863    {
00864       gdcmWarningMacro( "Not found : Photometric Interpretation (0028,0004)");
00865    }
00866    return false;
00867 }

bool gdcm::File::IsPaletteColor  ) 
 

Check whether this a "PALETTE COLOR" picture or not by accessing the "Photometric Interpretation" tag ( 0x0028, 0x0004 ).

Returns:
true when "PALETTE COLOR". False otherwise.

Definition at line 874 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00875 {
00876    std::string PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
00877    if (   PhotometricInterp == "PALETTE COLOR " )
00878    {
00879       return true;
00880    }
00881    if ( PhotometricInterp == GDCM_UNFOUND )
00882    {
00883       gdcmWarningMacro( "Not found : Palette color (0028,0004)");
00884    }
00885    return false;
00886 }

bool gdcm::Document::IsPapyrus  )  [inherited]
 

Predicate for Papyrus file Dedicated to whomsoever it may concern.

Returns:
True when the file is a Papyrus file.

Definition at line 259 of file gdcmDocument.cxx.

References gdcm::ElementSet::GetDocEntry().

00260 {
00261    // check for Papyrus private Sequence
00262    DocEntry *e = GetDocEntry(0x0041, 0x1050);
00263    if ( !e )
00264       return false;
00265    // check if it's actually a Sequence
00266    if ( !dynamic_cast<SeqEntry*>(e) )
00267       return  false;
00268    return true;
00269 }

bool gdcm::File::IsReadable  )  [virtual]
 

This predicate, based on hopefully reasonable heuristics, decides whether or not the current File was properly parsed and contains the mandatory information for being considered as a well formed and usable Dicom/Acr File.

Returns:
true when File is the one of a reasonable Dicom/Acr file, false otherwise.

Reimplemented from gdcm::Document.

Definition at line 181 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcm::ElementSet::GetDocEntry(), and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::SerieHelper::AddFileName(), vtkGdcmReader::CheckFileCoherence(), gdcm::DicomDir::CreateDicomDirChainedList(), and gdcm::FileHelper::Initialize().

00182 {
00183    if( !Document::IsReadable() )
00184    {
00185       return false;
00186    }
00187 
00188    const std::string &res = GetEntryValue(0x0028, 0x0005);
00189    if ( res != GDCM_UNFOUND && atoi(res.c_str()) > 4 )
00190    {
00191       return false; // Image Dimensions
00192    }
00193    if ( !GetDocEntry(0x0028, 0x0100) )
00194    {
00195       return false; // "Bits Allocated"
00196    }
00197    if ( !GetDocEntry(0x0028, 0x0101) )
00198    {
00199       return false; // "Bits Stored"
00200    }
00201    if ( !GetDocEntry(0x0028, 0x0102) )
00202    {
00203       return false; // "High Bit"
00204    }
00205    if ( !GetDocEntry(0x0028, 0x0103) )
00206    {
00207       return false; // "Pixel Representation" i.e. 'Sign'
00208    }
00209 
00210    return true;
00211 }

bool gdcm::File::IsSignedPixelData  ) 
 

Check whether the pixels are signed or UNsigned data.

Warning:
The method defaults to false (UNsigned) when information is Missing. The responsability of checking this value is left to the caller.
Returns:
True when signed, false when UNsigned

Definition at line 833 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00834 {
00835    std::string strSize = GetEntryValue( 0x0028, 0x0103 );
00836    if ( strSize == GDCM_UNFOUND )
00837    {
00838       gdcmWarningMacro( "(0028,0103) is supposed to be mandatory");
00839       return false;
00840    }
00841    int sign = atoi( strSize.c_str() );
00842    if ( sign == 0 ) 
00843    {
00844       return false;
00845    }
00846    return true;
00847 }

bool gdcm::File::IsYBRFull  ) 
 

Check whether this a "YBR_FULL" color picture or not by accessing the "Photometric Interpretation" tag ( 0x0028, 0x0004 ).

Returns:
true when "YBR_FULL". False otherwise.

Definition at line 893 of file gdcmFile.cxx.

References gdcm::GDCM_UNFOUND, gdcmWarningMacro, and gdcm::DocEntrySet::GetEntryValue().

Referenced by gdcm::PixelReadConvert::GrabInformationsFromFile().

00894 {
00895    std::string PhotometricInterp = GetEntryValue( 0x0028, 0x0004 );
00896    if (   PhotometricInterp == "YBR_FULL" )
00897    {
00898       return true;
00899    }
00900    if ( PhotometricInterp == GDCM_UNFOUND )
00901    {
00902       gdcmWarningMacro( "Not found : YBR Full (0028,0004)");
00903    }
00904    return false;
00905 }

void gdcm::Document::LoadDocEntrySafe DocEntry entry  )  [inherited]
 

Loads the element while preserving the current underlying file position indicator as opposed to LoadDocEntry that modifies it.

Parameters:
entry DocEntry whose value will be loaded.

Definition at line 581 of file gdcmDocument.cxx.

References gdcm::Document::Fp, and gdcm::Document::LoadDocEntry().

Referenced by gdcm::Document::GetTransferSyntax().

00582 {
00583    if(Fp)
00584    {
00585       long PositionOnEntry = Fp->tellg();
00586       LoadDocEntry(entry);
00587       Fp->seekg(PositionOnEntry, std::ios::beg);
00588    }
00589 }

void gdcm::Document::LoadEntryBinArea BinEntry elem  )  [virtual, inherited]
 

Loads (from disk) the element content when a string is not suitable.

Parameters:
elem Entry whose binArea is going to be loaded

Todo:
check the result

Definition at line 541 of file gdcmDocument.cxx.

References gdcm::Document::CloseFile(), gdcm::Document::Fp, gdcmWarningMacro, gdcm::BinEntry::GetBinArea(), gdcm::DocEntry::GetLength(), gdcm::DocEntry::GetOffset(), gdcm::Document::OpenFile(), and gdcm::BinEntry::SetBinArea().

00542 {
00543    if(elem->GetBinArea())
00544       return;
00545 
00546    bool openFile = !Fp;
00547    if(openFile)
00548       OpenFile();
00549 
00550    size_t o =(size_t)elem->GetOffset();
00551    Fp->seekg(o, std::ios::beg);
00552 
00553    size_t l = elem->GetLength();
00554    uint8_t *a = new uint8_t[l];
00555    if( !a )
00556    {
00557       gdcmWarningMacro( "Cannot allocate BinEntry content");
00558       return;
00559    }
00560 
00562    Fp->read((char*)a, l);
00563    if( Fp->fail() || Fp->eof())
00564    {
00565       delete[] a;
00566       return;
00567    }
00568 
00569    elem->SetBinArea(a);
00570 
00571    if(openFile)
00572       CloseFile();
00573 }

void gdcm::Document::LoadEntryBinArea uint16_t  group,
uint16_t  elem
[virtual, inherited]
 

Loads (from disk) the element content when a string is not suitable.

Parameters:
group group number of the Entry
elem element number of the Entry

Definition at line 522 of file gdcmDocument.cxx.

References gdcm::ElementSet::GetDocEntry().

Referenced by gdcm::Document::Document(), gdcm::PixelReadConvert::GrabInformationsFromFile(), and gdcm::Document::LoadDocEntry().

00523 {
00524    // Search the corresponding DocEntry
00525    DocEntry *docElement = GetDocEntry(group, elem);
00526    if ( !docElement )
00527       return;
00528 
00529    BinEntry *binElement = dynamic_cast<BinEntry *>(docElement);
00530    if( !binElement )
00531       return;
00532 
00533    LoadEntryBinArea(binElement);
00534 }

BinEntry * gdcm::DocEntrySet::NewBinEntry uint16_t  group,
uint16_t  elem,
TagName const &  vr = GDCM_UNKNOWN
[inherited]
 

Build a new Bin Entry from all the low level arguments. Check for existence of dictionary entry, and build a default one when absent.

Parameters:
group group number of the new Entry
elem element number of the new Entry
vr VR of the new Entry

Definition at line 471 of file gdcmDocEntrySet.cxx.

References gdcmAssertMacro, gdcmWarningMacro, gdcm::DocEntrySet::GetDictEntry(), and gdcm::TagName.

Referenced by gdcm::FileHelper::CopyBinEntry(), gdcm::DocEntrySet::InsertBinEntry(), and gdcm::Document::ReadNextDocEntry().

00473 {
00474    DictEntry *dictEntry = GetDictEntry(group, elem, vr);
00475    gdcmAssertMacro(dictEntry);
00476 
00477    BinEntry *newEntry = new BinEntry(dictEntry);
00478    if (!newEntry) 
00479    {
00480       gdcmWarningMacro( "Failed to allocate BinEntry");
00481       return 0;
00482    }
00483    return newEntry;
00484 }

SeqEntry * gdcm::DocEntrySet::NewSeqEntry uint16_t  group,
uint16_t  elem
[inherited]
 

Build a new Seq Entry from all the low level arguments. Check for existence of dictionary entry, and build a default one when absent.

Parameters:
group group number of the new Entry
elem element number of the new Entry

Definition at line 493 of file gdcmDocEntrySet.cxx.

References gdcmAssertMacro, gdcmWarningMacro, and gdcm::DocEntrySet::GetDictEntry().

Referenced by gdcm::DocEntrySet::InsertSeqEntry(), and gdcm::Document::ReadNextDocEntry().

00494 {
00495    DictEntry *dictEntry = GetDictEntry(group, elem, "SQ");
00496    gdcmAssertMacro(dictEntry);
00497 
00498    SeqEntry *newEntry = new SeqEntry( dictEntry );
00499    if (!newEntry)
00500    {
00501       gdcmWarningMacro( "Failed to allocate SeqEntry");
00502       return 0;
00503    }
00504    return newEntry;
00505 }

ValEntry * gdcm::DocEntrySet::NewValEntry uint16_t  group,
uint16_t  elem,
TagName const &  vr = GDCM_UNKNOWN
[inherited]
 

Build a new Val Entry from all the low level arguments. Check for existence of dictionary entry, and build a default one when absent.

Parameters:
group group number of the new Entry
elem element number of the new Entry
vr VR of the new Entry

Definition at line 447 of file gdcmDocEntrySet.cxx.

References gdcmAssertMacro, gdcmWarningMacro, gdcm::DocEntrySet::GetDictEntry(), and gdcm::TagName.

Referenced by gdcm::FileHelper::CopyValEntry(), gdcm::DocEntrySet::InsertValEntry(), and gdcm::Document::ReadNextDocEntry().

00449 {
00450    DictEntry *dictEntry = GetDictEntry(group, elem, vr);
00451    gdcmAssertMacro(dictEntry);
00452 
00453    ValEntry *newEntry = new ValEntry(dictEntry);
00454    if (!newEntry) 
00455    {
00456       gdcmWarningMacro( "Failed to allocate ValEntry");
00457       return 0;
00458    }
00459    return newEntry;
00460 }

DictEntry * gdcm::DocEntrySet::NewVirtualDictEntry uint16_t  group,
uint16_t  elem,
TagName const &  vr = GDCM_UNKNOWN,
TagName const &  vm = GDCM_UNKNOWN,
TagName const &  name = GDCM_UNKNOWN
[inherited]
 

Request a new virtual dict entry to the dict set.

Parameters:
group group number of the underlying DictEntry
elem element number of the underlying DictEntry
vr VR (Value Representation) of the underlying DictEntry
vm VM (Value Multiplicity) of the underlying DictEntry
name english name

Definition at line 515 of file gdcmDocEntrySet.cxx.

References gdcm::TagName.

Referenced by File(), and gdcm::DocEntrySet::GetDictEntry().

00519 {
00520    return Global::GetDicts()->NewVirtualDictEntry(group,elem,vr,vm,name);
00521 }

std::ifstream * gdcm::Document::OpenFile  )  [inherited]
 

Tries to open the file Document::Filename and checks the preamble when existing.

Returns:
The FILE pointer on success.

Definition at line 395 of file gdcmDocument.cxx.

References gdcm::Document::CloseFile(), gdcm::Document::Fp, gdcmDebugMacro, gdcmWarningMacro, and gdcm::Document::HasDCMPreamble.

Referenced by gdcm::Document::Document(), File(), gdcm::FileHelper::GetRaw(), and gdcm::Document::LoadEntryBinArea().

00396 {
00397    HasDCMPreamble = false;
00398    if (Filename.length() == 0) 
00399    {
00400       return 0;
00401    }
00402 
00403    if(Fp)
00404    {
00405       gdcmWarningMacro( "File already open: " << Filename.c_str());
00406       CloseFile();
00407    }
00408 
00409    Fp = new std::ifstream(Filename.c_str(), std::ios::in | std::ios::binary);
00410    if( ! *Fp )
00411    {
00412       gdcmDebugMacro( "Cannot open file: " << Filename.c_str());
00413       delete Fp;
00414       Fp = 0;
00415       return 0;
00416    }
00417  
00418    uint16_t zero = 0;
00419    Fp->read((char*)&zero, (size_t)2);
00420    if( Fp->eof() )
00421    {
00422       CloseFile();
00423       return 0;
00424    }
00425  
00426    //ACR -- or DICOM with no Preamble; may start with a Shadow Group --
00427    if( 
00428        zero == 0x0001 || zero == 0x0100 || zero == 0x0002 || zero == 0x0200 ||
00429        zero == 0x0003 || zero == 0x0300 || zero == 0x0004 || zero == 0x0400 ||
00430        zero == 0x0005 || zero == 0x0500 || zero == 0x0006 || zero == 0x0600 ||
00431        zero == 0x0007 || zero == 0x0700 || zero == 0x0008 || zero == 0x0800 )
00432    {
00433       std::string msg 
00434          = Util::Format("ACR/DICOM with no preamble: (%04x)\n", zero);
00435       gdcmWarningMacro( msg.c_str() );
00436       return Fp;
00437    }
00438  
00439    //DICOM
00440    Fp->seekg(126L, std::ios::cur);
00441    char dicm[4] = {' ',' ',' ',' '};
00442    Fp->read(dicm,  (size_t)4);
00443    if( Fp->eof() )
00444    {
00445       CloseFile();
00446       return 0;
00447    }
00448    if( memcmp(dicm, "DICM", 4) == 0 )
00449    {
00450       HasDCMPreamble = true;
00451       return Fp;
00452    }
00453  
00454    CloseFile();
00455    gdcmWarningMacro( "Not DICOM/ACR (missing preamble)" << Filename.c_str());
00456  
00457    return 0;
00458 }

bool gdcm::Document::operator< Document document  )  [inherited]
 

Compares two documents, according to DicomDir rules.

Warning:
Does NOT work with ACR-NEMA files
Todo:
Find a trick to solve the pb (use RET fields ?)
Parameters:
document to compare with current one
Returns:
true if 'smaller'

Definition at line 598 of file gdcmDocument.cxx.

References gdcm::DocEntrySet::GetEntryValue().

00599 {
00600    // Patient Name
00601    std::string s1 = GetEntryValue(0x0010,0x0010);
00602    std::string s2 = document.GetEntryValue(0x0010,0x0010);
00603    if(s1 < s2)
00604    {
00605       return true;
00606    }
00607    else if( s1 > s2 )
00608    {
00609       return false;
00610    }
00611    else
00612    {
00613       // Patient ID
00614       s1 = GetEntryValue(0x0010,0x0020);
00615       s2 = document.GetEntryValue(0x0010,0x0020);
00616       if ( s1 < s2 )
00617       {
00618          return true;
00619       }
00620       else if ( s1 > s2 )
00621       {
00622          return false;
00623       }
00624       else
00625       {
00626          // Study Instance UID
00627          s1 = GetEntryValue(0x0020,0x000d);
00628          s2 = document.GetEntryValue(0x0020,0x000d);
00629          if ( s1 < s2 )
00630          {
00631             return true;
00632          }
00633          else if( s1 > s2 )
00634          {
00635             return false;
00636          }
00637          else
00638          {
00639             // Serie Instance UID
00640             s1 = GetEntryValue(0x0020,0x000e);
00641             s2 = document.GetEntryValue(0x0020,0x000e);    
00642             if ( s1 < s2 )
00643             {
00644                return true;
00645             }
00646             else if( s1 > s2 )
00647             {
00648                return false;
00649             }
00650          }
00651       }
00652    }
00653    return false;
00654 }

void gdcm::ElementSet::Print std::ostream &  os = std::cout,
std::string const &  indent = ""
[virtual, inherited]
 

Prints the Header Entries (Dicom Elements) from the H Table.

Parameters:
os ostream to write to
indent Indentation string to be prepended during printing

Reimplemented from gdcm::Base.

Reimplemented in gdcm::DicomDir.

Definition at line 195 of file gdcmElementSet.cxx.

References gdcm::DocEntry::Print(), gdcm::Base::SetPrintLevel(), and gdcm::ElementSet::TagHT.

Referenced by gdcm::FileHelper::Print().

00196 {
00197    for( TagDocEntryHT::const_iterator i = TagHT.begin(); i != TagHT.end(); ++i)
00198    {
00199       DocEntry *entry = i->second;
00200 
00201       entry->SetPrintLevel(PrintLevel);
00202       entry->Print(os);   
00203 
00204       if ( dynamic_cast<SeqEntry*>(entry) )
00205       {
00206          // Avoid the newline for a sequence:
00207          continue;
00208       }
00209       os << std::endl;
00210    }
00211 }

void gdcm::File::ReadAndSkipEncapsulatedBasicOffsetTable  )  [private]
 

When parsing the Pixel Data of an encapsulated file, read the basic offset table (when present, and BTW dump it).

Definition at line 1708 of file gdcmFile.cxx.

References gdcmWarningMacro, ReadTagLength(), and str2num.

Referenced by ComputeJPEGFragmentInfo(), and ComputeRLEInfo().

01709 {
01711    uint32_t itemLength = ReadTagLength(0xfffe, 0xe000);
01712 
01713    // When present, read the basic offset table itself.
01714    // Notes: - since the presence of this basic offset table is optional
01715    //          we can't rely on it for the implementation, and we will simply
01716    //          trash it's content (when present).
01717    //        - still, when present, we could add some further checks on the
01718    //          lengths, but we won't bother with such fuses for the time being.
01719    if ( itemLength != 0 )
01720    {
01721       char *basicOffsetTableItemValue = new char[itemLength + 1];
01722       Fp->read(basicOffsetTableItemValue, itemLength);
01723 
01724 #ifdef GDCM_DEBUG
01725       for (unsigned int i=0; i < itemLength; i += 4 )
01726       {
01727          uint32_t individualLength = str2num( &basicOffsetTableItemValue[i],
01728                                               uint32_t);
01729          gdcmWarningMacro( "Read one length: " << 
01730                           std::hex << individualLength );
01731       }
01732 #endif //GDCM_DEBUG
01733 
01734       delete[] basicOffsetTableItemValue;
01735    }
01736 }

uint16_t gdcm::Document::ReadInt16  )  throw ( FormatError ) [protected, inherited]
 

Reads a supposed to be 16 Bits integer (swaps it depending on processor endianness).

Returns:
read value

Definition at line 663 of file gdcmDocument.cxx.

Referenced by gdcm::Document::LoadDocEntry(), gdcm::Document::ReadNextDocEntry(), and ReadTag().

00665 {
00666    uint16_t g;
00667    Fp->read ((char*)&g, (size_t)2);
00668    if ( Fp->fail() )
00669    {
00670       throw FormatError( "Document::ReadInt16()", " file error." );
00671    }
00672    if( Fp->eof() )
00673    {
00674       throw FormatError( "Document::ReadInt16()", "EOF." );
00675    }
00676    g = SwapShort(g); 
00677    return g;
00678 }

uint32_t gdcm::Document::ReadInt32  )  throw ( FormatError ) [protected, inherited]
 

Reads a supposed to be 32 Bits integer (swaps it depending on processor endianness).

Returns:
read value

Definition at line 685 of file gdcmDocument.cxx.

Referenced by ComputeRLEInfo(), gdcm::Document::LoadDocEntry(), and ReadTagLength().

00687 {
00688    uint32_t g;
00689    Fp->read ((char*)&g, (size_t)4);
00690    if ( Fp->fail() )
00691    {
00692       throw FormatError( "Document::ReadInt32()", " file error." );
00693    }
00694    if( Fp->eof() )
00695    {
00696       throw FormatError( "Document::ReadInt32()", "EOF." );
00697    }
00698    g = SwapLong(g);
00699    return g;
00700 }

bool gdcm::File::ReadTag uint16_t  testGroup,
uint16_t  testElement
[private]
 

Assuming the internal file pointer Document::Fp is placed at the beginning of a tag check whether this tag is (TestGroup, TestElement).

Warning:
On success the internal file pointer Document::Fp is modified to point after the tag. On failure (i.e. when the tag wasn't the expected tag (TestGroup, TestElement) the internal file pointer Document::Fp is restored to it's original position.
Parameters:
testGroup The expected group of the tag.
testElement The expected Element of the tag.
Returns:
True on success, false otherwise.

Definition at line 1636 of file gdcmFile.cxx.

References gdcmWarningMacro, and gdcm::Document::ReadInt16().

Referenced by ComputeJPEGFragmentInfo(), ComputeRLEInfo(), and ReadTagLength().

01637 {
01638    long positionOnEntry = Fp->tellg();
01639    long currentPosition = Fp->tellg();          // On debugging purposes
01640 
01641    // Read the Item Tag group and element, and make
01642    // sure they are what we expected:
01643    uint16_t itemTagGroup;
01644    uint16_t itemTagElement;
01645    try
01646    {
01647       itemTagGroup   = ReadInt16();
01648       itemTagElement = ReadInt16();
01649    }
01650    catch ( FormatError e )
01651    {
01652       //std::cerr << e << std::endl;
01653       return false;
01654    }
01655    if ( itemTagGroup != testGroup || itemTagElement != testElement )
01656    {
01657       gdcmWarningMacro( "Wrong Item Tag found:"
01658        << "   We should have found tag ("
01659        << std::hex << testGroup << "," << testElement << ")" << std::endl
01660        << "   but instead we encountered tag ("
01661        << std::hex << itemTagGroup << "," << itemTagElement << ")"
01662        << "  at address: " << "  0x(" << (unsigned int)currentPosition  << ")" 
01663        ) ;
01664       Fp->seekg(positionOnEntry, std::ios::beg);
01665 
01666       return false;
01667    }
01668    return true;
01669 }

uint32_t gdcm::File::ReadTagLength uint16_t  testGroup,
uint16_t  testElement
[private]
 

Assuming the internal file pointer Document::Fp is placed at the beginning of a tag (TestGroup, TestElement), read the length associated to the Tag.

Warning:
On success the internal file pointer Document::Fp is modified to point after the tag and it's length. On failure (i.e. when the tag wasn't the expected tag (TestGroup, TestElement) the internal file pointer Document::Fp is restored to it's original position.
Parameters:
testGroup The expected group of the tag.
testElement The expected Element of the tag.
Returns:
On success returns the length associated to the tag. On failure returns 0.

Definition at line 1685 of file gdcmFile.cxx.

References gdcmWarningMacro, gdcm::Document::ReadInt32(), and ReadTag().

Referenced by ComputeJPEGFragmentInfo(), ComputeRLEInfo(), and ReadAndSkipEncapsulatedBasicOffsetTable().

01686 {
01687 
01688    if ( !ReadTag(testGroup, testElement) )
01689    {
01690       return 0;
01691    }
01692                                                                                 
01694    long currentPosition = Fp->tellg();
01695    uint32_t itemLength  = ReadInt32();
01696    {
01697       gdcmWarningMacro( "Basic Item Length is: "
01698         << itemLength << std::endl
01699         << "  at address: " << std::hex << (unsigned int)currentPosition);
01700    }
01701    return itemLength;
01702 }

bool gdcm::ElementSet::RemoveEntry DocEntry entryToRemove  )  [virtual, inherited]
 

Clear the hash table from given entry AND delete the entry.

Parameters:
entryToRemove Entry to remove AND delete.

Implements gdcm::DocEntrySet.

Definition at line 89 of file gdcmElementSet.cxx.

References gdcmWarningMacro, gdcm::DocEntry::GetKey(), gdcm::ElementSet::TagHT, and gdcm::TagKey.

Referenced by File(), and gdcm::DocEntryArchive::Restore().

00090 {
00091    const TagKey &key = entryToRemove->GetKey();
00092    if( TagHT.count(key) == 1 )
00093    {
00094       TagHT.erase(key);
00095       //gdcmWarningMacro( "One element erased.");
00096       delete entryToRemove;
00097       return true;
00098    }
00099 
00100    gdcmWarningMacro( "Key not present");
00101    return false ;
00102 }

bool gdcm::ElementSet::RemoveEntryNoDestroy DocEntry entryToRemove  )  [virtual, inherited]
 

Clear the hash table from given entry BUT keep the entry.

Parameters:
entryToRemove Entry to remove.

Implements gdcm::DocEntrySet.

Definition at line 108 of file gdcmElementSet.cxx.

References gdcmWarningMacro, gdcm::DocEntry::GetKey(), gdcm::ElementSet::TagHT, and gdcm::TagKey.

Referenced by gdcm::DicomDir::NewMeta(), gdcm::DocEntryArchive::Push(), and Write().

00109 {
00110    const TagKey &key = entryToRemove->GetKey();
00111    if( TagHT.count(key) == 1 )
00112    {
00113       TagHT.erase(key);
00114       //gdcmWarningMacro( "One element erased.");
00115       return true;
00116    }
00117 
00118    gdcmWarningMacro( "Key not present");
00119    return false ;
00120 }

bool gdcm::DocEntrySet::SetBinEntry uint8_t *  content,
int  lgth,
BinEntry entry
[inherited]
 

Accesses an existing BinEntry (i.e. a Dicom Element) and modifies it's content with the given value.

Parameters:
content new value (void* -> uint8_t*) to substitute with
entry Entry to be modified
lgth new value length

Definition at line 228 of file gdcmDocEntrySet.cxx.

References gdcm::GDCM_BINLOADED, gdcm::BinEntry::SetBinArea(), gdcm::DocEntry::SetLength(), and gdcm::ContentEntry::SetValue().

00229 {
00230    if(entry)
00231    {
00232       entry->SetBinArea(content);  
00233       entry->SetLength(lgth);
00234       entry->SetValue(GDCM_BINLOADED);
00235       return true;
00236    }
00237    return false;
00238 }

bool gdcm::DocEntrySet::SetBinEntry uint8_t *  content,
int  lgth,
uint16_t  group,
uint16_t  elem
[inherited]
 

Accesses an existing DocEntry (i.e. a Dicom Element) through it's (group, element) and modifies it's content with the given value.

Parameters:
content new value (void* -> uint8_t*) to substitute with
lgth new value length
group group number of the Dicom Element to modify
elem element number of the Dicom Element to modify

Definition at line 191 of file gdcmDocEntrySet.cxx.

References gdcmWarningMacro, and gdcm::DocEntrySet::GetBinEntry().

Referenced by gdcm::DocEntrySet::InsertBinEntry(), and gdcm::FileHelper::SetBinEntry().

00193 {
00194    BinEntry *entry = GetBinEntry(group, elem);
00195    if (!entry )
00196    {
00197       gdcmWarningMacro( "No corresponding ValEntry " << std::hex << group <<
00198                         "," << elem << " element (try promotion first).");
00199       return false;
00200    }
00201 
00202    return SetBinEntry(content,lgth,entry);
00203 } 

void gdcm::Document::SetFileName std::string const &  fileName  )  [inline, inherited]
 

Accessor to Filename.

Definition at line 81 of file gdcmDocument.h.

Referenced by gdcm::DicomDir::DicomDir().

00081 { Filename = fileName; }

void gdcm::Base::SetPrintLevel int  level  )  [inline, inherited]
 

Sets the print level for the Dicom Header Elements.

Note:
0 for Light Print; 1 for 'medium' Print, 2 for Heavy

Definition at line 45 of file gdcmBase.h.

Referenced by gdcm::SQItem::Print(), gdcm::SeqEntry::Print(), gdcm::FileHelper::Print(), gdcm::ElementSet::Print(), and gdcm::DicomDir::Print().

00045 { PrintLevel = level; };

bool gdcm::Document::SetShaDict DictKey const &  dictName  )  [inherited]
 

Set the shadow dictionary used.

Parameters:
dictName name of the dictionary to use in shadow

Definition at line 210 of file gdcmDocument.cxx.

References gdcm::DictKey, and gdcm::Document::RefShaDict.

00211 {
00212    RefShaDict = Global::GetDicts()->GetDict(dictName);
00213    return !RefShaDict;
00214 }

bool gdcm::Document::SetShaDict Dict dict  )  [inherited]
 

Set the shadow dictionary used.

Parameters:
dict dictionary to use in shadow

Definition at line 200 of file gdcmDocument.cxx.

References gdcm::Document::RefShaDict.

00201 {
00202    RefShaDict = dict;
00203    return !RefShaDict;
00204 }

bool gdcm::DocEntrySet::SetValEntry std::string const &  content,
ValEntry entry
[inherited]
 

Accesses an existing DocEntry (i.e. a Dicom Element) and modifies it's content with the given value.

Parameters:
content new value (string) to substitute with
entry Entry to be modified

Definition at line 211 of file gdcmDocEntrySet.cxx.

References gdcm::ValEntry::SetValue().

00212 {
00213    if(entry)
00214    {
00215       entry->SetValue(content);
00216       return true;
00217    }
00218    return false;
00219 }

bool gdcm::DocEntrySet::SetValEntry std::string const &  content,
uint16_t  group,
uint16_t  elem
[inherited]
 

Accesses an existing DocEntry (i.e. a Dicom Element) through it's (group, element) and modifies it's content with the given value.

Parameters:
content new value (string) to substitute with
group group number of the Dicom Element to modify
elem element number of the Dicom Element to modify

Definition at line 169 of file gdcmDocEntrySet.cxx.

References gdcmWarningMacro, and gdcm::DocEntrySet::GetValEntry().

Referenced by AnonymizeFile(), gdcm::Document::Document(), gdcm::DocEntrySet::InsertValEntry(), gdcm::FileHelper::SetValEntry(), and Write().

00171 {
00172    ValEntry *entry = GetValEntry(group, elem);
00173    if (!entry )
00174    {
00175       gdcmWarningMacro( "No corresponding ValEntry " << std::hex << group <<
00176                          "," << elem << " element (try promotion first).");
00177       return false;
00178    }
00179    return SetValEntry(content,entry);
00180 }

void gdcm::Document::SkipBytes uint32_t  nBytes  )  [protected, inherited]
 

skips bytes inside the source file

Warning:
NOT end user intended method !
Returns:

Definition at line 707 of file gdcmDocument.cxx.

References gdcm::Document::Fp.

Referenced by ComputeJPEGFragmentInfo(), ComputeRLEInfo(), and gdcm::Document::SkipDocEntry().

00708 {
00709    //FIXME don't dump the returned value
00710    Fp->seekg((long)nBytes, std::ios::cur);
00711 }

uint32_t gdcm::Document::SwapLong uint32_t  a  )  [inherited]
 

Swaps back the bytes of 4-byte long integer accordingly to processor order.

Returns:
The properly swaped 32 bits integer.

Definition at line 365 of file gdcmDocument.cxx.

References gdcmErrorMacro, and gdcm::Document::SwapCode.

Referenced by gdcm::Document::GetDocEntryValue().

00366 {
00367    switch (SwapCode)
00368    {
00369       case 1234 :
00370          break;
00371       case 4321 :
00372          a=( ((a<<24) & 0xff000000) | ((a<<8)  & 0x00ff0000) | 
00373              ((a>>8)  & 0x0000ff00) | ((a>>24) & 0x000000ff) );
00374          break;   
00375       case 3412 :
00376          a=( ((a<<16) & 0xffff0000) | ((a>>16) & 0x0000ffff) );
00377          break;  
00378       case 2143 :
00379          a=( ((a<< 8) & 0xff00ff00) | ((a>>8) & 0x00ff00ff)  );
00380       break;
00381       default :
00382          gdcmErrorMacro( "Unset swap code:" << SwapCode );
00383          a = 0;
00384    }
00385    return a;
00386 } 

uint16_t gdcm::Document::SwapShort uint16_t  a  )  [inherited]
 

Swaps the bytes so they agree with the processor order.

Returns:
The properly swaped 16 bits integer.

Definition at line 351 of file gdcmDocument.cxx.

References gdcm::Document::SwapCode.

Referenced by gdcm::Document::GetDocEntryValue(), and gdcm::Document::HandleOutOfGroup0002().

00352 {
00353    if ( SwapCode == 4321 || SwapCode == 2143 )
00354    {
00355       a = ((( a << 8 ) & 0xff00 ) | (( a >> 8 ) & 0x00ff ) );
00356    }
00357    return a;
00358 }

uint32_t gdcm::Document::UnswapLong uint32_t  a  )  [inline, inherited]
 

Unswaps back the bytes of 4-byte long integer so they agree with the processor order.

Definition at line 75 of file gdcmDocument.h.

00075 { return SwapLong(a);}

uint16_t gdcm::Document::UnswapShort uint16_t  a  )  [inline, inherited]
 

Unswaps back the bytes of 2-bytes long integer so they agree with the processor order.

Definition at line 72 of file gdcmDocument.h.

00072 { return SwapShort(a);}

bool gdcm::File::Write std::string  fileName,
FileType  filetype
 

Performs some consistency checking on various 'File related' (as opposed to 'DicomDir related') entries then writes in a file all the (Dicom Elements) included the Pixels.

Parameters:
fileName file name to write to
filetype Type of the File to be written (ACR, ExplicitVR, ImplicitVR)

Definition at line 1314 of file gdcmFile.cxx.

References gdcm::Document::ComputeGroup0002Length(), gdcmWarningMacro, gdcm::ElementSet::GetDocEntry(), gdcm::DocEntrySet::GetEntryLength(), gdcm::DocEntrySet::GetEntryValue(), gdcm::DocEntrySet::GetValEntry(), GrPixel, gdcm::DocEntrySet::InsertValEntry(), NumPixel, gdcm::ElementSet::RemoveEntryNoDestroy(), gdcm::DocEntrySet::SetValEntry(), and gdcm::ValEntry::SetValue().

Referenced by gdcm::FileHelper::Write().

01315 {
01316    std::ofstream *fp = new std::ofstream(fileName.c_str(), 
01317                                          std::ios::out | std::ios::binary);
01318    if (*fp == NULL)
01319    {
01320       gdcmWarningMacro("Failed to open (write) File: " << fileName.c_str());
01321       return false;
01322    }
01323 
01324    // Entry : 0002|0000 = group length -> recalculated
01325    ValEntry *e0002 = GetValEntry(0x0002,0x0000);
01326    if( e0002 )
01327    {
01328       std::ostringstream sLen;
01329       sLen << ComputeGroup0002Length(filetype);
01330       e0002->SetValue(sLen.str());
01331    }
01332 
01333    // Bits Allocated
01334    if ( GetEntryValue(0x0028,0x0100) ==  "12")
01335    {
01336       SetValEntry("16", 0x0028,0x0100);
01337    }
01338 
01339    int i_lgPix = GetEntryLength(GrPixel, NumPixel);
01340    if (i_lgPix != -2)
01341    {
01342       // no (GrPixel, NumPixel) element
01343       std::string s_lgPix = Util::Format("%d", i_lgPix+12);
01344       s_lgPix = Util::DicomString( s_lgPix.c_str() );
01345       InsertValEntry(s_lgPix,GrPixel, 0x0000);
01346    }
01347 
01348    // FIXME : should be nice if we could move it to File
01349    //         (or in future gdcmPixelData class)
01350 
01351    // Drop Palette Color, if necessary
01352    if ( GetEntryValue(0x0028,0x0002).c_str()[0] == '3' )
01353    {
01354       // if SamplesPerPixel = 3, sure we don't need any LUT !   
01355       // Drop 0028|1101, 0028|1102, 0028|1103
01356       // Drop 0028|1201, 0028|1202, 0028|1203
01357 
01358       DocEntry *e = GetDocEntry(0x0028,0x01101);
01359       if (e)
01360       {
01361          RemoveEntryNoDestroy(e);
01362       }
01363       e = GetDocEntry(0x0028,0x1102);
01364       if (e)
01365       {
01366          RemoveEntryNoDestroy(e);
01367       }
01368       e = GetDocEntry(0x0028,0x1103);
01369       if (e)
01370       {
01371          RemoveEntryNoDestroy(e);
01372       }
01373       e = GetDocEntry(0x0028,0x01201);
01374       if (e)
01375       {
01376          RemoveEntryNoDestroy(e);
01377       }
01378       e = GetDocEntry(0x0028,0x1202);
01379       if (e)
01380       {
01381          RemoveEntryNoDestroy(e);
01382       }
01383       e = GetDocEntry(0x0028,0x1203);
01384       if (e)
01385       {
01386           RemoveEntryNoDestroy(e);
01387       }
01388    }
01389 
01390    Document::WriteContent(fp, filetype);
01391 
01392    fp->close();
01393    delete fp;
01394 
01395    return true;
01396 }

void gdcm::Document::WriteContent std::ofstream *  fp,
FileType  filetype
[virtual, inherited]
 

Writes in a file all the Header Entries (Dicom Elements).

Parameters:
fp file pointer on an already open file (actually: Output File Stream)
filetype Type of the File to be written (ACR-NEMA, ExplicitVR, ImplicitVR)
Returns:
Always true.

Reimplemented from gdcm::ElementSet.

Definition at line 482 of file gdcmDocument.cxx.

References gdcm::ExplicitVR, and gdcm::ImplicitVR.

00483 {
00484    // \TODO move the following lines (and a lot of others, to be written)
00485    // to a future function CheckAndCorrectHeader  
00486 
00487    // (necessary if user wants to write a DICOM V3 file
00488    // starting from an ACR-NEMA (V2) Header
00489 
00490    if ( filetype == ImplicitVR || filetype == ExplicitVR )
00491    {
00492       // writing Dicom File Preamble
00493       char filePreamble[128];
00494       memset(filePreamble, 0, 128);
00495       fp->write(filePreamble, 128);
00496       fp->write("DICM", 4);
00497    }
00498 
00499    /*
00500     * \todo rewrite later, if really usefull
00501     *       - 'Group Length' element is optional in DICOM
00502     *       - but un-updated odd groups lengthes can causes pb
00503     *         (xmedcon breaker)
00504     *
00505     * if ( (filetype == ImplicitVR) || (filetype == ExplicitVR) )
00506     *    UpdateGroupLength(false,filetype);
00507     * if ( filetype == ACR)
00508     *    UpdateGroupLength(true,ACR);
00509     */
00510 
00511    ElementSet::WriteContent(fp, filetype); // This one is recursive
00512 }


Member Data Documentation

ListElements gdcm::Document::AnonymizeList [protected, inherited]
 

List of element to Anonymize.

Definition at line 150 of file gdcmDocument.h.

std::string gdcm::Document::Filename [protected, inherited]
 

Refering underlying filename.

Definition at line 112 of file gdcmDocument.h.

FileType gdcm::Document::Filetype [protected, inherited]
 

ACR, ACR_LIBIDO, ExplicitVR, ImplicitVR, Unknown.

Definition at line 138 of file gdcmDocument.h.

Referenced by gdcm::Document::CheckSwap(), gdcm::Document::Document(), gdcm::Document::FindDocEntryVR(), gdcm::Document::GetFileType(), gdcm::Document::HandleOutOfGroup0002(), gdcm::Document::Initialize(), gdcm::Document::IsReadable(), gdcm::Document::ParseDES(), and gdcm::Document::ReadNextDocEntry().

std::ifstream* gdcm::Document::Fp [protected, inherited]
 

File Pointer, opened during Document parsing.

Definition at line 135 of file gdcmDocument.h.

Referenced by gdcm::Document::CheckSwap(), gdcm::Document::CloseFile(), gdcm::Document::Document(), gdcm::Document::FindDocEntryVR(), gdcm::Document::IsDocEntryAnInteger(), gdcm::Document::LoadDocEntry(), gdcm::Document::LoadDocEntrySafe(), gdcm::Document::LoadEntryBinArea(), gdcm::Document::OpenFile(), gdcm::Document::ParseDES(), gdcm::Document::ParseSQ(), gdcm::Document::ReadNextDocEntry(), gdcm::Document::SkipBytes(), and gdcm::Document::SkipToNextDocEntry().

bool gdcm::Document::Group0002Parsed [protected, inherited]
 

whether we already parsed group 0002 (Meta Elements)

Definition at line 129 of file gdcmDocument.h.

Referenced by gdcm::Document::Document(), and gdcm::Document::HandleOutOfGroup0002().

uint16_t gdcm::File::GrPixel [protected]
 

In some cases (e.g. for some ACR-NEMA images) the header entry for the group of pixels is *not* found at 0x7fe0. In order to make things easier the parser shall store the proper value in GrPixel to provide a unique access facility.

Definition at line 187 of file gdcmFile.h.

Referenced by File(), GetPixelAreaLength(), GetPixelOffset(), InitializeDefaultFile(), and Write().

bool gdcm::Document::HasDCMPreamble [protected, inherited]
 

whether file has a DCM Preamble

Definition at line 132 of file gdcmDocument.h.

Referenced by gdcm::Document::OpenFile(), and gdcm::Document::ReadNextDocEntry().

const unsigned int gdcm::Document::HEADER_LENGTH_TO_READ [static, protected, inherited]
 

After opening the file, we read HEADER_LENGTH_TO_READ bytes.

Definition at line 141 of file gdcmDocument.h.

JPEGFragmentsInfo* gdcm::File::JPEGInfo [protected]
 

Store the JPEG fragments info obtained during parsing of pixels.

Definition at line 176 of file gdcmFile.h.

Referenced by ComputeJPEGFragmentInfo(), File(), and ~File().

const unsigned int gdcm::Document::MAX_SIZE_LOAD_ELEMENT_VALUE = 0xfff [static, protected, inherited]
 

Elements whose value is longer than MAX_SIZE_LOAD_ELEMENT_VALUE are NOT loaded.

Definition at line 51 of file gdcmDocument.cxx.

Referenced by gdcm::Document::Document().

const unsigned int gdcm::Document::MAX_SIZE_PRINT_ELEMENT_VALUE = 0x7fffffff [static, protected, inherited]
 

Elements whose value is longer than MAX_SIZE_PRINT_ELEMENT_VALUE are NOT printed.

Definition at line 52 of file gdcmDocument.cxx.

uint16_t gdcm::File::NumPixel [protected]
 

In some cases (e.g. for some ACR-NEMA images) the Entry Element Number of the 'Pixel Element' is *not* found at 0x0010. In order to make things easier the parser shall store the proper value in NumPixel to provide a unique access facility.

Definition at line 182 of file gdcmFile.h.

Referenced by File(), GetPixelAreaLength(), GetPixelOffset(), InitializeDefaultFile(), and Write().

int gdcm::Base::PrintLevel [protected, inherited]
 

Amount of printed details for each Dicom Entries : 0 : stands for the least detail level.

Definition at line 53 of file gdcmBase.h.

Referenced by gdcm::Base::Base().

RLEFramesInfo* gdcm::File::RLEInfo [protected]
 

Store the RLE frames info obtained during parsing of pixels.

Definition at line 174 of file gdcmFile.h.

Referenced by ComputeRLEInfo(), File(), and ~File().

int gdcm::Document::SwapCode [protected, inherited]
 

Swap code gives an information on the byte order of a supposed to be an int32, as it's read on disc (depending on the image Transfer Syntax *and* on the processor endianess) as opposed as it should in memory to be dealt as an int32. For instance :

  • a 'Little Endian' image, read with a little endian processor will have a SwapCode= 1234 (the order is OK; nothing to do)
  • a 'Little Endian' image, read with a big endian procesor will have a SwapCode= 4321 (the order is wrong; int32 an int16 must be swapped) note : values 2143, 4321, 3412 remain for the ACR-NEMA time, and the well known 'Bad Big Endian' and 'Bad Little Endian' codes.

Definition at line 126 of file gdcmDocument.h.

Referenced by gdcm::Document::CheckSwap(), gdcm::Document::Document(), gdcm::Document::SwapLong(), gdcm::Document::SwapShort(), and gdcm::Document::SwitchByteSwapCode().


The documentation for this class was generated from the following files:
Generated on Thu Feb 10 22:18:09 2005 for gdcm by doxygen 1.3.6