GDCM 2.2.0

- Main Page
- Related Pages
- Namespaces
- Classes
- Files
- Directories
- Examples

DumpGEMSMovieGroup.cxx

    /*=========================================================================

      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 <iostream>
    #include <string>

    #include <map>

    bool PrintNameValueMapping( gdcm::SequenceOfItems *sqi_values,
    gdcm::SequenceOfItems *sqi_names, std::string const & indent )
    {
      using namespace gdcm;
      // prepare names mapping:
      typedef VRToType<VR::UL>::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 ) )
          {
          return false;
          }
        const DataElement & index = ds.GetDataElement( tindex );
        const DataElement & name = ds.GetDataElement( tname );
        if( index.IsEmpty() || name.IsEmpty() )
          {
          return false;
          }
        gdcm::Element<VR::UL, VM::VM1> el1;
        el1.SetFromDataElement( index );

        gdcm::Element<VR::LO, VM::VM1> el2;
        el2.SetFromDataElement( name );
    //    std::cout << el1.GetValue() << " " << el2.GetValue() << std::endl;
        names.insert( std::make_pair< UL, std::string > ( 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 ) )
          {
          return false;
          }
        const DataElement & index2 = ds.GetDataElement( tindex2 );
        if( index2.IsEmpty() )
          {
          return false;
          }
        gdcm::Element<VR::FD, VM::VM1_2> el1;
        el1.SetFromDataElement( index2 );

        UL copy = 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<VR::UL,VM::VM1> el2;
          el2.SetFromDataElement( value );
          std::cout << el2.GetValue() << std::endl;
          }
        else if( ds.FindDataElement( tvaluefloat1 ) )
          {
          const DataElement & value = ds.GetDataElement( tvaluefloat1 );
          gdcm::Element<VR::FL,VM::VM1> el2;
          el2.SetFromDataElement( value );
          std::cout << el2.GetValue() << std::endl;
          }
        else if( ds.FindDataElement( tvaluefloat ) )
          {
          const DataElement & value = ds.GetDataElement( tvaluefloat );
          gdcm::Element<VR::FD,VM::VM1> el2;
          el2.SetFromDataElement( value );
          std::cout << el2.GetValue() << std::endl;
          }
        else if( ds.FindDataElement( tvaluesl ) )
          {
          const DataElement & value = ds.GetDataElement( tvaluesl );
          gdcm::Element<VR::SL,VM::VM1> el2;
          el2.SetFromDataElement( value );
          std::cout << el2.GetValue() << std::endl;
          }
        else if( ds.FindDataElement( tvalueul ) )
          {
          const DataElement & value = ds.GetDataElement( tvalueul );
          gdcm::Element<VR::UL,VM::VM1_n> 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<VR::SL,VM::VM1> 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<VR::LT,VM::VM1> el2;
          el2.SetFromDataElement( value );
          std::cout << el2.GetValue() << std::endl;
          }
        else if( ds.FindDataElement( tvaluesl2 ) )
          {
          const DataElement & value = ds.GetDataElement( tvaluesl2 );
          gdcm::Element<VR::SL,VM::VM1_n> 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<VR::SL,VM::VM1_n> 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<VR::FD,VM::VM1_n> 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<VR::FD,VM::VM1_n> 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<VR::FD,VM::VM1_n> 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 1;
        const gdcm::DataElement& seq_values = ds.GetDataElement( privtag );
        gdcm::SmartPointer<gdcm::SequenceOfItems> 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<gdcm::VR::LO,gdcm::VM::VM1> 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<gdcm::SequenceOfItems> sqi_values73 = seq_values73.GetValueAsSQ();

      int ni3 = sqi_values73->GetNumberOfItems();
      for( int 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 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<gdcm::SequenceOfItems> sqi_values83 = seq_values83.GetValueAsSQ();

      int ni3 = sqi_values83->GetNumberOfItems();
      for( int 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 )
    {
      if( !subds.FindDataElement( privtag0 ) )
        {
        assert( 0 );
        return 1;
        }
      const gdcm::DataElement& seq_values10 = subds.GetDataElement( privtag0 );
      gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values10 = seq_values10.GetValueAsSQ();

      int ni1 = sqi_values10->GetNumberOfItems();
    //  assert( ni1 == 1 );
      for( int 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 1;
          }
        const gdcm::DataElement& seq_values20 = ds10.GetDataElement( tseq_values20 );
        gdcm::SmartPointer<gdcm::SequenceOfItems> sqi_values20 = seq_values20.GetValueAsSQ();

        int ni2 = sqi_values20->GetNumberOfItems();
        //assert( ni == 1 );
        for( int i2 = 1; i2 <= ni2; ++i2 )
          {
          gdcm::Item &item_20 = sqi_values20->GetItem(i2);
          gdcm::DataSet &ds20 = item_20.GetNestedDataSet();
          int count = ds20.Size();
          assert( ds20.Size() == 2 + 3 || ds20.Size() == 2 + 2 );
          // (7fe1,0010)
          // (7fe1,1024)
          // (7fe1,1026)
          // (7fe1,1036)
          // (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;

          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 );
      reader.Read();

      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<SequenceOfItems> 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<SequenceOfItems> 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<SequenceOfItems> 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<VR::LO,VM::VM1> el;
      el.SetFromDataElement( values8name );
      std::cout << el.GetValue() << std::endl;
    }
      int count = subds.Size();
      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;
    }