def createUserInterface(self):
        '''
    '''
        # TODO: might make sense to hide the button for the last step at this
        # point, but the widget does not have such option
        self.__layout = self.__parent.createUserInterface()

        #    # Place Tracker Position
        #    placeTrackerPositionButton = qt.QPushButton("Add tracker position")
        #    placeTrackerPositionButton.toolTip = "Add a tracker position to the list"
        #    self.__layout.addWidget(placeTrackerPositionButton)
        #    placeTrackerPositionButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)
        #
        #    # Load a tracker list
        #    loadTrackerListButton = qt.QPushButton("Test spatial points lists creation")
        #    loadTrackerListButton.toolTip = "Load spatial points to test registration"
        #    self.__layout.addWidget(loadTrackerListButton)
        #    loadTrackerListButton.connect('clicked(bool)', self.onLoadSpatialPointsListClicked)

        self.fiducialsList = FiducialsList()
        self.fiducialsList.setModuleLogic(self.logic)
        self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
        self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()

        #customize the UI
        self.fiducialsWidget.placeSpatialButton.setVisible(True)
        self.fiducialsWidget.placeFiducialButton.setVisible(False)
        self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
        self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)

        #connect signals and slots
        self.fiducialsWidget.placeSpatialButton.connect(
            'clicked(bool)', self.onPlaceTrackerPositionButtonClicked)

        self.updateWidgetFromParameters(self.parameterNode())
        self.updateGeometry()

        qt.QTimer.singleShot(0, self.killButton)
        print("Fiducials Widget size Hint:")
        self.fiducialsWidget.sizeHint
        print("Fiducials Widget size :")
        self.fiducialsWidget.size
        print("Spatial fiducials step size Hint:")
        print self.sizeHint
        print("Spatial fiducials step size")
        print self.size
  def createUserInterface( self ):
    '''
    '''
    
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()
    

    
#    # BUTTONS --------------------------------------------------------------------
#    This is commented out and the buttons are in the UI from the designer
#
#    #layout for the buttons
#    self.buttonsLayout = qt.QHBoxLayout()
#    self.__layout.addLayout(self.buttonsLayout, 1)
#    
#    # Place fiducial
#    placeFiducialButtom = qt.QPushButton("Place fiducial")
#    placeFiducialButtom.toolTip = "Add a fiducial to the list"
#    self.buttonsLayout.addWidget(placeFiducialButtom)
#    placeFiducialButtom.connect('clicked(bool)', self.onPlaceFiducialButtomClicked) 
#    
#    # Spacer
#    self.buttonsLayout.addStretch()
    
    self.fiducialsList = FiducialsList()
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
            #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(False)
    self.fiducialsWidget.placeFiducialButton.setVisible(True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)
    qt.QTimer.singleShot(0, self.killButton)
    
    print("Fiducials Widget size Hint:")
    print self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    print self.fiducialsWidget.size
    print("Image fiducials step size Hint:")
    print self.sizeHint
    print("Image fiducials step size")
    print self.size
  def createUserInterface( self ):
    '''
    '''
    
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()
    

    
#    # BUTTONS --------------------------------------------------------------------
#    This is commented out and the buttons are in the UI from the designer
#
#    #layout for the buttons
#    self.buttonsLayout = qt.QHBoxLayout()
#    self.__layout.addLayout(self.buttonsLayout, 1)
#    
#    # Place fiducial
#    placeFiducialButtom = qt.QPushButton("Place fiducial")
#    placeFiducialButtom.toolTip = "Add a fiducial to the list"
#    self.buttonsLayout.addWidget(placeFiducialButtom)
#    placeFiducialButtom.connect('clicked(bool)', self.onPlaceFiducialButtomClicked) 
#    
#    # Spacer
#    self.buttonsLayout.addStretch()
    
    self.fiducialsList = FiducialsList()
    self.fiducialsList.setPlaceImageFiducialStep(True)
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
            #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(False)
    self.fiducialsWidget.placeFiducialButton.setVisible(True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(3, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)
    qt.QTimer.singleShot(0, self.killButton)
    
    print("Fiducials Widget size Hint:")
    print self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    print self.fiducialsWidget.size
    print("Image fiducials step size Hint:")
    print self.sizeHint
    print("Image fiducials step size")
    print self.size
  def createUserInterface( self ):
    '''
    '''
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()

#    # Place Tracker Position
#    placeTrackerPositionButton = qt.QPushButton("Add tracker position")
#    placeTrackerPositionButton.toolTip = "Add a tracker position to the list"
#    self.__layout.addWidget(placeTrackerPositionButton)
#    placeTrackerPositionButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)
#    
#    # Load a tracker list 
#    loadTrackerListButton = qt.QPushButton("Test spatial points lists creation")
#    loadTrackerListButton.toolTip = "Load spatial points to test registration"
#    self.__layout.addWidget(loadTrackerListButton)
#    loadTrackerListButton.connect('clicked(bool)', self.onLoadSpatialPointsListClicked)


    self.fiducialsList = FiducialsList()
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
    
    #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(True)
    self.fiducialsWidget.placeFiducialButton.setVisible(False)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)

    #connect signals and slots
    self.fiducialsWidget.placeSpatialButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)


    self.updateWidgetFromParameters(self.parameterNode())
    self.updateGeometry()

    qt.QTimer.singleShot(0, self.killButton)
    print("Fiducials Widget size Hint:")
    self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    self.fiducialsWidget.size
    print("Spatial fiducials step size Hint:")
    print self.sizeHint
    print("Spatial fiducials step size")
    print self.size
