I only test it on this version. <div><br></div><div>I modify the class itkGDCMImageIO on line 711 replacing this code :</div><div><br></div><div>image.SetOrigin(2, 0);</div><div><br></div><div>by the following :</div><div>

<br></div><div><div>    if( header.FindDataElement( gdcm::Tag(0x0020, 0x0032 ) )){</div><div>  <span class="Apple-tab-span" style="white-space:pre">        </span>  const gdcm::DataElement &amp;de = header.GetDataElement( gdcm::Tag(0x0020, 0x0032) );</div>

<div>  <span class="Apple-tab-span" style="white-space:pre">        </span>  std::pair&lt;std::string, std::string&gt; s = sf.ToStringPair( de.GetTag() );</div><div>  <span class="Apple-tab-span" style="white-space:pre">        </span>  std::string value= s.second;</div>

<div>  <span class="Apple-tab-span" style="white-space:pre">        </span>  sscanf(  value.c_str(), &quot;%lf\\%lf\\%lf&quot;, &amp;(m_Origin[0]), &amp;(m_Origin[1]), &amp;(m_Origin[2]) );</div><div>  <span class="Apple-tab-span" style="white-space:pre">        </span>  image.SetOrigin(2, m_Origin[2]);</div>

<div>    }</div></div><div><br></div><div>and now the Image Patient Position tag is set ok with the correct value of z-axis.  Could this code be a valid patch for the problem?</div><div><br></div><div>Thank you.</div><div>

<br></div><div><div class="gmail_quote">2011/4/15 Bill Lorensen <span dir="ltr">&lt;<a href="mailto:bill.lorensen@gmail.com">bill.lorensen@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

