def save_config(self, filepath):
        """
        saves gui configuration to out_file_name
        Args:
            filepath: name of file
        """
        def get_hidden_parameter(item):

            num_sub_elements = item.childCount()

            if num_sub_elements == 0:
                dictator = {item.name : item.visible}
            else:
                dictator = {item.name:{}}
                for child_id in range(num_sub_elements):
                    dictator[item.name].update(get_hidden_parameter(item.child(child_id)))
            return dictator

        try:
            filepath = str(filepath)
            if not os.path.exists(os.path.dirname(filepath)):
                os.makedirs(os.path.dirname(filepath))

            # build a dictionary for the configuration of the hidden parameters
            dictator = {}
            for index in range(self.tree_scripts.topLevelItemCount()):
                script_item = self.tree_scripts.topLevelItem(index)
                dictator.update(get_hidden_parameter(script_item))

            dictator = {"gui_settings": self.gui_settings, "gui_settings_hidden": self.gui_settings_hidden, "scripts_hidden_parameters":dictator}

            # update the internal dictionaries from the trees in the gui
            for index in range(self.tree_scripts.topLevelItemCount()):
                script_item = self.tree_scripts.topLevelItem(index)
                self.update_script_from_item(script_item)

            dictator.update({'instruments': {}, 'scripts': {}, 'probes': {}})

            for instrument in self.instruments.values():
                dictator['instruments'].update(instrument.to_dict())
            for script in self.scripts.values():
                dictator['scripts'].update(script.to_dict())

            for instrument, probe_dict in self.probes.items():
                dictator['probes'].update({instrument: ','.join(list(probe_dict.keys()))})

            with open(filepath, 'w') as outfile:
                json.dump(dictator, outfile, indent=4)

            save_config_path = os.path.abspath(os.path.join(os.path.dirname(__file__), os.pardir, 'save_config.json'))
            if os.path.isfile(save_config_path) and os.access(save_config_path, os.R_OK):
                with open(save_config_path, 'w') as outfile:
                    json.dump({'last_save_path': filepath}, outfile, indent=4)
            else:
                with io.open(save_config_path, 'w') as save_config_file:
                    save_config_file.write(json.dumps({'last_save_path': filepath}))

            self.log('Saved GUI configuration (location: {0}'.format(filepath))
        except Exception:
            msg = QtWidgets.QMessageBox()
            msg.setText("Saving failed. Please use 'save as' to define a valid path for the gui.")
            msg.exec_()