def run(self):
        """
        executes the script
        :return: boolean if execution of script finished succesfully
        """
        self.log_data.clear()
        self._plot_refresh = True  # flag that requests that plot axes are refreshed when self.plot is called next time
        self.is_running = True
        self.start_time = datetime.datetime.now()


        self._current_subscript_stage = {
            'current_subscript': None,
            'subscript_exec_count':{},
            'subscript_exec_duration':{}
        }

        # update the datapath of the subscripts, connect their progress signal to the receive slot
        for subscript in list(self.scripts.values()):
            subscript.data_path = os.path.join(self.filename(create_if_not_existing=False), self.SUBSCRIPT_DATA_DIR)
            subscript.updateProgress.connect(self._receive_signal)
            subscript.started.connect(lambda: self._set_current_subscript(True))
            subscript.finished.connect(lambda: self._set_current_subscript(False))
            self._current_subscript_stage['subscript_exec_count'].update({subscript.name:0})
            self._current_subscript_stage['subscript_exec_duration'].update({subscript.name: datetime.timedelta(0)})

                #todo: 170202JG (search for this to find related todos) need to test this:
                # do we need to connect the log functions of the subscript to the mother script?, e.g
                # subscript.log.connect(self.log)


        self.log('starting script {:s} at {:s} on {:s}'.format(self.name, self.start_time.strftime('%H:%M:%S'),self.start_time.strftime('%d/%m/%y')))
        self._abort = False

        #saves standard to disk
        if self.settings['save']:
            self.save_b26()

        self.started.emit()

        self._function()
        self.end_time  = datetime.datetime.now()
        self.log('script {:s} finished at {:s} on {:s}'.format(self.name, self.end_time.strftime('%H:%M:%S'),self.end_time.strftime('%d/%m/%y')))

        #saves standard to disk
        if self.settings['save']:
            self.save_data()
            self.save_log()
            self.save_image_to_disk()

        success = not self._abort

        # disconnect subscripts
        for subscript in list(self.scripts.values()):
            subscript.started.disconnect()
            subscript.updateProgress.disconnect()
            subscript.finished.disconnect()
        self.is_running = False
        self.finished.emit()