1 /*=========================================================================
4 Module: $RCSfile: AnonymizeDicomDir.cxx,v $
6 Date: $Date: 2007/11/08 10:40:39 $
7 Version: $Revision: 1.12 $
9 Copyright (c) CREATIS (Centre de Recherche et d'Applications en Traitement de
10 l'Image). All rights reserved. See Doc/License.txt or
11 http://www.creatis.insa-lyon.fr/Public/Gdcm/License.html for details.
13 This software is distributed WITHOUT ANY WARRANTY; without even
14 the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 PURPOSE. See the above copyright notices for more information.
17 =========================================================================*/
18 #include "gdcmGlobal.h"
19 #include "gdcmCommon.h"
20 #include "gdcmDebug.h"
23 #include "gdcmSQItem.h"
24 #include "gdcmSeqEntry.h"
25 #include "gdcmDataEntry.h"
27 #include "gdcmDocument.h"
30 #include "gdcmArgMgr.h"
35 * \brief AnonymizeDicomDir
38 void AnoNoLoad(GDCM_NAME_SPACE::SQItem *s, std::fstream *fp,
39 uint16_t group, uint16_t elem,
42 void AnoNoLoad(GDCM_NAME_SPACE::SQItem *s, std::fstream *fp,
43 uint16_t group, uint16_t elem,
46 GDCM_NAME_SPACE::DocEntry *d;
53 d = s->GetDocEntry( group, elem);
58 if ( ! dynamic_cast<GDCM_NAME_SPACE::DataEntry *>(d) )
61 offset = d->GetOffset();
62 lgth = d->GetLength();
65 spaces = new std::string( lgth-valLgth, ' ');
69 fp->seekp( offset, std::ios::beg );
70 fp->write( v.c_str(), lgth );
74 int main(int argc, char *argv[])
78 " \n AnonymizeDicomDir :\n ",
79 " Anonymize a gdcm-readable DICOMDIR ",
80 " even when some 'Objects' are not yet taken into account ",
81 " Warning : the DICOMDIR is overwritten ",
82 " usage: AnonymizeDicomDir filein=dicomDirName [debug] ",
83 " debug : developper wants to run the program in 'debug mode' ",
86 // ----- Initialize Arguments Manager ------
87 GDCM_NAME_SPACE::ArgMgr *am = new GDCM_NAME_SPACE::ArgMgr(argc, argv);
89 if (argc == 1 || am->ArgMgrDefined("usage"))
91 am->ArgMgrUsage(usage); // Display 'usage'
96 char *fileName = am->ArgMgrWantString("filein",usage);
98 // if unused Param we give up
99 if ( am->ArgMgrPrintUnusedLabels() )
101 am->ArgMgrUsage(usage);
105 delete am; // --- we don't need Argument Manager any longer ---
108 // Read the input DICOMDIR
109 GDCM_NAME_SPACE::File *f;
110 f = GDCM_NAME_SPACE::File::New( );
112 f->SetFileName( fileName );
113 bool res = f->Load();
116 std::cerr << "Sorry, " << fileName <<" not a gdcm-readable "
117 << "file" <<std::endl;
119 std::cout << " ... is readable " << std::endl;
121 // Look for Directory record sequence
122 GDCM_NAME_SPACE::DocEntry *e = f->GetDocEntry(0x0004, 0x1220);
125 std::cout << "No Directory Record Sequence (0004,1220) found" <<std::endl;;
130 GDCM_NAME_SPACE::SeqEntry *s = dynamic_cast<GDCM_NAME_SPACE::SeqEntry *>(e);
133 std::cout << "Element (0004,1220) is not a Sequence ?!?" <<std::endl;
138 // Open the file LTTG (aka ALAP)
139 std::fstream *fp = new std::fstream(fileName,
140 std::ios::in | std::ios::out | std::ios::binary);
141 GDCM_NAME_SPACE::DocEntry *d;
144 int patientNumber = 0;
146 std::ostringstream oss;
148 GDCM_NAME_SPACE::SQItem *tmpSI=s->GetFirstSQItem(); // For all the SQItems
151 d = tmpSI->GetDocEntry(0x0004, 0x1430); // Directory Record Type
152 if ( GDCM_NAME_SPACE::DataEntry *dataEntry =
153 dynamic_cast<GDCM_NAME_SPACE::DataEntry *>(d) )
155 v = dataEntry->GetString();
159 std::cout << "(0004,1430) not a DataEntry ?!?" << std::endl;
163 if( v != "PATIENT " ) // Work only on PATIENT
165 tmpSI=s->GetNextSQItem();
169 oss << "P^" << patientNumber;
171 // Overwrite the sensitive Entries
174 AnoNoLoad(tmpSI, fp, 0x0010, 0x0010, oss.str());
176 AnoNoLoad(tmpSI, fp, 0x0010, 0x0020, oss.str());
177 // Patient's Birth Date
178 AnoNoLoad(tmpSI, fp, 0x0010, 0x0030, "11111111");
180 AnoNoLoad(tmpSI, fp, 0x0010, 0x2154, oss.str());
182 // Aware use will add here more Entries if he wants to rubb them out
186 tmpSI=s->GetNextSQItem();
189 // Close the file ASAP