Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 /// \file medical/DICOM/include/DicomHandler.hh 28 /// \brief Definition of the DicomHandler class 29 // 30 // The code was written by : 31 // *Louis Archambault louis.archambault@phy.ulaval.ca, 32 // *Luc Beaulieu beaulieu@phy.ulaval.ca 33 // +Vincent Hubert-Tremblay at tigre.2@sympatico.ca 34 // 35 // 36 // *Centre Hospitalier Universitaire de Quebec (CHUQ), 37 // Hotel-Dieu de Quebec, departement de Radio-oncologie 38 // 11 cote du palais. Quebec, QC, Canada, G1R 2J6 39 // tel (418) 525-4444 #6720 40 // fax (418) 691 5268 41 // 42 // + Université Laval, Québec (QC) Canada 43 //*******************************************************// 44 45 #ifndef DicomHandler_h 46 #define DicomHandler_h 1 47 48 #include "globals.hh" 49 50 #include <cstdio> 51 #include <fstream> 52 #include <map> 53 54 //******************************************************* 55 /// Dicom Handler class 56 /// - Handling of DICM images 57 /// - Transforming *.dcm to *.g4 ( pixels->density ) 58 /// - Reading headers and pixels 59 /// - Transforming pixel to density and creating *.g4 60 /// files 61 /// - Functions are in DicomHandler.cc 62 /// 63 /// Base on previous code by : 64 /// Dragan Tubic <tdragan@gel.ulaval.ca> 65 //******************************************************* 66 67 class DicomPhantomZSliceHeader; 68 class DicomPhantomZSliceMerged; 69 70 class DicomHandler 71 { 72 public: 73 ~DicomHandler(); 74 75 // static accessor 76 static DicomHandler* Instance(); 77 78 G4int ReadFile(FILE*, char*); 79 G4int ReadData(FILE*, char*); // note: always use readHeader 80 // before readData 81 82 // use ImageMagick to display the image 83 // G4int displayImage(char[500]); 84 85 void CheckFileFormat(); 86 87 static G4String GetDicomDataPath(); 88 static G4String GetDicomDataFile(); 89 90 private: 91 DicomHandler(); 92 93 template<class Type> 94 void GetValue(char*, Type&); 95 96 private: 97 static DicomHandler* fInstance; 98 99 const G4int DATABUFFSIZE; 100 const G4int LINEBUFFSIZE; 101 const G4int FILENAMESIZE; 102 103 void ReadCalibration(); 104 void GetInformation(G4int&, char*); 105 G4float Pixel2density(G4int pixel); 106 void ReadMaterialIndices(std::ifstream& finData); 107 unsigned int GetMaterialIndex(G4float density); 108 void StoreData(std::ofstream& foutG4DCM); 109 void StoreData(DicomPhantomZSliceHeader* dcmPZSH); 110 G4int read_defined_nested(FILE*, G4int); 111 void read_undefined_nested(FILE*); 112 void read_undefined_item(FILE*); 113 114 short fCompression; 115 G4int fNFiles; 116 short fRows; 117 short fColumns; 118 short fBitAllocated; 119 G4int fMaxPixelValue, fMinPixelValue; 120 121 G4double fPixelSpacingX, fPixelSpacingY; 122 G4double fSliceThickness; 123 G4double fSliceLocation; 124 125 G4int fRescaleIntercept, fRescaleSlope; 126 127 G4bool fLittleEndian, fImplicitEndian; 128 short fPixelRepresentation; 129 130 G4int** fTab; 131 std::map<G4float, G4String> fMaterialIndices; 132 133 G4int fNbrequali; 134 G4double* fValueDensity; 135 G4double* fValueCT; 136 G4bool fReadCalibration; 137 DicomPhantomZSliceMerged* fMergedSlices; 138 139 G4String fDriverFile; 140 G4String fCt2DensityFile; 141 }; 142 #endif 143