/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #include "gdcmReader.h" #include "gdcmImage.h" #include "gdcmImageWriter.h" #include "gdcmDataElement.h" #include "gdcmPrivateTag.h" #include "gdcmUIDGenerator.h" #include #include #include bool PrintNameValueMapping( gdcm::SequenceOfItems *sqi_values, gdcm::SequenceOfItems *sqi_names, std::string const & indent ) { using namespace gdcm; // prepare names mapping: typedef VRToType::Type UL; std::map< UL, std::string > names; assert( sqi_names ); assert( sqi_values ); SequenceOfItems::SizeType s = sqi_names->GetNumberOfItems(); PrivateTag tindex(0x7fe1,0x71,"GEMS_Ultrasound_MovieGroup_001"); PrivateTag tname (0x7fe1,0x72,"GEMS_Ultrasound_MovieGroup_001"); // First sequence contains all possible names (this is a dict) for( SequenceOfItems::SizeType i = 1; i <= s; ++i ) { const Item & item = sqi_names->GetItem( i ); const DataSet & ds = item.GetNestedDataSet(); if( !ds.FindDataElement( tindex ) || !ds.FindDataElement( tname ) ) { assert( 0 ); return false; } const DataElement & index = ds.GetDataElement( tindex ); const DataElement & name = ds.GetDataElement( tname ); if( index.IsEmpty() || name.IsEmpty() ) { assert( 0 ); return false; } gdcm::Element el1; el1.SetFromDataElement( index ); gdcm::Element el2; el2.SetFromDataElement( name ); // std::cout << el1.GetValue() << " " << el2.GetValue() << std::endl; names.insert( std::make_pair( el1.GetValue(), el2.GetValue() ) ); } SequenceOfItems::SizeType s2 = sqi_values->GetNumberOfItems(); assert( s2 <= s ); PrivateTag tindex2(0x7fe1,0x48,"GEMS_Ultrasound_MovieGroup_001"); for( SequenceOfItems::SizeType i = 1; i <= s2; ++i ) { const Item & item = sqi_values->GetItem( i ); const DataSet & ds = item.GetNestedDataSet(); if( !ds.FindDataElement( tindex2 ) ) { assert( 0 ); return false; } const DataElement & index2 = ds.GetDataElement( tindex2 ); if( index2.IsEmpty() ) { assert( 0 ); return false; } gdcm::Element el1; el1.SetFromDataElement( index2 ); UL copy = (UL)el1.GetValue(); #if 1 std::cout << indent; std::cout << "( " << names[ copy ]; #endif // (7fe1,1052) FD 1560 # 8,1 ? // (7fe1,1057) LT [MscSkelSup] # 10,1 ? //PrivateTag tvalue(0x7fe1,0x52,"GEMS_Ultrasound_MovieGroup_001"); PrivateTag tvalueint(0x7fe1,0x49,"GEMS_Ultrasound_MovieGroup_001"); // UL PrivateTag tvaluefloat1(0x7fe1,0x51,"GEMS_Ultrasound_MovieGroup_001"); // FL PrivateTag tvaluefloat(0x7fe1,0x52,"GEMS_Ultrasound_MovieGroup_001"); // FD PrivateTag tvalueul(0x7fe1,0x53,"GEMS_Ultrasound_MovieGroup_001"); // UL PrivateTag tvaluesl(0x7fe1,0x54,"GEMS_Ultrasound_MovieGroup_001"); // SL PrivateTag tvalueob(0x7fe1,0x55,"GEMS_Ultrasound_MovieGroup_001"); // OB PrivateTag tvaluetext(0x7fe1,0x57,"GEMS_Ultrasound_MovieGroup_001"); // LT PrivateTag tvaluefd(0x7fe1,0x77,"GEMS_Ultrasound_MovieGroup_001"); // FD / 1-N PrivateTag tvaluesl3(0x7fe1,0x79,"GEMS_Ultrasound_MovieGroup_001"); // SL / 1-N PrivateTag tvaluesl2(0x7fe1,0x86,"GEMS_Ultrasound_MovieGroup_001"); // SL ?? PrivateTag tvaluefd1(0x7fe1,0x87,"GEMS_Ultrasound_MovieGroup_001"); // FD / 1-N PrivateTag tvaluefloat2(0x7fe1,0x88,"GEMS_Ultrasound_MovieGroup_001"); // FD ?? #if 1 std::cout << " ) = "; #endif if( ds.FindDataElement( tvalueint ) ) { const DataElement & value = ds.GetDataElement( tvalueint ); gdcm::Element el2; el2.SetFromDataElement( value ); std::cout << el2.GetValue() << std::endl; } else if( ds.FindDataElement( tvaluefloat1 ) ) { const DataElement & value = ds.GetDataElement( tvaluefloat1 ); gdcm::Element el2; el2.SetFromDataElement( value ); std::cout << el2.GetValue() << std::endl; } else if( ds.FindDataElement( tvaluefloat ) ) { const DataElement & value = ds.GetDataElement( tvaluefloat ); gdcm::Element el2; el2.SetFromDataElement( value ); std::cout << el2.GetValue() << std::endl; } else if( ds.FindDataElement( tvaluesl ) ) { const DataElement & value = ds.GetDataElement( tvaluesl ); gdcm::Element el2; el2.SetFromDataElement( value ); std::cout << el2.GetValue() << std::endl; } else if( ds.FindDataElement( tvalueul ) ) { const DataElement & value = ds.GetDataElement( tvalueul ); gdcm::Element el2; el2.SetFromDataElement( value ); assert( el2.GetLength() == 1 ); std::cout << el2.GetValue() << std::endl; } else if( ds.FindDataElement( tvalueob ) ) { const DataElement & value = ds.GetDataElement( tvalueob ); // gdcm::Element el2; // el2.SetFromDataElement( value ); // std::cout << el2.GetValue() << std::endl; std::cout << value << std::endl; } else if( ds.FindDataElement( tvaluetext ) ) { const DataElement & value = ds.GetDataElement( tvaluetext ); gdcm::Element el2; el2.SetFromDataElement( value ); std::cout << el2.GetValue() << std::endl; } else if( ds.FindDataElement( tvaluesl2 ) ) { const DataElement & value = ds.GetDataElement( tvaluesl2 ); gdcm::Element el2; el2.SetFromDataElement( value ); el2.Print( std::cout ); assert( el2.GetLength() == 4 ); std::cout << std::endl; } else if( ds.FindDataElement( tvaluesl3 ) ) { const DataElement & value = ds.GetDataElement( tvaluesl3 ); gdcm::Element el2; el2.SetFromDataElement( value ); el2.Print( std::cout ); // assert( el2.GetLength() == 4 ); std::cout << std::endl; } else if( ds.FindDataElement( tvaluefd ) ) { const DataElement & value = ds.GetDataElement( tvaluefd ); gdcm::Element el2; el2.SetFromDataElement( value ); el2.Print( std::cout ); // assert( el2.GetLength() == 4 || el2.GetLength() == 3 || el2.GetLength() == 8 ); std::cout << std::endl; } else if( ds.FindDataElement( tvaluefloat2 ) ) { const DataElement & value = ds.GetDataElement( tvaluefloat2 ); gdcm::Element el2; el2.SetFromDataElement( value ); el2.Print( std::cout ); assert( el2.GetLength() == 2 ); std::cout << std::endl; } else if( ds.FindDataElement( tvaluefd1 ) ) { const DataElement & value = ds.GetDataElement( tvaluefd1 ); gdcm::Element el2; el2.SetFromDataElement( value ); el2.Print( std::cout ); assert( el2.GetLength() == 4 ); std::cout << std::endl; } else { std::cout << "(no value)" << std::endl; // std::cout << ds << std::endl; assert( ds.Size() == 2 ); } } return true; } bool PrintNameValueMapping2( gdcm::PrivateTag const & privtag, const gdcm::DataSet & ds , gdcm::SequenceOfItems *sqi_names, std::string const & indent ) { if( !ds.FindDataElement( privtag ) ) return false; const gdcm::DataElement& seq_values = ds.GetDataElement( privtag ); gdcm::SmartPointer sqi = seq_values.GetValueAsSQ(); return PrintNameValueMapping( sqi, sqi_names, indent); } bool PrintNameValueMapping3( gdcm::PrivateTag const & privtag1, gdcm::PrivateTag const & privtag2, const gdcm::DataSet & ds , gdcm::SequenceOfItems *sqi_names, std::string const & indent ) { if( !ds.FindDataElement( privtag1 ) ) { assert( 0 ); return false; } const gdcm::DataElement& values10name = ds.GetDataElement( privtag1 ); gdcm::Element el; el.SetFromDataElement( values10name ); std::cout << std::endl; std::cout << " <" << el.GetValue().c_str() << ">" << std::endl; return PrintNameValueMapping2( privtag2, ds, sqi_names, indent); } bool print73( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent ) { const gdcm::PrivateTag tseq_values73(0x7fe1,0x73,"GEMS_Ultrasound_MovieGroup_001"); if( !ds10.FindDataElement( tseq_values73 ) ) { std::cout << indent << "No group 73" << std::endl; return false; } const gdcm::DataElement& seq_values73 = ds10.GetDataElement( tseq_values73 ); gdcm::SmartPointer sqi_values73 = seq_values73.GetValueAsSQ(); size_t ni3 = sqi_values73->GetNumberOfItems(); for( size_t i3 = 1; i3 <= ni3; ++i3 ) { gdcm::Item &item_73 = sqi_values73->GetItem(i3); gdcm::DataSet &ds73 = item_73.GetNestedDataSet(); assert( ds73.Size() == 3 ); const gdcm::PrivateTag tseq_values74name(0x7fe1,0x74,"GEMS_Ultrasound_MovieGroup_001"); const gdcm::PrivateTag tseq_values75(0x7fe1,0x75,"GEMS_Ultrasound_MovieGroup_001"); PrintNameValueMapping3( tseq_values74name, tseq_values75, ds73, sqi_dict, indent); std::cout << std::endl; } return true; } bool print36( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent ) { (void)sqi_dict; const gdcm::PrivateTag tseq_values36(0x7fe1,0x36,"GEMS_Ultrasound_MovieGroup_001"); if( !ds10.FindDataElement( tseq_values36 ) ) { std::cout << indent << "No group 36" << std::endl; return false; } const gdcm::DataElement& seq_values36 = ds10.GetDataElement( tseq_values36 ); gdcm::SmartPointer sqi_values36 = seq_values36.GetValueAsSQ(); size_t ni3 = sqi_values36->GetNumberOfItems(); assert( ni3 >= 1 ); for( size_t i3 = 1; i3 <= ni3; ++i3 ) { gdcm::Item &item_36 = sqi_values36->GetItem(i3); gdcm::DataSet &ds36 = item_36.GetNestedDataSet(); assert( ds36.Size() == 4 ); // (7fe1,1037) UL 47 # 4,1 US MovieGroup Number of Frames // (7fe1,1043) OB 40\00\1c\c4\67\2f\0b\11\40 # 376,1 ? // (7fe1,1060) OB 4e\4e\49\4f\4e\47\46\43\2a # 4562714,1 US MovieGroup Image Data // const gdcm::PrivateTag timagedata(0x7fe1,0x60,"GEMS_Ultrasound_MovieGroup_001"); assert( ds36.FindDataElement( timagedata ) ); gdcm::DataElement const & imagedata = ds36.GetDataElement( timagedata ); const gdcm::ByteValue * bv = imagedata.GetByteValue(); assert( bv ); static int c = 0; std::stringstream ss; ss << "/tmp/debug"; ss << c++; std::ofstream os( ss.str().c_str(), std::ios::binary ); os.write( bv->GetPointer(), bv->GetLength() ); os.close(); //const gdcm::PrivateTag tseq_values85(0x7fe1,0x85,"GEMS_Ultrasound_MovieGroup_001"); //PrintNameValueMapping3( tseq_values84name, tseq_values85, ds83, sqi_dict, indent); //std::cout << std::endl; } return true; } bool print83( gdcm::DataSet const & ds10, gdcm::SequenceOfItems *sqi_dict, std::string const & indent ) { const gdcm::PrivateTag tseq_values83(0x7fe1,0x83,"GEMS_Ultrasound_MovieGroup_001"); if( !ds10.FindDataElement( tseq_values83 ) ) { std::cout << indent << "No group 83" << std::endl; return false; } const gdcm::DataElement& seq_values83 = ds10.GetDataElement( tseq_values83 ); gdcm::SmartPointer sqi_values83 = seq_values83.GetValueAsSQ(); size_t ni3 = sqi_values83->GetNumberOfItems(); for( size_t i3 = 1; i3 <= ni3; ++i3 ) { gdcm::Item &item_83 = sqi_values83->GetItem(i3); gdcm::DataSet &ds83 = item_83.GetNestedDataSet(); assert( ds83.Size() == 3 ); const gdcm::PrivateTag tseq_values84name(0x7fe1,0x84,"GEMS_Ultrasound_MovieGroup_001"); const gdcm::PrivateTag tseq_values85(0x7fe1,0x85,"GEMS_Ultrasound_MovieGroup_001"); PrintNameValueMapping3( tseq_values84name, tseq_values85, ds83, sqi_dict, indent); std::cout << std::endl; } return true; } bool PrintNameValueMapping4( gdcm::PrivateTag const & privtag0, const gdcm::DataSet & subds, gdcm::PrivateTag const & privtag1, gdcm::PrivateTag const & privtag2, gdcm::SequenceOfItems *sqi_dict, std::string const & indent ) { (void)indent; if( !subds.FindDataElement( privtag0 ) ) { assert( 0 ); return false; } const gdcm::DataElement& seq_values10 = subds.GetDataElement( privtag0 ); gdcm::SmartPointer sqi_values10 = seq_values10.GetValueAsSQ(); size_t ni1 = sqi_values10->GetNumberOfItems(); // assert( ni1 == 1 ); for( size_t i1 = 1; i1 <= ni1; ++i1 ) { gdcm::Item &item_10 = sqi_values10->GetItem(i1); gdcm::DataSet &ds10 = item_10.GetNestedDataSet(); assert( ds10.Size() == 2 + 3 ); // (7fe1,0010) // (7fe1,1012) // (7fe1,1018) // (7fe1,1020) // (7fe1,1083) PrintNameValueMapping3( privtag1, privtag2, ds10, sqi_dict, " " ); std::cout << std::endl; const gdcm::PrivateTag tseq_values20(0x7fe1,0x20,"GEMS_Ultrasound_MovieGroup_001"); if( !ds10.FindDataElement( tseq_values20 ) ) { assert( 0 ); return false; } const gdcm::DataElement& seq_values20 = ds10.GetDataElement( tseq_values20 ); gdcm::SmartPointer sqi_values20 = seq_values20.GetValueAsSQ(); size_t ni2 = sqi_values20->GetNumberOfItems(); //assert( ni == 1 ); for( size_t i2 = 1; i2 <= ni2; ++i2 ) { gdcm::Item &item_20 = sqi_values20->GetItem(i2); gdcm::DataSet &ds20 = item_20.GetNestedDataSet(); size_t count = ds20.Size(); (void)count; assert( ds20.Size() == 2 + 3 || ds20.Size() == 2 + 2 ); // (7fe1,0010) // (7fe1,1024) // (7fe1,1026) // (7fe1,1036) // (7fe1,103a) // (7fe1,1083) (*) const gdcm::PrivateTag tseq_values20name(0x7fe1,0x24,"GEMS_Ultrasound_MovieGroup_001"); const gdcm::PrivateTag tseq_values26(0x7fe1,0x26,"GEMS_Ultrasound_MovieGroup_001"); PrintNameValueMapping3( tseq_values20name, tseq_values26, ds20, sqi_dict, " "); std::cout << std::endl; print36(ds20, sqi_dict, " "); print83(ds20, sqi_dict, " "); } print83(ds10, sqi_dict, " "); } return true; } int main(int argc, char *argv[]) { if( argc < 2 ) return 1; using namespace gdcm; const char *filename = argv[1]; gdcm::Reader reader; reader.SetFileName( filename ); if( !reader.Read() ) return 1; gdcm::File &file = reader.GetFile(); gdcm::DataSet &ds = file.GetDataSet(); const PrivateTag tseq(0x7fe1,0x1,"GEMS_Ultrasound_MovieGroup_001"); if( !ds.FindDataElement( tseq ) ) return 1; const DataElement& seq = ds.GetDataElement( tseq ); SmartPointer sqi = seq.GetValueAsSQ(); assert( sqi->GetNumberOfItems() == 1 ); Item &item = sqi->GetItem(1); DataSet &subds = item.GetNestedDataSet(); const PrivateTag tseq_dict(0x7fe1,0x70,"GEMS_Ultrasound_MovieGroup_001"); if( !subds.FindDataElement( tseq_dict ) ) return 1; const DataElement& seq_dict = subds.GetDataElement( tseq_dict ); SmartPointer sqi_dict = seq_dict.GetValueAsSQ(); const PrivateTag tseq_values8(0x7fe1,0x8,"GEMS_Ultrasound_MovieGroup_001"); if( !subds.FindDataElement( tseq_values8 ) ) return 1; const DataElement& seq_values8 = subds.GetDataElement( tseq_values8 ); SmartPointer sqi_values8 = seq_values8.GetValueAsSQ(); const PrivateTag tseq_values8name(0x7fe1,0x2,"GEMS_Ultrasound_MovieGroup_001"); if( !subds.FindDataElement( tseq_values8name ) ) return 1; const DataElement& values8name = subds.GetDataElement( tseq_values8name ); { Element el; el.SetFromDataElement( values8name ); std::cout << el.GetValue() << std::endl; } size_t count = subds.Size(); (void)count; assert( subds.Size() == 3 + 2 + 1 || subds.Size() == 3 + 2 + 2); // (7fe1,0010) # 30,1 Private Creator // (7fe1,1002) # 8,1 US MovieGroup Value 0008 Name // (7fe1,1003) # 4,1 ? // (7fe1,1008) # 8140,1 US MovieGroup Value 0008 Sequence // (7fe1,1010) # 1372196,1 ? // (7fe1,1070) # 33684,1 US MovieGroup Dict // (7fe1,1073) (*) PrintNameValueMapping( sqi_values8, sqi_dict, " "); const PrivateTag tseq_values10(0x7fe1,0x10,"GEMS_Ultrasound_MovieGroup_001"); const PrivateTag tseq_values10name(0x7fe1,0x12,"GEMS_Ultrasound_MovieGroup_001"); const PrivateTag tseq_values18(0x7fe1,0x18,"GEMS_Ultrasound_MovieGroup_001"); PrintNameValueMapping4( tseq_values10, subds, tseq_values10name, tseq_values18, sqi_dict," "); print73( subds, sqi_dict, " " ); #if 0 gdcm::DataSet::ConstIterator it = subds.Begin(); for( ; it != subds.End(); ++it ) { const gdcm::DataElement &de = *it; std::cout << de.GetTag() << std::endl; } #endif return 0; }