[Gdcm-hackers] gdcm-git:Grassroots DICOM branch release updated. 2cda327ea622a1905506e0be6c5086fdc0
Cross-platform DICOM implementation
Brought to you by:
malat
|
From: Mathieu M. <ma...@us...> - 2022-09-23 13:35:10
|
This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Grassroots DICOM".
The branch, release has been updated
via 2cda327ea622a1905506e0be6c5086fdc06e31d9 (commit)
via 259e8d3fb4bcf93b2603f1c75d797bd5d2ab7e9e (commit)
via 4bde268028b84eca9db2229518d9ead3c9544252 (commit)
via 686b253b4fbee579ef51139b78ae457f5697fa36 (commit)
via 4759862de35850f4c7fb1ef9c0be84ed0cfc5ac9 (commit)
via 828ab57c6da3e888983e357535bffb5d0ce02115 (commit)
via 421985cd1c97348f5ac822c778fc04d2cbd5eb0b (commit)
via 89ecad08052d1e5e4745cf2fc8b3a2b3bf8db62c (commit)
via fd53ea07cebc38cebec2a7ef03c9ddf94acc9061 (commit)
from 50e47289102bf564771302e7cfd24422e37986ab (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
https://sourceforge.net/p/gdcm/gdcm/ci/2cda327ea622a1905506e0be6c5086fdc06e31d9/
commit 2cda327ea622a1905506e0be6c5086fdc06e31d9
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Sep 23 06:32:15 2022 -0700
Add hints
diff --git a/Utilities/gdcmext/csa.c b/Utilities/gdcmext/csa.c
index 0b7db9054..e0a0eb40c 100644
--- a/Utilities/gdcmext/csa.c
+++ b/Utilities/gdcmext/csa.c
@@ -160,6 +160,7 @@ static bool read_magic(struct app *self) {
assert(0);
return false;
}
+ assert(n > 0 && n < 128);
self->nelements = n;
self->csa_type = magic;
return true;
@@ -227,11 +228,19 @@ static bool read_info(struct app *self, struct csa_info *i) {
// vr
s = fread_mirror(i->vr, sizeof *i->vr, sizeof i->vr / sizeof *i->vr, self);
ERROR_RETURN(s, 4);
+ {
+ const char *s = i->vr;
+ assert(s[0] >= 'A' && s[0] <= 'Z');
+ assert(s[1] >= 'A' && s[1] <= 'Z');
+ assert(s[2] == 0);
+ if (self->csa_type == SV10) assert(s[3] == 0);
+ }
// syngodt (signed)
s = fread_mirror(&i->syngodt, sizeof i->syngodt, 1, self);
ERROR_RETURN(s, 1);
// numer of items
s = fread_mirror(&i->nitems, sizeof i->nitems, 1, self);
+ if (self->csa_type == SV10) assert(i->nitems % 6 == 0);
ERROR_RETURN(s, 1);
{
uint32_t unused;
diff --git a/Utilities/gdcmext/mec_mr3.c b/Utilities/gdcmext/mec_mr3.c
index ff30adcc2..98700e9f7 100644
--- a/Utilities/gdcmext/mec_mr3.c
+++ b/Utilities/gdcmext/mec_mr3.c
@@ -400,6 +400,7 @@ static bool mec_mr3_scrub(void *output, const void *input, size_t len) {
if (s != 1 || nitems == 0) {
good = false;
}
+ assert(nitems < 512);
if (good && nitems <= MAGIC_NUM_ELEMENTS) {
// special case to handle last groups
remain = nitems;
https://sourceforge.net/p/gdcm/gdcm/ci/259e8d3fb4bcf93b2603f1c75d797bd5d2ab7e9e/
commit 259e8d3fb4bcf93b2603f1c75d797bd5d2ab7e9e
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Sep 23 02:48:01 2022 -0700
Check a pseudo magic value
diff --git a/Source/MediaStorageAndFileFormat/gdcmCleaner.cxx b/Source/MediaStorageAndFileFormat/gdcmCleaner.cxx
index 03912d1dd..437154750 100644
--- a/Source/MediaStorageAndFileFormat/gdcmCleaner.cxx
+++ b/Source/MediaStorageAndFileFormat/gdcmCleaner.cxx
@@ -18,8 +18,8 @@
#include "gdcmDataSetHelper.h"
#include "gdcmDicts.h"
#include "gdcmEvent.h"
-#include "gdcmMEC_MR3.h"
#include "gdcmGlobal.h"
+#include "gdcmMEC_MR3.h"
#include "gdcmext/csa.h"
#include "gdcmext/mec_mr3.h"
@@ -643,7 +643,8 @@ struct Cleaner::impl {
static const PrivateTag &pmtf2 = gdcm::MEC_MR3::GetToshibaMECMR3Tag();
static const PrivateTag &pmtf3 = gdcm::MEC_MR3::GetCanonMECMR3Tag();
- if (pt == csa1 || pt == csa2 || pt == mec_mr3 || pt == pmtf1 || pt == pmtf2 || pt == pmtf3) {
+ if (pt == csa1 || pt == csa2 || pt == mec_mr3 || pt == pmtf1 ||
+ pt == pmtf2 || pt == pmtf3) {
scrub_privatetags.insert(pt);
return true;
}
@@ -798,6 +799,17 @@ static bool CleanMEC_MR3(DataSet &ds, const DataElement &de) {
clean.SetVR(de.GetVR());
std::vector<char> v;
v.resize(bv->GetLength());
+ {
+ // check a pseudo magic value here:
+ uint32_t magic = 0xffff;
+ if (bv->GetLength() > 4) {
+ memcpy(&magic, bv->GetPointer(), sizeof magic);
+ }
+ if (magic > 512) {
+ gdcmDebugMacro("Cannot handle MEC_MR3");
+ return true;
+ }
+ }
if (mec_mr3_memcpy(&v[0], bv->GetPointer(), bv->GetLength())) {
clean.SetByteValue(&v[0], v.size());
ds.Replace(clean);
@@ -814,7 +826,9 @@ static bool CleanPMTF(DataSet &ds, const DataElement &de) {
const char *input = bv->GetPointer();
const size_t len = bv->GetLength();
- bool success = true;
+ gdcm::Cleaner cleaner;
+ gdcm::File &file = cleaner.GetFile();
+ gdcm::DataSet &revds = file.GetDataSet();
try {
std::istringstream is;
{
@@ -826,13 +840,16 @@ static bool CleanPMTF(DataSet &ds, const DataElement &de) {
// FIXME gdcm::Cleaner will by default change defined length SQ into undef
// length...there is a risk of incompatibily with vendor
- gdcm::Cleaner cleaner;
- gdcm::File &file = cleaner.GetFile();
gdcm::FileMetaInformation &fmi = file.GetHeader();
fmi.SetDataSetTransferSyntax(gdcm::TransferSyntax::ExplicitVRLittleEndian);
- gdcm::DataSet &revds = file.GetDataSet();
revds.Read<gdcm::ExplicitDataElement, gdcm::SwapperNoOp>(is);
+ } catch (...) {
+ gdcmDebugMacro("Unhanded file format");
+ return true;
+ }
+ bool success = true;
+ try {
gdcm::VR vr = VR::PN;
cleaner.Empty(vr);
if (!cleaner.Clean()) {
@@ -1051,7 +1068,8 @@ bool Cleaner::impl::ProcessDataSet(Subject &subject, File &file, DataSet &ds,
static const PrivateTag &csa1 = CSAHeader::GetCSAImageHeaderInfoTag();
static const PrivateTag &csa2 = CSAHeader::GetCSASeriesHeaderInfoTag();
const PrivateTag mec_mr3(0x700d, 0x08, "TOSHIBA_MEC_MR3");
- static const PrivateTag &pmtf1 = gdcm::MEC_MR3::GetPMTFInformationDataTag();
+ static const PrivateTag &pmtf1 =
+ gdcm::MEC_MR3::GetPMTFInformationDataTag();
static const PrivateTag &pmtf2 = gdcm::MEC_MR3::GetToshibaMECMR3Tag();
static const PrivateTag &pmtf3 = gdcm::MEC_MR3::GetCanonMECMR3Tag();
https://sourceforge.net/p/gdcm/gdcm/ci/4bde268028b84eca9db2229518d9ead3c9544252/
commit 4bde268028b84eca9db2229518d9ead3c9544252
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Sep 23 02:46:00 2022 -0700
Add extra check
diff --git a/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.cxx b/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.cxx
index 247c831ed..5b8880667 100644
--- a/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.cxx
+++ b/Source/DataStructureAndEncodingDefinition/gdcmCSAHeader.cxx
@@ -1116,6 +1116,7 @@ bool CSAHeader::LoadFromDataElement(DataElement const &de)
ss.read((char*)&nitems, sizeof(nitems));
SwapperNoOp::SwapArray(&nitems,1);
csael.SetNoOfItems( nitems );
+ if( InternalType == SV10) { assert( nitems % 6 == 0 );}
//std::cout << "NoOfItems " << nitems << ", ";
uint32_t xx;
ss.read((char*)&xx, sizeof(xx));
https://sourceforge.net/p/gdcm/gdcm/ci/686b253b4fbee579ef51139b78ae457f5697fa36/
commit 686b253b4fbee579ef51139b78ae457f5697fa36
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Sep 16 00:52:19 2022 -0700
fix siemens attribute
they are bogus in official DCS...sigh
diff --git a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
index 22a9d10d3..35648870d 100644
--- a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
+++ b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
@@ -2965,6 +2965,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x07a1,0x0050,"ELSCINT1",VR::US,VM::VM1,"Tamar Site Id",false },
{0x07a1,0x0056,"ELSCINT1",VR::US,VM::VM1,"?",false },
{0x07a1,0x0058,"ELSCINT1",VR::CS,VM::VM1,"?",false },
+ {0x07a1,0x005a,"ELSCINT1",VR::CS,VM::VM1,"?",false },
{0x07a1,0x005d,"ELSCINT1",VR::DT,VM::VM1,"?",false },
{0x07a1,0x005f,"ELSCINT1",VR::CS,VM::VM1,"?",false },
{0x07a1,0x0070,"ELSCINT1",VR::SH,VM::VM1,"?patient name?",false },
@@ -10423,11 +10424,12 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0009,0x0075,"SIENET",VR::LO,VM::VM1,"?",false },
{0x0091,0x0020,"SIENET",VR::PN,VM::VM1_n,"Patient Name",false },
{0x0095,0x0001,"SIENET",VR::LO,VM::VM1,"Examination Folder ID",false },
- {0x0095,0x0004,"SIENET",VR::UL,VM::VM1,"Folder Reported Status",false },
+ {0x0095,0x0004,"SIENET",VR::SL,VM::VM1,"Folder Reported Status",false },
{0x0095,0x0005,"SIENET",VR::LO,VM::VM1,"Folder Reporting Radiologist",false },
{0x0095,0x0007,"SIENET",VR::LO,VM::VM1,"SIENET ISA PLA",false },
- {0x0095,0x000c,"SIENET",VR::UL,VM::VM1,"Folder Rebuild Status",false },
+ {0x0095,0x000c,"SIENET",VR::SL,VM::VM1,"Folder Rebuild Status",false },
{0x0095,0x0020,"SIENET",VR::UN,VM::VM1,"?",false },
+ {0x0095,0x00fb,"SIENET",VR::ST,VM::VM1,"?",false },
{0x0099,0x0002,"SIENET",VR::UL,VM::VM1,"Key Images",false },
{0x0099,0x0005,"SIENET",VR::SL,VM::VM1,"Image Number",false },
{0x0009,0x0010,"SPI",VR::LO,VM::VM1,"Comments",false },
diff --git a/Source/DataDictionary/privatedicts.xml b/Source/DataDictionary/privatedicts.xml
index e0c434370..036c2018c 100644
--- a/Source/DataDictionary/privatedicts.xml
+++ b/Source/DataDictionary/privatedicts.xml
@@ -2517,6 +2517,7 @@
<entry owner="ELSCINT1" group="07a1" element="xx43" vr="IS" vm="1" name="?"/>
<entry owner="ELSCINT1" group="07a1" element="xx50" vr="US" vm="1" name="Tamar Site Id"/>
<entry owner="ELSCINT1" group="07a1" element="xx56" vr="US" vm="1" name="?"/>
+ <entry owner="ELSCINT1" group="07a1" element="xx5a" vr="CS" vm="1" name="?"/>
<entry owner="ELSCINT1" group="07a1" element="xx75" vr="LO" vm="2" name="?"/>
<entry owner="ELSCINT1" group="07a1" element="xx85" vr="UL" vm="1" name="Tamar Translate Flags"/>
<entry owner="ELSCINT1" group="07a1" element="xx9f" vr="CS" vm="1" name="?"/>
@@ -9286,11 +9287,12 @@
<entry owner="SIENET" group="0009" element="xx75" vr="LO" vm="1" name="?"/>
<entry owner="SIENET" group="0091" element="xx20" vr="PN" vm="1-n" name="Patient Name"/>
<entry owner="SIENET" group="0095" element="xx01" vr="LO" vm="1" name="Examination Folder ID"/>
- <entry owner="SIENET" group="0095" element="xx04" vr="UL" vm="1" name="Folder Reported Status"/>
+ <entry owner="SIENET" group="0095" element="xx04" vr="SL" vm="1" name="Folder Reported Status"/>
<entry owner="SIENET" group="0095" element="xx05" vr="LO" vm="1" name="Folder Reporting Radiologist"/>
<entry owner="SIENET" group="0095" element="xx07" vr="LO" vm="1" name="SIENET ISA PLA"/>
- <entry owner="SIENET" group="0095" element="xx0c" vr="UL" vm="1" name="Folder Rebuild Status"/>
+ <entry owner="SIENET" group="0095" element="xx0c" vr="SL" vm="1" name="Folder Rebuild Status"/>
<entry owner="SIENET" group="0095" element="xx20" vr="UN" vm="1" name="?"/>
+ <entry owner="SIENET" group="0095" element="xxfb" vr="ST" vm="1" name="?"/>
<entry owner="SIENET" group="0099" element="xx02" vr="UL" vm="1" name="Key Images"/>
<entry owner="SIENET" group="0099" element="xx05" vr="SL" vm="1" name="Image Number"/>
<entry owner="SPI" group="0009" element="xx10" vr="LO" vm="1" name="Comments"/>
https://sourceforge.net/p/gdcm/gdcm/ci/4759862de35850f4c7fb1ef9c0be84ed0cfc5ac9/
commit 4759862de35850f4c7fb1ef9c0be84ed0cfc5ac9
Author: Mathieu Malaterre <mat...@gm...>
Date: Fri Sep 16 00:52:12 2022 -0700
add debug
diff --git a/Applications/Cxx/gdcmdump.cxx b/Applications/Cxx/gdcmdump.cxx
index b781f2c8c..db9299a2d 100644
--- a/Applications/Cxx/gdcmdump.cxx
+++ b/Applications/Cxx/gdcmdump.cxx
@@ -1074,7 +1074,9 @@ static int PrintCSABase64Impl(gdcm::CSAHeader &csa, std::string const & csaname
return 1;
}
gdcm::Printer p;
+ //gdcm::DictPrinter p;
p.SetFile( file );
+ //p.SetColor( 1 );
std::cout << "--" << csaname << "--" << std::endl;
p.Print(std::cout);
}
https://sourceforge.net/p/gdcm/gdcm/ci/828ab57c6da3e888983e357535bffb5d0ce02115/
commit 828ab57c6da3e888983e357535bffb5d0ce02115
Author: Mathieu Malaterre <mat...@gm...>
Date: Thu Sep 15 23:38:16 2022 -0700
Add SIEMENS MR FMRI
diff --git a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
index a83bc0bc4..22a9d10d3 100644
--- a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
+++ b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
@@ -38,6 +38,29 @@ using DICT_ENTRY = struct
};
static const DICT_ENTRY DICOMV3DataDict [] = {
+ {0x0021,0x0010,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0011,"SIEMENS MR FMRI",VR::LO,VM::VM1,"?",false },
+ {0x0021,0x0012,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0013,"SIEMENS MR FMRI",VR::US,VM::VM1,"?",false },
+ {0x0021,0x0014,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0015,"SIEMENS MR FMRI",VR::US,VM::VM1,"?",false },
+ {0x0021,0x0016,"SIEMENS MR FMRI",VR::LO,VM::VM1,"?",false },
+ {0x0021,0x0017,"SIEMENS MR FMRI",VR::US,VM::VM1,"?",false },
+ {0x0021,0x0018,"SIEMENS MR FMRI",VR::UL,VM::VM1,"?",false },
+ {0x0021,0x0019,"SIEMENS MR FMRI",VR::FL,VM::VM1,"?",false },
+ {0x0021,0x0031,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0040,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0041,"SIEMENS MR FMRI",VR::LO,VM::VM1,"?",false },
+ {0x0021,0x0042,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0043,"SIEMENS MR FMRI",VR::LO,VM::VM1,"?",false },
+ {0x0021,0x0044,"SIEMENS MR FMRI",VR::US,VM::VM1,"?",false },
+ {0x0021,0x0045,"SIEMENS MR FMRI",VR::LO,VM::VM1_n,"?",false },
+ {0x0021,0x0046,"SIEMENS MR FMRI",VR::SQ,VM::VM1,"?",false },
+ {0x0021,0x0047,"SIEMENS MR FMRI",VR::UL,VM::VM1,"?",false },
+ {0x0021,0x0048,"SIEMENS MR FMRI",VR::LO,VM::VM1,"?",false },
+ {0x0021,0x0049,"SIEMENS MR FMRI",VR::FD,VM::VM1,"?",false },
+ {0x0021,0x004a,"SIEMENS MR FMRI",VR::FD,VM::VM1_n,"?",false },
+ {0x0021,0x004b,"SIEMENS MR FMRI",VR::FL,VM::VM1,"?",false },
{0x0009,0x0002,"CANON_MEC_MR3^10",VR::SH,VM::VM1,"?",false },
{0x0011,0x0003,"CANON_MEC_MR3^10",VR::US,VM::VM1,"?",false },
{0x0011,0x0004,"CANON_MEC_MR3^10",VR::SQ,VM::VM1,"?",false },
diff --git a/Source/DataDictionary/privatedicts.xml b/Source/DataDictionary/privatedicts.xml
index bd5abc996..e0c434370 100644
--- a/Source/DataDictionary/privatedicts.xml
+++ b/Source/DataDictionary/privatedicts.xml
@@ -11,6 +11,29 @@
PURPOSE. See the above copyright notice for more information.
-->
<dict>
+<entry group="0021" element="0010" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0011" vr="LO" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0012" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0013" vr="US" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0014" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0015" vr="US" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0016" vr="LO" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0017" vr="US" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0018" vr="UL" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0019" vr="FL" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0031" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0040" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0041" vr="LO" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0042" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0043" vr="LO" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0044" vr="US" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0045" vr="LO" vm="1-n" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0046" vr="SQ" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0047" vr="UL" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0048" vr="LO" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="0049" vr="FD" vm="1" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="004a" vr="FD" vm="1-n" name="?" owner="SIEMENS MR FMRI"/>
+<entry group="0021" element="004b" vr="FL" vm="1" name="?" owner="SIEMENS MR FMRI"/>
<entry group="0009" element="0002" vr="SH" vm="1" name="?" owner="CANON_MEC_MR3^10"/>
<entry group="0011" element="0003" vr="US" vm="1" name="?" owner="CANON_MEC_MR3^10"/>
<entry group="0011" element="0004" vr="SQ" vm="1" name="?" owner="CANON_MEC_MR3^10"/>
https://sourceforge.net/p/gdcm/gdcm/ci/421985cd1c97348f5ac822c778fc04d2cbd5eb0b/
commit 421985cd1c97348f5ac822c778fc04d2cbd5eb0b
Author: Mathieu Malaterre <mat...@gm...>
Date: Thu Sep 15 08:26:09 2022 -0700
implement csa64 mode
diff --git a/Applications/Cxx/gdcmdump.cxx b/Applications/Cxx/gdcmdump.cxx
index 0a6e3b5ed..b781f2c8c 100644
--- a/Applications/Cxx/gdcmdump.cxx
+++ b/Applications/Cxx/gdcmdump.cxx
@@ -1040,26 +1040,14 @@ static int PrintPDB(const std::string & filename, bool verbose)
return ret;
}
-static int PrintCSABase64(const std::string & filename, const char * name)
+static int PrintCSABase64Impl(gdcm::CSAHeader &csa, std::string const & csaname )
{
- gdcm::Reader reader;
- reader.SetFileName( filename.c_str() );
- if( !reader.Read() )
- {
- std::cerr << "Failed to read: " << filename << std::endl;
- return 1;
- }
- const gdcm::DataSet& ds = reader.GetFile().GetDataSet();
-
- gdcm::CSAHeader csa;
- const gdcm::PrivateTag &t1 = csa.GetCSAImageHeaderInfoTag();
- if( !ds.FindDataElement( t1 ) ) return 1;
- csa.LoadFromDataElement( ds.GetDataElement( t1 ) );
-
+ const char *name = csaname.c_str();
if( csa.FindCSAElementByName(name) )
{
const gdcm::CSAElement & el = csa.GetCSAElementByName(name);
- if( el.IsEmpty() ) return 1;
+ // this is not error if empty:
+ if( el.IsEmpty() ) return 0;
const gdcm::ByteValue* bv = el.GetByteValue();
std::string str( bv->GetPointer(), bv->GetLength() );
str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
@@ -1087,11 +1075,45 @@ static int PrintCSABase64(const std::string & filename, const char * name)
}
gdcm::Printer p;
p.SetFile( file );
+ std::cout << "--" << csaname << "--" << std::endl;
p.Print(std::cout);
}
return 0;
}
+static int PrintCSABase64(const std::string & filename, std::vector<std::string> const & csanames )
+{
+ gdcm::Reader reader;
+ reader.SetFileName( filename.c_str() );
+ if( !reader.Read() )
+ {
+ std::cerr << "Failed to read: " << filename << std::endl;
+ return 1;
+ }
+ const gdcm::DataSet& ds = reader.GetFile().GetDataSet();
+
+ int ret = 0;
+
+ gdcm::CSAHeader csa;
+ const gdcm::PrivateTag &t1 = csa.GetCSAImageHeaderInfoTag();
+ if( !ds.FindDataElement( t1 ) ) return 1;
+ csa.LoadFromDataElement( ds.GetDataElement( t1 ) );
+ for( std::vector<std::string>::const_iterator it = csanames.begin();
+ it != csanames.end(); ++it ) {
+ ret += PrintCSABase64Impl(csa, *it );
+ }
+
+ const gdcm::PrivateTag &t2 = csa.GetCSASeriesHeaderInfoTag();
+ if( !ds.FindDataElement( t2 ) ) return 1;
+ csa.LoadFromDataElement( ds.GetDataElement( t2 ) );
+ for( std::vector<std::string>::const_iterator it = csanames.begin();
+ it != csanames.end(); ++it ) {
+ ret += PrintCSABase64Impl(csa, *it );
+ }
+
+ return ret;
+}
+
static int PrintCSA(const std::string & filename)
{
gdcm::Reader reader;
@@ -1271,6 +1293,7 @@ static void PrintHelp()
std::cout << " -C --csa print SIEMENS CSA Header (0029,[12]0,SIEMENS CSA HEADER)." << std::endl;
std::cout << " --csa-asl print decoded SIEMENS CSA MR_ASL (base64)." << std::endl;
std::cout << " --csa-diffusion print decoded SIEMENS CSA MRDiffusion (base64)." << std::endl;
+ std::cout << " --csa64 print decoded SIEMENS CSA FMRI/MR_ASL/MRDiffusion... (base64)." << std::endl;
std::cout << " --mrprotocol print SIEMENS CSA MrProtocol only (within ASCCONV BEGIN/END)." << std::endl;
std::cout << " or Phoenix Meta Protocol (0021,19,SIEMENS MR SDS 01)." << std::endl;
std::cout << " -P --pdb print GEMS Protocol Data Block (0025,1b,GEMS_SERS_01)." << std::endl;
@@ -1312,6 +1335,7 @@ int main (int argc, char *argv[])
int printmedcom = 0; // MedCom History Information
int printcsaasl = 0;
int printcsadiffusion = 0;
+ int printcsa64 = 0;
int printpdb = 0;
int printelscint = 0;
int printvepro = 0;
@@ -1363,6 +1387,7 @@ int main (int argc, char *argv[])
{"ct3", 0, &printct3, 1},
{"csa-asl", 0, &printcsaasl, 1},
{"csa-diffusion", 0, &printcsadiffusion, 1},
+ {"csa64", 0, &printcsa64, 1},
{"mrprotocol", 0, &printmrprotocol, 1},
{"pmtf", 0, &printpmtf, 1},
{"mecmr3", 0, &printpmtf, 1},
@@ -1539,16 +1564,26 @@ int main (int argc, char *argv[])
std::cerr << "Not handled for now" << std::endl;
}
- const char * csaname = nullptr;
+ std::vector<std::string> csanames;
if( printcsaasl )
{
printcsabase64 = 1;
- csaname = "MR_ASL";
+ csanames.push_back( "MR_ASL" );
}
else if( printcsadiffusion )
{
printcsabase64 = 1;
- csaname = "MRDiffusion";
+ csanames.push_back( "MRDiffusion" );
+ }
+ else if( printcsa64 )
+ {
+ printcsabase64 = 1;
+ // keep me sorted
+ csanames.push_back( "FmriAcquisitionDescriptionSequence" );
+ csanames.push_back( "FmriConditionsDataSequence" );
+ csanames.push_back( "FmriResultSequence" );
+ csanames.push_back( "MR_ASL" );
+ csanames.push_back( "MRDiffusion" );
}
// else
@@ -1615,7 +1650,7 @@ int main (int argc, char *argv[])
}
else if( printcsabase64 )
{
- res += PrintCSABase64(*it, csaname);
+ res += PrintCSABase64(*it, csanames);
}
else if( dump )
{
@@ -1682,7 +1717,7 @@ int main (int argc, char *argv[])
}
else if( printcsabase64 )
{
- res += PrintCSABase64(filename, csaname);
+ res += PrintCSABase64(filename, csanames);
}
else if( dump )
{
https://sourceforge.net/p/gdcm/gdcm/ci/89ecad08052d1e5e4745cf2fc8b3a2b3bf8db62c/
commit 89ecad08052d1e5e4745cf2fc8b3a2b3bf8db62c
Author: Mathieu Malaterre <mat...@gm...>
Date: Wed Sep 14 05:00:07 2022 -0700
hande missing case
diff --git a/Utilities/gdcmext/csa.c b/Utilities/gdcmext/csa.c
index ffee00f91..0b7db9054 100644
--- a/Utilities/gdcmext/csa.c
+++ b/Utilities/gdcmext/csa.c
@@ -251,7 +251,7 @@ static bool read_data(struct app *self, struct csa_item_data *d) {
uint32_t unused;
s = fread_mirror(&unused, sizeof unused, 1, self);
ERROR_RETURN(s, 1);
- assert(unused == d->len || unused == 0x4d);
+ assert(unused == d->len || unused == 0x4d || unused == 0xcd);
}
if (d->len != 0) {
https://sourceforge.net/p/gdcm/gdcm/ci/fd53ea07cebc38cebec2a7ef03c9ddf94acc9061/
commit fd53ea07cebc38cebec2a7ef03c9ddf94acc9061
Author: Mathieu Malaterre <mat...@gm...>
Date: Wed Sep 14 04:58:06 2022 -0700
Fix VM
diff --git a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
index 647d5d0d9..a83bc0bc4 100644
--- a/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
+++ b/Source/DataDictionary/gdcmPrivateDefaultDicts.cxx
@@ -1232,7 +1232,7 @@ static const DICT_ENTRY DICOMV3DataDict [] = {
{0x0021,0x005a,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"?Sequence Variant 1?",false},
{0x0021,0x005b,"SIEMENS MR SDI 02",VR::FD,VM::VM3,"Image Position (Patient)",false},
{0x0021,0x005b,"SIEMENS MR SDS 01",VR::CS,VM::VM1_n,"?Sequence Variant 2?",false},
- {0x0021,0x005c,"SIEMENS MR SDS 01",VR::CS,VM::VM1,"MTR flag. MT => ON",false},
+ {0x0021,0x005c,"SIEMENS MR SDS 01",VR::CS,VM::VM1_n,"MTR flag. MT => ON",false},
{0x0021,0x005d,"SIEMENS MR SDS 01",VR::SL,VM::VM1,"??",false},
{0x0021,0x005e,"SIEMENS MR SDI 02",VR::IS,VM::VM1,"?FrameIndex?",false},
{0x0021,0x005e,"SIEMENS MR SDS 01",VR::LO,VM::VM1,"?",false},
-----------------------------------------------------------------------
Summary of changes:
Applications/Cxx/gdcmdump.cxx | 79 ++++++++++++++++------
Source/DataDictionary/gdcmPrivateDefaultDicts.cxx | 31 ++++++++-
Source/DataDictionary/privatedicts.xml | 29 +++++++-
.../gdcmCSAHeader.cxx | 1 +
Source/MediaStorageAndFileFormat/gdcmCleaner.cxx | 32 +++++++--
Utilities/gdcmext/csa.c | 11 ++-
Utilities/gdcmext/mec_mr3.c | 1 +
7 files changed, 150 insertions(+), 34 deletions(-)
hooks/post-receive
--
Grassroots DICOM
|