class CaptureSpatialPositionsStep(USGuidedStep):
    def __init__(self, stepid):
        self.initialize(stepid)
        self.setName('2. Capture spatial positions step')
        #self.setDescription( 'Place fiducials using the tracker' )

        self.__parent = super(CaptureSpatialPositionsStep, self)
        self.numberOfAcquiredSpatialPositions = 0

    def createUserInterface(self):
        '''
    '''
        # TODO: might make sense to hide the button for the last step at this
        # point, but the widget does not have such option
        self.__layout = self.__parent.createUserInterface()

        #    # Place Tracker Position
        #    placeTrackerPositionButton = qt.QPushButton("Add tracker position")
        #    placeTrackerPositionButton.toolTip = "Add a tracker position to the list"
        #    self.__layout.addWidget(placeTrackerPositionButton)
        #    placeTrackerPositionButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)
        #
        #    # Load a tracker list
        #    loadTrackerListButton = qt.QPushButton("Test spatial points lists creation")
        #    loadTrackerListButton.toolTip = "Load spatial points to test registration"
        #    self.__layout.addWidget(loadTrackerListButton)
        #    loadTrackerListButton.connect('clicked(bool)', self.onLoadSpatialPointsListClicked)

        self.fiducialsList = FiducialsList()
        self.fiducialsList.setModuleLogic(self.logic)
        self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
        self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()

        #customize the UI
        self.fiducialsWidget.placeSpatialButton.setVisible(True)
        self.fiducialsWidget.placeFiducialButton.setVisible(False)
        self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
        self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)

        #connect signals and slots
        self.fiducialsWidget.placeSpatialButton.connect(
            'clicked(bool)', self.onPlaceTrackerPositionButtonClicked)

        self.updateWidgetFromParameters(self.parameterNode())
        self.updateGeometry()

        qt.QTimer.singleShot(0, self.killButton)
        print("Fiducials Widget size Hint:")
        self.fiducialsWidget.sizeHint
        print("Fiducials Widget size :")
        self.fiducialsWidget.size
        print("Spatial fiducials step size Hint:")
        print self.sizeHint
        print("Spatial fiducials step size")
        print self.size

    def killButton(self):
        # hide useless button
        bl = slicer.util.findChildren(text='ReportROI')
        if len(bl):
            bl[0].hide()

    def validate(self, desiredBranchId):
        '''
    '''
        self.__parent.validationSucceeded(desiredBranchId)
        print(
            "We are in the validate function of CaptureSpatialPositionsStepStep"
        )

    def onEntry(self, comingFrom, transitionType):

        super(CaptureSpatialPositionsStep,
              self).onEntry(comingFrom, transitionType)
        self.updateWidgetFromParameters(self.parameterNode())
        pNode = self.parameterNode()
        pNode.SetParameter('currentStep', self.stepid)

        print(
            "We are in the onEntry function of CaptureSpatialPositionsStepStep coming from:"
        )
        print comingFrom.name()
        qt.QTimer.singleShot(0, self.killButton)

    def onExit(self, goingTo, transitionType):
        self.doStepProcessing()
        super(CaptureSpatialPositionsStep,
              self).onExit(goingTo, transitionType)
        print(
            "We are in the onExit function of CaptureSpatialPositionsStepStep")

    def updateWidgetFromParameters(self, parameterNode):
        print("We are in the place fiducials step")
        self.fiducialsList.updateSpatialFiducialsList()
        #self.updateTrackerPointsList()

    def doStepProcessing(self):
        # calculate the transform to align the ROI in the next step with the
        # baseline volume
        pNode = self.parameterNode()


