+ // Just for fun :-(
+ // (if any) remove or replace all the stuff that contains a Date
+
+//0008 0012 DA ID Instance Creation Date
+//0008 0020 DA ID Study Date
+//0008 0021 DA ID Series Date
+//0008 0022 DA ID Acquisition Date
+//0008 0023 DA ID Content Date
+//0008 0024 DA ID Overlay Date
+//0008 0025 DA ID Curve Date
+//0008 002a DT ID Acquisition Datetime
+//0018 9074 DT ACQ Frame Acquisition Datetime
+//0018 9151 DT ACQ Frame Reference Datetime
+//0018 a002 DT ACQ Contribution Date Time
+//0020 3403 SH REL Modified Image Date (RET)
+//0032 0032 DA SDY Study Verified Date
+//0032 0034 DA SDY Study Read Date
+//0032 1000 DA SDY Scheduled Study Start Date
+//0032 1010 DA SDY Scheduled Study Stop Date
+//0032 1040 DA SDY Study Arrival Date
+//0032 1050 DA SDY Study Completion Date
+//0038 001a DA VIS Scheduled Admission Date
+//0038 001c DA VIS Scheduled Discharge Date
+//0038 0020 DA VIS Admitting Date
+//0038 0030 DA VIS Discharge Date
+//0040 0002 DA PRC Scheduled Procedure Step Start Date
+//0040 0004 DA PRC Scheduled Procedure Step End Date
+//0040 0244 DA PRC Performed Procedure Step Start Date
+//0040 0250 DA PRC Performed Procedure Step End Date
+//0040 2004 DA PRC Issue Date of Imaging Service Request
+//0040 4005 DT PRC Scheduled Procedure Step Start Date and Time
+//0040 4011 DT PRC Expected Completion Date and Time
+//0040 a030 DT PRC Verification Date Time
+//0040 a032 DT PRC Observation Date Time
+//0040 a120 DT PRC DateTime
+//0040 a121 DA PRC Date
+//0040 a13a DT PRC Referenced Datetime
+//0070 0082 DA ??? Presentation Creation Date
+//0100 0420 DT ??? SOP Autorization Date and Time
+//0400 0105 DT ??? Digital Signature DateTime
+//2100 0040 DA PJ Creation Date
+//3006 0008 DA SSET Structure Set Date
+//3008 0024 DA ??? Treatment Control Point Date
+//3008 0054 DA ??? First Treatment Date
+//3008 0056 DA ??? Most Recent Treatment Date
+//3008 0162 DA ??? Safe Position Exit Date
+//3008 0166 DA ??? Safe Position Return Date
+//3008 0250 DA ??? Treatment Date
+//300a 0006 DA RT RT Plan Date
+//300a 022c DA RT Air Kerma Rate Reference Date
+//300e 0004 DA RT Review Date
+
+ return true;
+}
+
+/**
+ * \brief gets the info from 0020,0037 : Image Orientation Patient
+ * @param iop adress of the (6)float aray to receive values
+ * @return cosines of image orientation patient
+ */
+void Header::GetImageOrientationPatient( float iop[6] )
+{
+ std::string strImOriPat;
+ //iop is supposed to be float[6]
+ iop[0] = iop[1] = iop[2] = iop[3] = iop[4] = iop[5] = 0.;
+
+ // 0020 0037 DS REL Image Orientation (Patient)
+ if ( (strImOriPat = GetEntryByNumber(0x0020,0x0037)) != GDCM_UNFOUND )
+ {
+ if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f",
+ &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
+ {
+ dbg.Verbose(0, "Header::GetImageOrientationPatient: "
+ "wrong Image Orientation Patient (0020,0037)");
+ }
+ }
+ //For ACR-NEMA
+ // 0020 0035 DS REL Image Orientation (RET)
+ else if ( (strImOriPat = GetEntryByNumber(0x0020,0x0035)) != GDCM_UNFOUND )
+ {
+ if( sscanf( strImOriPat.c_str(), "%f\\%f\\%f\\%f\\%f\\%f",
+ &iop[0], &iop[1], &iop[2], &iop[3], &iop[4], &iop[5]) != 6 )
+ {
+ dbg.Verbose(0, "Header::GetImageOrientationPatient: "
+ "wrong Image Orientation Patient (0020,0035)");
+ }
+ }
+}
+
+/**
+ * \brief Initialize a default DICOM header that should contain all the
+ * field require by other reader. DICOM standart does not
+ * explicitely defines thoses fields, heuristic has been choosen.
+ * This is not perfect as we are writting a CT image...
+ */
+void Header::InitializeDefaultHeader()
+{
+ typedef struct
+ {
+ const char *value;
+ uint16_t group;
+ uint16_t elem;
+ } DICOM_DEFAULT_VALUE;
+
+ std::string date = Util::GetCurrentDate();
+ std::string time = Util::GetCurrentTime();
+ std::string uid = Util::CreateUniqueUID();
+
+ static DICOM_DEFAULT_VALUE defaultvalue[] = {
+ "76", 0x0002, 0x0000, // MetaElementGroup Length // FIXME: how to recompute ?
+ "1.2.840.10008.5.1.4.1.1.2", 0x0002, 0x0002, // MediaStorageSOPInstanceUID (CT Image Storage)
+ uid.c_str(), 0x0002, 0x0012, // META Implementation Class UID
+ "ISO_IR 100",0x0008, 0x0005, // Specific Character Set
+ "DERIVED\\SECONDARY\\OTHER\\GDCM", 0x0008, 0x0008, // Image Type
+ "1.2.840.10008.5.1.4.1.1.2", 0x0008, 0x0016, // SOP Class UID
+ "", 0x0008, 0x0050, // Accession Number
+ "GDCM", 0x0008, 0x0070, // Manufacturer
+ "GDCM", 0x0008, 0x0080, // Institution Name
+ "http://www-creatis.insa-lyon.fr/Public/Gdcm/", 0x0008, 0x0081, // Institution Address
+ "", 0x0008, 0x0090, // Refering Physician Name
+ "", 0x0008, 0x1030, // Study Description
+ "", 0x0008, 0x1050, // Performing Physician's Name
+ "", 0x0008, 0x1060, // Name of Physician(s) Reading Study
+ "", 0x0010, 0x0040, // Patient's Sex
+ uid.c_str(), 0x0020, 0x000d, // StudyInstanceUID
+ uid.c_str(), 0x0020, 0x000e, // SeriesInstanceUID
+ "", 0x0020, 0x0011, // AcquisitionNumber
+ "1\\0\\0\\0\\1\\0", 0x0020, 0x0037, // Image Orientation Patient
+ "1", 0x0028, 0x0002, // Samples per pixel 1 or 3
+ "MONOCHROME2",0x0028, 0x0004, // photochromatic interpretation
+
+// Date and timeG
+
+ date.c_str(), 0x0008, 0x0012, // Instance Creation Date
+ time.c_str(), 0x0008, 0x0013, // Instance Creation Time
+ date.c_str(), 0x0008, 0x0020, // Study Date
+ date.c_str(), 0x0008, 0x0022, // Acquisition Date
+ date.c_str(), 0x0008, 0x0023, // Content Date
+ time.c_str(), 0x0008, 0x0030, // Study Time
+ "CT", 0x0008, 0x0060, // Modality
+ "GDCM", 0x0010, 0x0010, // Patient's Name
+ "GDCMID", 0x0010, 0x0020, // Patient ID
+ "1", 0x0020, 0x0010, // StudyID
+ "1", 0x0020, 0x0011, // SeriesNumber
+ "1.0", 0x0018, 0x0050, // slice Thickness
+ "1.0", 0x0018, 0x0088, // space between slices
+ "1.0\\1.0", 0x0028, 0x0030, // pixelSpacing
+ "64", 0x0028, 0x0010, // nbRows
+ "64", 0x0028, 0x0011, // nbCols
+ "16", 0x0028, 0x0100, // BitsAllocated 8 or 16
+ "12", 0x0028, 0x0101, // BitsStored 8 or 12
+ "11", 0x0028, 0x0102, // HighBit 7 or 11
+ "0", 0x0028, 0x0103, // Pixel Representation 0(unsigned) or 1(signed)
+ "1000.0", 0x0028, 0x1051, // Window Width
+ "500.0", 0x0028, 0x1050, // Window Center
+ 0, 0, 0
+ };
+
+ // default value
+ // Special case this is the image (not a string)
+ GrPixel = 0x7fe0;
+ NumPixel = 0x0010;
+ ReplaceOrCreateByNumber(0, 0, GrPixel, NumPixel);
+
+ // All remaining strings:
+ unsigned int i = 0;
+ DICOM_DEFAULT_VALUE current = defaultvalue[i];
+ while( current.value )
+ {
+ std::string value = Util::DicomString( current.value ); //pad the string properly
+ ReplaceOrCreateByNumber(value, current.group, current.elem);
+ current = defaultvalue[++i];
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Private
+
+//-----------------------------------------------------------------------------
+
+} // end namespace gdcm