# ManipulateSequence.py

    ############################################################################
    #
    #  Program: GDCM (Grassroots DICOM). A DICOM library
    #  Module:  $URL$
    #
    #  Copyright (c) 2006-2009 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.
    #
    ############################################################################

    """
    Usage:

     python ManipulateSequence.py input.dcm output.dcm

    This was tested using:

     python ManipulateSequence.py gdcmData/D_CLUNIE_CT1_J2KI.dcm myoutput.dcm

    This is a dummy example on how to modify a value set in a nested-nested dataset

    WARNING:
    Do not use as-is in production, this is just an example
    This example works in an undefined length Item only (you need to explicitely recompute the length otherwise)
    """

    import sys
    import gdcm

    if __name__ == "__main__":

      file1 = sys.argv[1]
      file2 = sys.argv[2]

      r = gdcm.Reader()
      r.SetFileName( file1 )
      if not r.Read():
        sys.exit(1)

      f = r.GetFile()
      ds = f.GetDataSet()
      tsis = gdcm.Tag(0x0008,0x2112) # SourceImageSequence
      if ds.FindDataElement( tsis ):
        sis = ds.GetDataElement( tsis )
        #sqsis = sis.GetSequenceOfItems()
        # GetValueAsSQ handle more cases
        sqsis = sis.GetValueAsSQ()
        if sqsis.GetNumberOfItems():
          item1 = sqsis.GetItem(1)
          nestedds = item1.GetNestedDataSet()
          tprcs = gdcm.Tag(0x0040,0xa170) # PurposeOfReferenceCodeSequence
          if nestedds.FindDataElement( tprcs ):
            prcs = nestedds.GetDataElement( tprcs )
            sqprcs = prcs.GetSequenceOfItems()
            if sqprcs.GetNumberOfItems():
              item2 = sqprcs.GetItem(1)
              nestedds2 = item2.GetNestedDataSet()
              # (0008,0104) LO [Uncompressed predecessor]               #  24, 1 CodeMeaning
              tcm = gdcm.Tag(0x0008,0x0104)
              if nestedds2.FindDataElement( tcm ):
                cm = nestedds2.GetDataElement( tcm )
                mystr = "GDCM was here"
                cm.SetByteValue( mystr, gdcm.VL( len(mystr) ) )

      w = gdcm.Writer()
      w.SetFile( f )
      w.SetFileName( file2 )
      if not w.Write():
        sys.exit(1)