#  def onPlaceTrackerPositionButtonClicked(self):
#    self.logic.recordTrackerPosition()
#

    def onLoadSpatialPointsListClicked(self):
        self.logic.addFiducialsToTrackerList()

    def onPlaceTrackerPositionButtonClicked(self):

        fiducialName = "F" + str(self.numberOfAcquiredSpatialPositions)
        positionRecorded = self.logic.captureSpatialsPositions(fiducialName)

        path = slicer.modules.stylusbasedusprobecalibration.path
        modulePath = os.path.dirname(path)

        if positionRecorded == True:
            #get the most recent node (the last) in the Tracker Points List
            #trackerNode = slicer.util.getNode(fiducialName+"-Tracker")
            #         trackerNode = self.logic.getFiducialNode('Tracker Points List', -1)
            #
            #
            #         # Associate the fiducial and the tracker position
            #         # We remove the previous (if exist) tracker node
            #         # and we put the new tracker node ID in the table and check the row
            #         currentItem = self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 4)
            #         if currentItem is None:
            #           self.fiducialsList.addNewEmptyRow(self.numberOfAcquiredSpatialPositions)
            #
            #         currentItem = self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 4)
            #
            #         self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 3).setText(trackerNode.GetName())
            #         self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 4).setText(trackerNode.GetID())
            #         self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 0).setCheckState(2)

            self.fiducialsList.updateFiducialsList("Tracker Points List")

            soundFile = os.path.join(modulePath, "sounds/notify.wav")
            sound = qt.QSound(soundFile)
            sound.play()
            self.numberOfAcquiredSpatialPositions += 1
        else:
            soundFile = os.path.join(modulePath, "sounds/critico.wav")
            #sound=qt.QSound("C:\Users\Usuario\devel\slicelets\USGuidedProcedure\sounds\critico.wav")
            sound = qt.QSound(soundFile)
            sound.play()

    def updateTrackerPointsList(self):
        #clear list
        #self.fiducialsWidget.fiducialsList.clear()

        #raise this flag to ignore change events in the table, the flag is lowered at the end of this method
        self.updatingList = True

        # get the nodes
        fiducialListNode = slicer.util.getNode("Fiducials List")
        trackerListNode = slicer.util.getNode("Tracker Points List")

        # clear the list of tracker points
        trackerListNode.RemoveChildrenNodes()

        # create as many tracker nodes as fiducials
        saml = slicer.modules.annotations.logic()
        saml.SetActiveHierarchyNodeID(trackerListNode.GetID())
        for childrenIndex in xrange(
                fiducialListNode.GetNumberOfChildrenNodes()):
            fidHierarchyNode = fiducialListNode.GetNthChildNode(childrenIndex)
            fidNode = fidHierarchyNode.GetAssociatedNode()
            fidPos = [0, 0, 0]
            dummy = fidNode.GetFiducialCoordinates(fidPos)
            fidName = fidNode.GetName()
            fidID = fidNode.GetID()

            trackerNode = slicer.vtkMRMLAnnotationFiducialNode()
            trackerNode.SetFiducialWorldCoordinates(fidPos)
            trackerNode.SetName(fidName + '-Tracker')
            slicer.mrmlScene.AddNode(trackerNode)

        self.updatingList = False
class PlaceSpatialFiducialsStep( USGuidedStep ) :

  def __init__( self, stepid ):
    self.initialize( stepid )
    self.setName( '3. Place spatial Fiducials' )
    #self.setDescription( 'Place fiducials using the tracker' )

    self.__parent = super( PlaceSpatialFiducialsStep, self )

  def createUserInterface( self ):
    '''
    '''
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()

#    # Place Tracker Position
#    placeTrackerPositionButton = qt.QPushButton("Add tracker position")
#    placeTrackerPositionButton.toolTip = "Add a tracker position to the list"
#    self.__layout.addWidget(placeTrackerPositionButton)
#    placeTrackerPositionButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)
#    
#    # Load a tracker list 
#    loadTrackerListButton = qt.QPushButton("Test spatial points lists creation")
#    loadTrackerListButton.toolTip = "Load spatial points to test registration"
#    self.__layout.addWidget(loadTrackerListButton)
#    loadTrackerListButton.connect('clicked(bool)', self.onLoadSpatialPointsListClicked)


    self.fiducialsList = FiducialsList()
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
    
    #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(True)
    self.fiducialsWidget.placeFiducialButton.setVisible(False)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)

    #connect signals and slots
    self.fiducialsWidget.placeSpatialButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)


    self.updateWidgetFromParameters(self.parameterNode())
    self.updateGeometry()

    qt.QTimer.singleShot(0, self.killButton)
    print("Fiducials Widget size Hint:")
    self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    self.fiducialsWidget.size
    print("Spatial fiducials step size Hint:")
    print self.sizeHint
    print("Spatial fiducials step size")
    print self.size

  def killButton(self):
    # hide useless button
    bl = slicer.util.findChildren(text='ReportROI')
    if len(bl):
      bl[0].hide()

  def validate( self, desiredBranchId ):
    '''
    '''
    self.__parent.validationSucceeded(desiredBranchId)
    print("We are in the validate function of PlaceSpatialFiducialsStep")

  def onEntry(self, comingFrom, transitionType):

    super(PlaceSpatialFiducialsStep, self).onEntry(comingFrom, transitionType)
    self.updateWidgetFromParameters(self.parameterNode())
    pNode = self.parameterNode()
    pNode.SetParameter('currentStep', self.stepid)
    
    
    print("We are in the onEntry function of PlaceSpatialFiducialsStep coming from:" )
    print comingFrom.name()
    qt.QTimer.singleShot(0, self.killButton)
    

  def onExit(self, goingTo, transitionType):
    self.doStepProcessing()
    super(PlaceSpatialFiducialsStep, self).onExit(goingTo, transitionType) 
    print("We are in the onExit function of PlaceSpatialFiducialsStep")

  def updateWidgetFromParameters(self, parameterNode):
    print("We are in the place fiducials step")
    self.fiducialsList.updateSpatialFiducialsList()
    #self.updateTrackerPointsList()
    



  def doStepProcessing(self):
    # calculate the transform to align the ROI in the next step with the
    # baseline volume
    pNode = self.parameterNode()
    
    self.updateListNodesForRegistration()

