1 -----------------------------------------------------------------------------
2 Proposed Template of an entry in this TODO:
3 (Note: Date is the date of registering of first demand.)
13 -----------------------------------------------------------------------------
14 Description: GDCM is pretty dumb with binary data
18 D 0028|0009 [AT] [Frame Increment Pointer] [gdcm::Binary data loaded;length = 4]
19 -----------------------------------------------------------------------------
20 Description: gdcm does not handle deflate TS
24 image_dfl from dclunie website is not working since the *whole* dataset
25 is compressed. Therefore we cannot even parse the file.
26 -----------------------------------------------------------------------------
27 Description: Problem with PrintFile and OB field
31 Doing a PrintFile on RickAvila DataSet we get:
32 D 0043|1028 lg : x(2) 2 Off.: x(bb2) 2994 [OB] [Unique image iden] [00]
33 Whereas hexedit shows 3030 ??
34 -----------------------------------------------------------------------------
35 Description: Make sure that that gdcm lib can be dlopen'ed/dlclose
39 As reported in ITK mailing list, the global symbols are completely
40 skrewed up in gdcm, preventing one to dlopen/dlclose gdcm lib.
41 -> Need to add a nighlty test
42 -> Need to write the code :(
43 -----------------------------------------------------------------------------
44 Description: Add testing of valid dictionary
48 Since that now private/shadow dictionary are available
49 it would be nice to start implementing an automatic mode of loading
50 those dictionary as we read the public one.
51 Comments: It shouldn't be too difficult to 'manualy' ask memory merging
52 of a Private Dict into the public one (I can do it soon).
53 Automatic recognition of the Private Dict to be used seems hopeless.
54 -----------------------------------------------------------------------------
55 Description: gdcm::SerieHelper / UID / set of rules
59 gdcm::SerieHelper now offer a mechanism to add rules to sub select image
60 as we iterate over them within a subdirectory structure. But what if UID was too
61 restrictive ? Therefore UID subselection become only a good default rule, which
62 should ideally be removed when user need a specific task.
64 -----------------------------------------------------------------------------
65 Description: Add testing of valid dictionary
69 It is potentially possible that user modifies the dictionary that gdcm provides
70 and this is also possible that the dictionary generated from pdf is buggy
71 (see 2001,xx5F. VR = SQ, VM = 1-n, from
72 www.medical.philips.com/main/company/connectivity/assets/docs/dicomcs/mr91.pdf)
73 Therefore gdcm should check for any typo, and report it (if possible)
75 -----------------------------------------------------------------------------
76 Description: Add kwsys as a subdir somewhere in gdcm
80 kwsys is a lightweight library developped by kitware, used in project like
81 ITK, VTK, CMake and ParaView. It runs and compile on almost any plateform with c++
82 compiler. And it provide a cross plateform approach to any kind of system call
83 (executing a process, killing a process, realpath, filename/directory management ...)
85 * jpr : what does 'kwsys' stand for?
86 -----------------------------------------------------------------------------
87 Description: Extent reading support
91 Comments: All ITK/VTK readers support selecting extent. gdcm should support
92 selecting extent before being inserted into ITK
93 -----------------------------------------------------------------------------
94 Description: gdcmDicomDir and SQItem creation
97 Details: DicomDir creates some SQItem (by new). Then, it creates
98 the corresponding DicomDirPatient, etc. using the content of the SQItem
99 (the content is composed with some DocEntry's that can't be destroyed).
100 So, if the SQItem is deleted, then it's content is deleted to. But the
101 DicomDirPatient, etc. use the content of the SQItem. Then, the SQItem can't
102 be deleted, and when have memory leaks
105 -----------------------------------------------------------------------------
106 Description: [BUG] Better handling of unfound Dicom dictionary.
107 When gdcm doesn't find the Dicom dictionary (because it's
108 path to the directory of dictionary is uncorrect, either
109 because the install relative layout was broken after file moves
110 or because the environnement variable GDCM_DICT_PATH is
111 unpropely set), gdcm will:
113 2/ throw an exception (that is internaly UNcatched by gdcm)
114 that in most cases provoques the caller application to
115 exit uncleanly (uncatched excpetions in fine call abort() ).
116 Additionaly on Win32 the warning print isn't displayed because
117 exiting occurs prior to cerr or cout is flushed properly.
120 Details: fixes (from dirty to clean)
121 1/ force Win32 to flush it's buffer so at least the user gets some
122 reason why it's application exited (when called in command
123 environement). Note: it looks like the "cerr << flush" fails. Sigh.
124 2/ within gdcm catch the exception, display a decent warning, and
126 3/ see the comment below on how to enhance the API and fix things
128 Comments: ENH proposal:
129 The caller migth not be aware of the path to the dictionaries
130 on invocation of gdcm (think this path is set by the Interface
131 because the caller wants to skip the default gdcm dictionary in order
132 to provide his own ones e.g. another language based one).
133 Hence, gdcm should postpone the parsing of the default dictionary
134 instead of doing it on library entry.
135 This would enable two things:
136 - It would give a chance to the caller to set the path to
137 the dictionaries he whishes to use, through a call to
138 newly created DictSet::SetDictionaryPath( string ).
139 - It would avoid the burden of using the GDCM_DICT_PATH
140 environnement variable and enable GDCM CONTROL FROM WITHIN
141 THE API. Optionaly, if the caller didn't use the API to
142 provide his prefered path, gdcm could still default to
144 -----------------------------------------------------------------------------
145 Description: vtk/vtkGdcmReader doesn't positionate the normal to the image
148 Details: vtkGdcmReader::CheckFileCoherence() sets the DataOrigin[i]
149 but doesn't set the plane (image seen in 3D) normal (is it
150 possible any how). This plane normal could be extracted from
151 the "orientation" info of the gdcmHeader ( refer to
152 grep "Orientation" Dicts/dicomV3.dic).
153 Problem exhibiting this defect: cine loop on a stack of images
154 whose Origin is correct, but whose normal is not set will
157 * vtkGdcmReader inherits from vtkImageReader which aggregates
158 a vtkTranform. vtkGdcmReader could store (when the user requires
159 it, see below) the origin/normal taken from the Dicom Header
160 within this vtkTransform (looks like a natural place to store
161 this spacial information).
162 * Both settings of the origin and/OR the normal of the plane (image)
163 should be an option defined with a flag (On/Off) in the
165 -----------------------------------------------------------------------------
166 Description: test the private dictionary part.
171 * Frog: where can we obtain such a private/dictionary and the corresponding
172 Dicom file ? Any examples on-line ?
173 * jpr : some are in gdcm/Dicts (built from pdf documents found on constructors'
175 When we check them against existing images, we see the are uncomplete
177 -----------------------------------------------------------------------------
178 Description: generate methods based on VM.
182 * cmake should parse le DICOM dictionary to generate methods like
183 gdcm???::SetImagePosition(int, int)
185 //generated content do not edit
188 gdcm???::SetImageNumber(int)
190 //generated content do not edit
194 * Regrain: a dicom dictionary entry name is NOT UNIQUE [this means
195 two tags=(group, element) can share the same name].
196 What should the wrapper do in such a case !?
197 * Frog: what does VM stand for ?
198 * VM = Value Multiplicity
199 -----------------------------------------------------------------------------
200 Description: Add information on supported imagers (constructor/model)
203 Details: in order to promote gdcm make a list (on the web pages)
204 of images successfully parsed based on a constructor/model ordering
206 * frog: gdcmData only lists pathological images. How to collect
207 the ones gdcm works smoothly with (hopefully gdcmData is a small
208 subset of what we would like).
209 * jpr : gdcmData contains images that caus*ed* us some troubles.
210 the aim of gdcm is to read *all* the images, from *all* the
211 constructors and *all* the models.
212 Better we do a 'gdcm Dicom Hall of Shame' with bugged header images,
213 explaining *why* the header is bugged.
214 -----------------------------------------------------------------------------
215 Description: Add a GetVersion() global function.
218 Details: This is to be used for version assertion with gdcmPython
219 Comments: Done (August 2005)
220 -----------------------------------------------------------------------------
221 * vtk/vtkGdcmHeader.cxx: if speed becomes a concern some changes can
222 be made at the cost of memory consumption (refer to header of
223 vtk/vtkGdcmHeader.cxx)
224 -----------------------------------------------------------------------------
225 * gdcmElValSet::SetElValueLengthByNumber IMNSHO should be trashed.
226 It's only purpose is a onliner substitute to calling GetElValueByNumber
227 and then SetLength. This only obfuscates the caller code more than
229 Besides the definition of gdcmElValSet::SetElValueLengthByNumber itself
230 it quite poor since it is a almost exact copy of
231 gdcmElValSet::GetElValueByNumber except for the returned code.
232 gdcmHeader::SetPubElValLengthByNumber (which is based on
233 gdcmElValSet::SetElValueLengthByNumber) is used nowhere...
235 * jpr : all the methods SetxxxByName were trashed.
236 all the methods SetxxxByNumber were renamed
237 A general method clean out was performed
238 -----------------------------------------------------------------------------
239 * All (or at least many of) the methods of gdcmHeader whose only arguments
240 are an ElValue* (e.g. FindLength, FindVR, LoadElementValue...) can
241 be moved away to ElValue class on condition of transmitting the
242 gdcmHeader.fp attribute. This change should be considered since it
243 would allow those method to avoid artificial calls to ElValue::GetElement(),
245 -----------------------------------------------------------------------------
246 * Group length is not a unique tag in a file. Hence avoid putting it
247 in the element values dictionary without doing something smarter
248 (say, instead of storing the length store the group and the length
249 so we can related a length to a group).
250 -----------------------------------------------------------------------------
251 * GetPubElValByNumber doit faire la difference entre chaine vide
252 et chaine pas trouve'e. Eventuellement raiser une exception ?
253 -----------------------------------------------------------------------------
254 * gdcmHeader::LoadElements only loads the element whose length is
255 below the specified size. When accessing the value of such an element
256 the content is unfound ! Find a decent way of loading the value on
258 -----------------------------------------------------------------------------
259 * JPR: supply a method that only reads/loads (?) the Dicom elements
261 -----------------------------------------------------------------------------
262 * JPR: gdcmHeader::CheckSwap() dans le cas ACR pas propre, degager tout de
263 suite si on a deduit que c'en est pas...
264 -----------------------------------------------------------------------------
265 * python /usr/lib/python2.2/site-packages/DaVaW/demo/dvwDcmReader.py
266 and load image /home/frog/cvs/DCMlib/Data/CT-MONO2-16-ankle.dcm
267 will yield wrong coloring scheme as opposed to
268 affim filein=/home/frog/cvs/DCMlib/Data/CT-MONO2-16-ankle.dcm
269 -----------------------------------------------------------------------------
270 * gdcmFile should implement the following API:
272 WriteDicom.SetFileName("MyDicomFile.dcm");
273 string * AllTags = gdcmHeader.GetDcmTagNames();
274 WriteDicom.SetDcmTag(AllTags[5], "253");
275 WriteDicom.SetDcmTag("Patient Name", "bozo");
276 WriteDicom.SetDcmTag("Patient Name", "bozo");
277 WriteDicom.SetImageData(Image);
280 Anonymize(ostream& output) {
281 a = gdcmFile("toto1");
282 a.SetPubValueByName("Patient Name", "");
283 a.SetPubValueByName("Date", "");
284 a.SetPubValueByName("Study Date", "");
287 -----------------------------------------------------------------------------