I realize that. I was asking Mical.<br>
<br>
Did your code work properly with earlier versions of itk?<br>
<font color="#888888"><br>
Bill<br>
</font><div><div></div><div class="h5"><br>
On Fri, Apr 15, 2011 at 12:30 PM, Alberto &lt;<a href="mailto:bertorey@gmail.com">bertorey@gmail.com</a>&gt; wrote:<br>
&gt; The git version of ITK<br>
&gt;<br>
&gt; 2011/4/15 Bill Lorensen &lt;<a href="mailto:bill.lorensen@gmail.com">bill.lorensen@gmail.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt; What version of itk are you using?<br>
&gt;&gt;<br>
&gt;&gt; On Thu, Apr 14, 2011 at 5:16 AM, Bc. Michal Srna &lt;<a href="mailto:michal@srna.info">michal@srna.info</a>&gt; wrote:<br>
&gt;&gt; &gt; Hello,<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I have used part of this code to generate MetaDataDictionary:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Wiki/ITK/Examples/DICOM/ResampleDICOM" target="_blank">http://www.itk.org/Wiki/ITK/Examples/DICOM/ResampleDICOM</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Everything works, as I need, but I have just one problem in part<br>
&gt;&gt; &gt; regarding<br>
&gt;&gt; &gt; saving Image Position (origin) for &quot;z&quot; axis. &quot;x,y&quot; are stored well, but<br>
&gt;&gt; &gt; &quot;z&quot;<br>
&gt;&gt; &gt; value of Image Position is 0.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Here is that part of the code for saving the Image position:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         ImageType::PointType position;<br>
&gt;&gt; &gt;                         ImageType::IndexType index;<br>
&gt;&gt; &gt;                         index[0] = 0;<br>
&gt;&gt; &gt;                         index[1] = 0;<br>
&gt;&gt; &gt;                         index[2] = f;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; reader-&gt;GetOutput()-&gt;TransformIndexToPhysicalPoint(index, position);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; position[0] &lt;&lt; &quot;\\&quot; &lt;&lt; position[1] &lt;&lt;<br>
&gt;&gt; &gt; &quot;\\&quot;<br>
&gt;&gt; &gt; &lt;&lt; position[2];<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|0032&quot;, value.str());<br>
&gt;&gt; &gt; //WHY<br>
&gt;&gt; &gt; NOT WORKING??<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; position[2] contains the correct value, but I don&#39;t know, why is that<br>
&gt;&gt; &gt; value<br>
&gt;&gt; &gt; not saved and instead of that value is stored just 0?<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I think I should add also the whole code for generating my<br>
&gt;&gt; &gt; MetaDataDictionary for see my problem in context.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; At first it opens original data, from which I read original meta data.<br>
&gt;&gt; &gt; Then<br>
&gt;&gt; &gt; I modify some parts of those meta data in for cycle creating meta data<br>
&gt;&gt; &gt; for<br>
&gt;&gt; &gt; each slice.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; I confirmed, that original data contains correct value of Image Position<br>
&gt;&gt; &gt; in<br>
&gt;&gt; &gt; &quot;z&quot; axis. But I need to recalculate that value and store new value.<br>
&gt;&gt; &gt; Problem<br>
&gt;&gt; &gt; is, as I told, that this value is not saved and instead of it, there is<br>
&gt;&gt; &gt; just<br>
&gt;&gt; &gt; 0.<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Here is the whole code, spacing[x] is derived from other part of the<br>
&gt;&gt; &gt; whole<br>
&gt;&gt; &gt; code, I don&#39;t want to copy here:<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; /*opening original data for getting meta data dictionry for saving it<br>
&gt;&gt; &gt; into<br>
&gt;&gt; &gt; output 2D series files*/<br>
&gt;&gt; &gt;             typedef itk::GDCMImageIO ImageIOType;<br>
&gt;&gt; &gt;             typedef itk::GDCMSeriesFileNames NamesGeneratorType;<br>
&gt;&gt; &gt;             typedef itk::ImageSeriesReader&lt; ImageType &gt; ReaderType;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;             ImageIOType::Pointer gdcmIO = ImageIOType::New();<br>
&gt;&gt; &gt;             ReaderType::Pointer reader = ReaderType::New();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;             NamesGeneratorType::Pointer namesGenerator =<br>
&gt;&gt; &gt; NamesGeneratorType::New();<br>
&gt;&gt; &gt;             namesGenerator-&gt;SetInputDirectory( StudyFolderName );<br>
&gt;&gt; &gt;             const ReaderType::FileNamesContainer &amp; filenames =<br>
&gt;&gt; &gt; namesGenerator-&gt;GetInputFileNames();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;             reader-&gt;SetImageIO( gdcmIO );<br>
&gt;&gt; &gt;             reader-&gt;SetFileNames( filenames );<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;             reader-&gt;Update();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;         /*creating MetaDataDictionary for each slice*/<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;             /*Copy the dictionary from the first image and override<br>
&gt;&gt; &gt; slice<br>
&gt;&gt; &gt; specific fields*/<br>
&gt;&gt; &gt;                 ReaderType::DictionaryRawPointer inputDictionary =<br>
&gt;&gt; &gt; (*(reader-&gt;GetMetaDataDictionaryArray()))[0];<br>
&gt;&gt; &gt;                 ReaderType::DictionaryArrayType dictionaryOutputArray;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;             /*To keep the new series in the same study as the original<br>
&gt;&gt; &gt; we<br>
&gt;&gt; &gt; need to keep the same study UID. But we need new series and frame of<br>
&gt;&gt; &gt; reference UID&#39;s.*/<br>
&gt;&gt; &gt;                 #if ITK_VERSION_MAJOR &gt;= 4<br>
&gt;&gt; &gt;                   gdcm::UIDGenerator suid;<br>
&gt;&gt; &gt;                   std::string seriesUID = suid.Generate();<br>
&gt;&gt; &gt;                   gdcm::UIDGenerator fuid;<br>
&gt;&gt; &gt;                   std::string frameOfReferenceUID = fuid.Generate();<br>
&gt;&gt; &gt;                 #else<br>
&gt;&gt; &gt;                   std::string seriesUID = gdcm::Util::CreateUniqueUID(<br>
&gt;&gt; &gt; gdcmIO-&gt;GetUIDPrefix());<br>
&gt;&gt; &gt;                   std::string frameOfReferenceUID =<br>
&gt;&gt; &gt; gdcm::Util::CreateUniqueUID( gdcmIO-&gt;GetUIDPrefix());<br>
&gt;&gt; &gt;                 #endif<br>
&gt;&gt; &gt;                   std::string studyUID;<br>
&gt;&gt; &gt;                   std::string sopClassUID;<br>
&gt;&gt; &gt;                   itk::ExposeMetaData&lt;std::string&gt;(*inputDictionary,<br>
&gt;&gt; &gt; &quot;0020|000d&quot;, studyUID);<br>
&gt;&gt; &gt;                   itk::ExposeMetaData&lt;std::string&gt;(*inputDictionary,<br>
&gt;&gt; &gt; &quot;0008|0016&quot;, sopClassUID);<br>
&gt;&gt; &gt;                   gdcmIO-&gt;KeepOriginalUIDOn();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                 for (unsigned int f = 0; f &lt; size[2]; f++)<br>
&gt;&gt; &gt;                 {<br>
&gt;&gt; &gt;                     // Create a new dictionary for this slice<br>
&gt;&gt; &gt;                         ReaderType::DictionaryRawPointer dict = new<br>
&gt;&gt; &gt; ReaderType::DictionaryType;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Copy the dictionary from the first slice<br>
&gt;&gt; &gt;                         CopyDictionary (*inputDictionary, *dict);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Set the UID&#39;s for the study, series, SOP  and<br>
&gt;&gt; &gt; frame<br>
&gt;&gt; &gt; of reference<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|000d&quot;, studyUID);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|000e&quot;, seriesUID);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|0052&quot;,<br>
&gt;&gt; &gt; frameOfReferenceUID);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     #if ITK_VERSION_MAJOR &gt;= 4<br>
&gt;&gt; &gt;                         gdcm::UIDGenerator sopuid;<br>
&gt;&gt; &gt;                         std::string sopInstanceUID = sopuid.Generate();<br>
&gt;&gt; &gt;                     #else<br>
&gt;&gt; &gt;                         std::string sopInstanceUID =<br>
&gt;&gt; &gt; gdcm::Util::CreateUniqueUID( gdcmIO-&gt;GetUIDPrefix());<br>
&gt;&gt; &gt;                     #endif<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0008|0018&quot;,<br>
&gt;&gt; &gt; sopInstanceUID);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0002|0003&quot;,<br>
&gt;&gt; &gt; sopInstanceUID);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Change fields that are slice specific<br>
&gt;&gt; &gt;                         itksys_ios::ostringstream value;<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; f + 1;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Image Number<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|0013&quot;, value.str());<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Series Description - Append new description to<br>
&gt;&gt; &gt; current series description<br>
&gt;&gt; &gt;                         std::string oldSeriesDesc;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::ExposeMetaData&lt;std::string&gt;(*inputDictionary,<br>
&gt;&gt; &gt; &quot;0008|103e&quot;, oldSeriesDesc);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; oldSeriesDesc<br>
&gt;&gt; &gt;                               &lt;&lt; spacing[0] &lt;&lt; &quot;, &quot;<br>
&gt;&gt; &gt;                               &lt;&lt; spacing[1] &lt;&lt; &quot;, &quot;<br>
&gt;&gt; &gt;                               &lt;&lt; spacing[2];<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // This is an long string and there is a 64<br>
&gt;&gt; &gt; character<br>
&gt;&gt; &gt; limit in the standard<br>
&gt;&gt; &gt;                         unsigned lengthDesc = value.str().length();<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         std::string seriesDesc( value.str(), 0,<br>
&gt;&gt; &gt;                                                 lengthDesc &gt; 64 ? 64<br>
&gt;&gt; &gt;                                                 : lengthDesc);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0008|103e&quot;, seriesDesc);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Series Number<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; 1001;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|0011&quot;, value.str());<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     //Image Position Patient: This is calculated by<br>
&gt;&gt; &gt; computing the physical coordinate of the first pixel in each slice.<br>
&gt;&gt; &gt;                         ImageType::PointType position;<br>
&gt;&gt; &gt;                         ImageType::IndexType index;<br>
&gt;&gt; &gt;                         index[0] = 0;<br>
&gt;&gt; &gt;                         index[1] = 0;<br>
&gt;&gt; &gt;                         index[2] = f;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; reader-&gt;GetOutput()-&gt;TransformIndexToPhysicalPoint(index, position);<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; position[0] &lt;&lt; &quot;\\&quot; &lt;&lt; position[1] &lt;&lt;<br>
&gt;&gt; &gt; &quot;\\&quot;<br>
&gt;&gt; &gt; &lt;&lt; position[2];<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|0032&quot;, value.str());<br>
&gt;&gt; &gt; //WHY<br>
&gt;&gt; &gt; NOT WORKING??<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Slice Location: For now, we store the z component<br>
&gt;&gt; &gt; of<br>
&gt;&gt; &gt; the Image Position Patient.<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; position[2];<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0020|1041&quot;, value.str());<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Spacing Between Slices<br>
&gt;&gt; &gt;                         value.str(&quot;&quot;);<br>
&gt;&gt; &gt;                         value &lt;&lt; spacing[2];<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; itk::EncapsulateMetaData&lt;std::string&gt;(*dict,&quot;0018|0088&quot;, value.str());<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Change specific values<br>
&gt;&gt; &gt;                         //  itk::EncapsulateMetaData&lt;std::string&gt;(*dict,<br>
&gt;&gt; &gt; &quot;0028|0100&quot;, &quot;16&quot; );<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;                     // Save the dictionary<br>
&gt;&gt; &gt;                         dictionaryOutputArray.push_back(dict);<br>
&gt;&gt; &gt;                   }<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Thanks guys in advance...<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; --<br>
&gt;&gt; &gt; S pozdravem Bc. Michal Srna<br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Fotografické portfolio:<br>
&gt;&gt; &gt; <a href="http://michalsrna.cz" target="_blank">http://michalsrna.cz</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; _____________________________________<br>
&gt;&gt; &gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Visit other Kitware open-source projects at<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt; &gt; <a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.html</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; &gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;&gt; &gt;<br>
&gt;&gt; &gt;<br>
&gt;&gt; _____________________________________<br>
&gt;&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;&gt;<br>
&gt;&gt; Visit other Kitware open-source projects at<br>
&gt;&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;&gt;<br>
&gt;&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt;&gt; <a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.html</a><br>
&gt;&gt;<br>
&gt;&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt;&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;&gt;<br>
&gt;&gt; Follow this link to subscribe/unsubscribe:<br>
&gt;&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
&gt;<br>
&gt; _____________________________________<br>
&gt; Powered by <a href="http://www.kitware.com" target="_blank">www.kitware.com</a><br>
&gt;<br>
&gt; Visit other Kitware open-source projects at<br>
&gt; <a href="http://www.kitware.com/opensource/opensource.html" target="_blank">http://www.kitware.com/opensource/opensource.html</a><br>
&gt;<br>
&gt; Kitware offers ITK Training Courses, for more information visit:<br>
&gt; <a href="http://www.kitware.com/products/protraining.html" target="_blank">http://www.kitware.com/products/protraining.html</a><br>
&gt;<br>
&gt; Please keep messages on-topic and check the ITK FAQ at:<br>
&gt; <a href="http://www.itk.org/Wiki/ITK_FAQ" target="_blank">http://www.itk.org/Wiki/ITK_FAQ</a><br>
&gt;<br>
&gt; Follow this link to subscribe/unsubscribe:<br>
&gt; <a href="http://www.itk.org/mailman/listinfo/insight-users" target="_blank">http://www.itk.org/mailman/listinfo/insight-users</a><br>
&gt;<br>
&gt;<br>
</div></div></blockquote></div><br></div>