#  def onPlaceTrackerPositionButtonClicked(self):   
#    self.logic.recordTrackerPosition()
#    

  def onLoadSpatialPointsListClicked(self):  
    self.logic.addFiducialsToTrackerList()   


  def onPlaceTrackerPositionButtonClicked(self):   

    if self.fiducialsWidget.fiducialsList.rowCount ==0:
      ret=qt.QMessageBox.warning(self.fiducialsWidget, 'Fiducials List', 'You must have image fiducials to match with tracker positions.', qt.QMessageBox.Ok , qt.QMessageBox.Ok )
      return

    currentRow = self.fiducialsWidget.fiducialsList.currentRow()
    print("Current row is: " + str(currentRow))
    
    if currentRow==-1:
        ret=qt.QMessageBox.warning(self.fiducialsWidget, 'Fiducials List', 'You must select an image fiducials to match with the tracker position.', qt.QMessageBox.Ok , qt.QMessageBox.Ok )
        return
    
    fiducialListNode=slicer.util.getNode("Fiducials List")

    # TODO uncomment this line and comment all the following TOD
    
    fidHierarchyNode=fiducialListNode.GetNthChildNode(currentRow)
    fidNode=fidHierarchyNode.GetAssociatedNode()   
    
    fidName = fidNode.GetName()
    
    
    
    positionRecorded= self.logic.recordTrackerPosition()
    
    path=slicer.modules.usguidedprocedure.path
    modulePath=os.path.dirname(path)
    
    if positionRecorded==True:
        #get the most recent node (the last) in the Tracker Points List
        trackerNode = self.logic.getFiducialNode('Tracker Points List', -1)
        trackerNode.SetName(fidName + '-Tracker')
    
    
        # Associate the fiducial and the tracker position
        # We remove the previous (if exist) tracker node 
        # and we put the new tracker node ID in the table and check the row
        previousTrackerID = self.fiducialsWidget.fiducialsList.item(currentRow, 4).text()
        previousTrackerNode = slicer.mrmlScene.GetNodeByID(previousTrackerID)
        if  previousTrackerNode:
            logic = slicer.modules.annotations.logic()
            logic.RemoveAnnotationNode(previousTrackerNode)
    
        self.fiducialsWidget.fiducialsList.item(currentRow, 3).setText(trackerNode.GetName())
        self.fiducialsWidget.fiducialsList.item(currentRow, 4).setText(trackerNode.GetID())
        self.fiducialsWidget.fiducialsList.item(currentRow, 0).setCheckState(2)
      
        soundFile=os.path.join(modulePath,"sounds/notify.wav")
        sound=qt.QSound(soundFile)
        sound.play()    
    else:
        soundFile=os.path.join(modulePath,"sounds/critico.wav") 
        #sound=qt.QSound("C:\Users\Usuario\devel\slicelets\USGuidedProcedure\sounds\critico.wav")
        sound=qt.QSound(soundFile)
        sound.play()   

      
  def updateTrackerPointsList(self):
    #clear list
    #self.fiducialsWidget.fiducialsList.clear()

    #raise this flag to ignore change events in the table, the flag is lowered at the end of this method
    self.updatingList = True

    # get the nodes
    fiducialListNode=slicer.util.getNode("Fiducials List")
    trackerListNode=slicer.util.getNode("Tracker Points List")

    # clear the list of tracker points
    trackerListNode.RemoveChildrenNodes()

    # create as many tracker nodes as fiducials
    saml = slicer.modules.annotations.logic() 
    saml.SetActiveHierarchyNodeID(trackerListNode.GetID())
    for childrenIndex in xrange(fiducialListNode.GetNumberOfChildrenNodes()):
        fidHierarchyNode=fiducialListNode.GetNthChildNode(childrenIndex)
        fidNode=fidHierarchyNode.GetAssociatedNode()        
        fidPos=[0,0,0]
        dummy=fidNode.GetFiducialCoordinates(fidPos)
        fidName = fidNode.GetName()
        fidID = fidNode.GetID()

        trackerNode=slicer.vtkMRMLAnnotationFiducialNode()
        trackerNode.SetFiducialWorldCoordinates(fidPos)
        trackerNode.SetName(fidName + '-Tracker')	
        slicer.mrmlScene.AddNode(trackerNode)

    self.updatingList = False


  def updateListNodesForRegistration(self):
    
  #raise this flag to ignore change events in the table, the flag is lowered at the end of this method
    self.updatingList = True

    # get the nodes
    fiducialListNode=slicer.util.getNode("Fiducials List")
    trackerListNode=slicer.util.getNode("Tracker Points List")

    fiducialListNodeForRegistration=slicer.util.getNode("Fiducials List (for registration)")
    trackerListNodeForRegistration=slicer.util.getNode("Tracker Points List (for registration)")


    
    # clear the lists (for registration)
    fiducialListNodeForRegistration.RemoveChildrenNodes()
    trackerListNodeForRegistration.RemoveChildrenNodes()
    
    saml=slicer.modules.annotations.logic()
    
   
    for row in range(self.fiducialsWidget.fiducialsList.rowCount):
      fidID = self.fiducialsWidget.fiducialsList.item(row, 2).text()
      trackerID = self.fiducialsWidget.fiducialsList.item(row, 4).text()
      #print row
      #print fidID
      #print trackerID
      
      fidNode = slicer.mrmlScene.GetNodeByID(fidID)
      trackerNode = slicer.mrmlScene.GetNodeByID(trackerID)
      #print fidNode
      #print trackerNode
      
      #if the row is selected to be used in the registration
      if self.fiducialsWidget.fiducialsList.item(row, 0).checkState()==2:
        #print 'Checked row'
     
        fidPos=[0,0,0]
        dummy=fidNode.GetFiducialCoordinates(fidPos)
        fidName = fidNode.GetName()
        trackerPos=[0,0,0]
        dummy=trackerNode.GetFiducialCoordinates(trackerPos)
        trackerName = trackerNode.GetName()
        
        #create the new nodes copying the data 
        fidNodeForRegistration=slicer.vtkMRMLAnnotationFiducialNode()
        fidNodeForRegistration.SetFiducialWorldCoordinates(fidPos)
        fidNodeForRegistration.SetName(fidName)	
        trackerNodeForRegistration=slicer.vtkMRMLAnnotationFiducialNode()
        trackerNodeForRegistration.SetFiducialWorldCoordinates(trackerPos)
        trackerNodeForRegistration.SetName(trackerName)	
        
        # add the nodes to the lists for registration
        saml.SetActiveHierarchyNodeID(fiducialListNodeForRegistration.GetID())
        slicer.mrmlScene.AddNode(fidNodeForRegistration)
        saml.SetActiveHierarchyNodeID(trackerListNodeForRegistration.GetID())
        slicer.mrmlScene.AddNode(trackerNodeForRegistration)
        
        
class PlaceImageFiducialsStep( USGuidedStep ) :

  def __init__( self, stepid ):
    self.initialize( stepid )
    self.setName( '1. PlaceImageFiducials' )
    #self.setDescription( 'Place fiducials in the image' )
  
    self.__parent = super( PlaceImageFiducialsStep, self )
    

  def createUserInterface( self ):
    '''
    '''
    
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()
    

    
#    # BUTTONS --------------------------------------------------------------------
#    This is commented out and the buttons are in the UI from the designer
#
#    #layout for the buttons
#    self.buttonsLayout = qt.QHBoxLayout()
#    self.__layout.addLayout(self.buttonsLayout, 1)
#    
#    # Place fiducial
#    placeFiducialButtom = qt.QPushButton("Place fiducial")
#    placeFiducialButtom.toolTip = "Add a fiducial to the list"
#    self.buttonsLayout.addWidget(placeFiducialButtom)
#    placeFiducialButtom.connect('clicked(bool)', self.onPlaceFiducialButtomClicked) 
#    
#    # Spacer
#    self.buttonsLayout.addStretch()
    
    self.fiducialsList = FiducialsList()
    self.fiducialsList.setPlaceImageFiducialStep(True)
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
            #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(False)
    self.fiducialsWidget.placeFiducialButton.setVisible(True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(3, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)
    qt.QTimer.singleShot(0, self.killButton)
    
    print("Fiducials Widget size Hint:")
    print self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    print self.fiducialsWidget.size
    print("Image fiducials step size Hint:")
    print self.sizeHint
    print("Image fiducials step size")
    print self.size

  def killButton(self):
    # hide useless button
    bl = slicer.util.findChildren(text='ReportROI')
    if len(bl):
      bl[0].hide()

  def validate( self, desiredBranchId ):
    '''
    '''
    self.__parent.validationSucceeded(desiredBranchId)
    print("We are in the validate function of PlaceImageFiducialsStep")

  def onEntry(self, comingFrom, transitionType):

    super(PlaceImageFiducialsStep, self).onEntry(comingFrom, transitionType)
    
    self.logic.createRegistrationLists()
    self.logic.createTargetList()
    self.logic.createPlusCommandsList()
     
    self.fiducialsList.listenToListModifications()  
    
    #self.logic.crosshairEnable()
    
    
    self.updateWidgetFromParameters(self.parameterNode())
    pNode = self.parameterNode()
    pNode.SetParameter('currentStep', self.stepid)
    print("We are in the onEntry function of PlaceImageFiducialsStep")
    
    """  # For debugging
    import sys
    sys.path.append('C:/Users/Usuario/devel/eclipse/plugins/org.python.pydev_2.7.1.2012100913/pysrc')
    
    import pydevd 
    pydevd.settrace()
    """
    
    qt.QTimer.singleShot(0, self.killButton)

  def onExit(self, goingTo, transitionType):
    self.doStepProcessing()
    super(PlaceImageFiducialsStep, self).onExit(goingTo, transitionType) 
    #crosshairNode=slicer.util.getNode("Crosshair")
    #crosshairNode.SetCrosshairMode(1) 
    #self.logic.crosshairDisable()
    self.fiducialsList.doNotListenToListModifications()
    print("We are in the onExit function of PlaceImageFiducialsStep")
    
    
  def updateWidgetFromParameters(self, parameterNode):
    self.fiducialsList.updateFiducialsList()    
    print("We are in the place fiducials step")

  def doStepProcessing(self):
    # calculate the transform to align the ROI in the next step with the
    # baseline volume
    pNode = self.parameterNode()
class CaptureSpatialPositionsStep( USGuidedStep ) :

  def __init__( self, stepid ):
    self.initialize( stepid )
    self.setName( '2. Capture spatial positions step' )
    #self.setDescription( 'Place fiducials using the tracker' )

    self.__parent = super( CaptureSpatialPositionsStep, self )
    self.numberOfAcquiredSpatialPositions = 0

  def createUserInterface( self ):
    '''
    '''
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()

#    # Place Tracker Position
#    placeTrackerPositionButton = qt.QPushButton("Add tracker position")
#    placeTrackerPositionButton.toolTip = "Add a tracker position to the list"
#    self.__layout.addWidget(placeTrackerPositionButton)
#    placeTrackerPositionButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)
#    
#    # Load a tracker list 
#    loadTrackerListButton = qt.QPushButton("Test spatial points lists creation")
#    loadTrackerListButton.toolTip = "Load spatial points to test registration"
#    self.__layout.addWidget(loadTrackerListButton)
#    loadTrackerListButton.connect('clicked(bool)', self.onLoadSpatialPointsListClicked)


    self.fiducialsList = FiducialsList()
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
    
    #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(True)
    self.fiducialsWidget.placeFiducialButton.setVisible(False)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)

    #connect signals and slots
    self.fiducialsWidget.placeSpatialButton.connect('clicked(bool)', self.onPlaceTrackerPositionButtonClicked)


    self.updateWidgetFromParameters(self.parameterNode())
    self.updateGeometry()

    qt.QTimer.singleShot(0, self.killButton)
    print("Fiducials Widget size Hint:")
    self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    self.fiducialsWidget.size
    print("Spatial fiducials step size Hint:")
    print self.sizeHint
    print("Spatial fiducials step size")
    print self.size

  def killButton(self):
    # hide useless button
    bl = slicer.util.findChildren(text='ReportROI')
    if len(bl):
      bl[0].hide()

  def validate( self, desiredBranchId ):
    '''
    '''
    self.__parent.validationSucceeded(desiredBranchId)
    print("We are in the validate function of CaptureSpatialPositionsStepStep")

  def onEntry(self, comingFrom, transitionType):

    super(CaptureSpatialPositionsStep, self).onEntry(comingFrom, transitionType)
    self.updateWidgetFromParameters(self.parameterNode())
    pNode = self.parameterNode()
    pNode.SetParameter('currentStep', self.stepid)
    
    
    print("We are in the onEntry function of CaptureSpatialPositionsStepStep coming from:" )
    print comingFrom.name()
    qt.QTimer.singleShot(0, self.killButton)
    

  def onExit(self, goingTo, transitionType):
    self.doStepProcessing()
    super(CaptureSpatialPositionsStep, self).onExit(goingTo, transitionType) 
    print("We are in the onExit function of CaptureSpatialPositionsStepStep")

  def updateWidgetFromParameters(self, parameterNode):
    print("We are in the place fiducials step")
    self.fiducialsList.updateSpatialFiducialsList()
    #self.updateTrackerPointsList()
    



  def doStepProcessing(self):
    # calculate the transform to align the ROI in the next step with the
    # baseline volume
    pNode = self.parameterNode()

#  def onPlaceTrackerPositionButtonClicked(self):   
#    self.logic.recordTrackerPosition()
#    

  def onLoadSpatialPointsListClicked(self):  
    self.logic.addFiducialsToTrackerList()   


  def onPlaceTrackerPositionButtonClicked(self):   
    
    fiducialName = "F" + str(self.numberOfAcquiredSpatialPositions)
    positionRecorded= self.logic.captureSpatialsPositions(fiducialName)
    
    path=slicer.modules.stylusbasedusprobecalibration.path
    modulePath=os.path.dirname(path)
    
    if positionRecorded==True:
        #get the most recent node (the last) in the Tracker Points List
        #trackerNode = slicer.util.getNode(fiducialName+"-Tracker")
#         trackerNode = self.logic.getFiducialNode('Tracker Points List', -1)
#     
#     
#         # Associate the fiducial and the tracker position
#         # We remove the previous (if exist) tracker node 
#         # and we put the new tracker node ID in the table and check the row
#         currentItem = self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 4)
#         if currentItem is None:
#           self.fiducialsList.addNewEmptyRow(self.numberOfAcquiredSpatialPositions)        
#     
#         currentItem = self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 4)
#         
#         self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 3).setText(trackerNode.GetName())
#         self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 4).setText(trackerNode.GetID())
#         self.fiducialsWidget.fiducialsList.item(self.numberOfAcquiredSpatialPositions , 0).setCheckState(2)
        
        self.fiducialsList.updateFiducialsList("Tracker Points List")
      
        soundFile=os.path.join(modulePath,"sounds/notify.wav")
        sound=qt.QSound(soundFile)
        sound.play()    
        self.numberOfAcquiredSpatialPositions += 1
    else:
        soundFile=os.path.join(modulePath,"sounds/critico.wav") 
        #sound=qt.QSound("C:\Users\Usuario\devel\slicelets\USGuidedProcedure\sounds\critico.wav")
        sound=qt.QSound(soundFile)
        sound.play()   

      
  def updateTrackerPointsList(self):
    #clear list
    #self.fiducialsWidget.fiducialsList.clear()

    #raise this flag to ignore change events in the table, the flag is lowered at the end of this method
    self.updatingList = True

    # get the nodes
    fiducialListNode=slicer.util.getNode("Fiducials List")
    trackerListNode=slicer.util.getNode("Tracker Points List")

    # clear the list of tracker points
    trackerListNode.RemoveChildrenNodes()

    # create as many tracker nodes as fiducials
    saml = slicer.modules.annotations.logic() 
    saml.SetActiveHierarchyNodeID(trackerListNode.GetID())
    for childrenIndex in xrange(fiducialListNode.GetNumberOfChildrenNodes()):
        fidHierarchyNode=fiducialListNode.GetNthChildNode(childrenIndex)
        fidNode=fidHierarchyNode.GetAssociatedNode()        
        fidPos=[0,0,0]
        dummy=fidNode.GetFiducialCoordinates(fidPos)
        fidName = fidNode.GetName()
        fidID = fidNode.GetID()

        trackerNode=slicer.vtkMRMLAnnotationFiducialNode()
        trackerNode.SetFiducialWorldCoordinates(fidPos)
        trackerNode.SetName(fidName + '-Tracker')	
        slicer.mrmlScene.AddNode(trackerNode)

    self.updatingList = False


        
class PlaceStylusTipInTheImageStep( USGuidedStep ) :

  def __init__( self, stepid ):
    self.initialize( stepid )
    self.setName( '3. PlaceStylusTipInTheImage' )
    #self.setDescription( 'Place fiducials in the image' )
  
    self.__parent = super( PlaceStylusTipInTheImageStep, self )
    

  def createUserInterface( self ):
    '''
    '''
    
    # TODO: might make sense to hide the button for the last step at this
    # point, but the widget does not have such option
    self.__layout = self.__parent.createUserInterface()
    

    
#    # BUTTONS --------------------------------------------------------------------
#    This is commented out and the buttons are in the UI from the designer
#
#    #layout for the buttons
#    self.buttonsLayout = qt.QHBoxLayout()
#    self.__layout.addLayout(self.buttonsLayout, 1)
#    
#    # Place fiducial
#    placeFiducialButtom = qt.QPushButton("Place fiducial")
#    placeFiducialButtom.toolTip = "Add a fiducial to the list"
#    self.buttonsLayout.addWidget(placeFiducialButtom)
#    placeFiducialButtom.connect('clicked(bool)', self.onPlaceFiducialButtomClicked) 
#    
#    # Spacer
#    self.buttonsLayout.addStretch()
    
    self.fiducialsList = FiducialsList()
    self.fiducialsList.setModuleLogic(self.logic)
    self.__layout.addWidget(self.fiducialsList.getFiducialsWidget())
    
    self.fiducialsWidget = self.fiducialsList.getFiducialsWidget()
            #customize the UI
    self.fiducialsWidget.placeSpatialButton.setVisible(False)
    self.fiducialsWidget.placeFiducialButton.setVisible(True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(2, True)
    self.fiducialsWidget.fiducialsList.setColumnHidden(4, True)
    qt.QTimer.singleShot(0, self.killButton)
    
    print("Fiducials Widget size Hint:")
    print self.fiducialsWidget.sizeHint
    print("Fiducials Widget size :")
    print self.fiducialsWidget.size
    print("Image fiducials step size Hint:")
    print self.sizeHint
    print("Image fiducials step size")
    print self.size

  def killButton(self):
    # hide useless button
    bl = slicer.util.findChildren(text='ReportROI')
    if len(bl):
      bl[0].hide()

  def validate( self, desiredBranchId ):
    '''
    '''
    self.__parent.validationSucceeded(desiredBranchId)
    print("We are in the validate function of PlaceStylusTipInTheImageStep")

  def onEntry(self, comingFrom, transitionType):

    super(PlaceStylusTipInTheImageStep, self).onEntry(comingFrom, transitionType)
     
    self.fiducialsList.listenToListModifications()  
    
    #self.logic.crosshairEnable()
    
    self.fiducialsList.setPlaceImageFiducialStep(True)
    self.updateWidgetFromParameters(self.parameterNode())
    pNode = self.parameterNode()
    pNode.SetParameter('currentStep', self.stepid)
    if self.fiducialsWidget.fiducialsList.rowCount > 0:
        item = self.fiducialsWidget.fiducialsList.item(0, 0)
        self.fiducialsWidget.fiducialsList.itemClicked(item)
    print("We are in the onEntry function of PlaceStylusTipInTheImageStep")
    

    
    qt.QTimer.singleShot(0, self.killButton)

  def onExit(self, goingTo, transitionType):
    self.doStepProcessing()
    super(PlaceStylusTipInTheImageStep, self).onExit(goingTo, transitionType) 
    #crosshairNode=slicer.util.getNode("Crosshair")
    #crosshairNode.SetCrosshairMode(1) 
    #self.logic.crosshairDisable()
    self.fiducialsList.setPlaceImageFiducialStep(False)
    self.fiducialsList.doNotListenToListModifications()
    print("We are in the onExit function of PlaceStylusTipInTheImageStep")
    
    
  def updateWidgetFromParameters(self, parameterNode):
    self.fiducialsList.updateFiducialsList("Tracker Points List")    
    print("We are in the place fiducials step")

  def doStepProcessing(self):
    # calculate the transform to align the ROI in the next step with the
    # baseline volume
    pNode = self.parameterNode()
    self.updateListNodesForRegistration()
    
    
  def updateListNodesForRegistration(self):
    
  #raise this flag to ignore change events in the table, the flag is lowered at the end of this method
    self.updatingList = True

    # get the nodes
    fiducialListNode=slicer.util.getNode("Fiducials List")
    trackerListNode=slicer.util.getNode("Tracker Points List")

    fiducialListNodeForRegistration=slicer.util.getNode("Fiducials List (for registration)")
    trackerListNodeForRegistration=slicer.util.getNode("Tracker Points List (for registration)")


    
    # clear the lists (for registration)
    fiducialListNodeForRegistration.RemoveChildrenNodes()
    trackerListNodeForRegistration.RemoveChildrenNodes()
    
    saml=slicer.modules.annotations.logic()
    
   
    for row in range(self.fiducialsWidget.fiducialsList.rowCount):
      fidID = self.fiducialsWidget.fiducialsList.item(row, 2).text()
      trackerID = self.fiducialsWidget.fiducialsList.item(row, 4).text()
      #print row
      #print fidID
      #print trackerID
      
      fidNode = slicer.mrmlScene.GetNodeByID(fidID)
      trackerNode = slicer.mrmlScene.GetNodeByID(trackerID)
      #print fidNode
      #print trackerNode
      
      #if the row is selected to be used in the registration
      if self.fiducialsWidget.fiducialsList.item(row, 0).checkState()==2:
        #print 'Checked row'
     
        fidPos=[0,0,0]
        dummy=fidNode.GetFiducialCoordinates(fidPos)
        fidName = fidNode.GetName()
        trackerPos=[0,0,0]
        dummy=trackerNode.GetFiducialCoordinates(trackerPos)
        trackerName = trackerNode.GetName()
        
        #create the new nodes copying the data 
        fidNodeForRegistration=slicer.vtkMRMLAnnotationFiducialNode()
        fidNodeForRegistration.SetFiducialWorldCoordinates(fidPos)
        fidNodeForRegistration.SetName(fidName)    
        trackerNodeForRegistration=slicer.vtkMRMLAnnotationFiducialNode()
        trackerNodeForRegistration.SetFiducialWorldCoordinates(trackerPos)
        trackerNodeForRegistration.SetName(trackerName)    
        
        # add the nodes to the lists for registration
        saml.SetActiveHierarchyNodeID(fiducialListNodeForRegistration.GetID())
        slicer.mrmlScene.AddNode(fidNodeForRegistration)
        saml.SetActiveHierarchyNodeID(trackerListNodeForRegistration.GetID())
        slicer.mrmlScene.AddNode(trackerNodeForRegistration)
     
     
    self.logic.hideAllTheFiducialsNode("Fiducials List (for registration)")
    self.logic.hideAllTheFiducialsNode("Tracker Points List (for registration)")