Example #1
0
    def test_validate_experiment_throws_file_not_found_with_incorrect_field_path(
            self):
        # define an invalid path
        path = 'does/not/exist'

        # assert it raises the expected exception for an invalid field_path kwarg
        with self.assertRaises(FileNotFoundError):
            validate_experiment(DEFAULT_EXPERIMENT_ID, field_path=path)
Example #2
0
def bci_main(parameter_location: str, user: str, task: TaskType, experiment: str = DEFAULT_EXPERIMENT_ID) -> bool:
    """BCI Main.

    The BCI main function will initialize a save folder, construct needed information
    and execute the task. This is the main connection between any UI and
    running the app.

    It may also be invoked via tha command line.
        Ex. `python bci_main.py` this will default parameters, mode, user, and type.

        You can pass it those attributes with flags, if desired.
            Ex. `python bci_main.py --user "bci_user" --task "RSVP Calibration" --experiment "default"

    Input:
        parameter_location (str): location of parameters file to use
        user (str): name of the user
        task (TaskType): registered bcipy TaskType
        experiment_id (str): Name of the experiment. Default name is DEFAULT_EXPERIMENT_ID.


    """
    validate_experiment(experiment)
    # Load parameters
    parameters = load_json_parameters(parameter_location, value_cast=True)

    # Update property to reflect the parameter source
    parameters['parameter_location'] = parameter_location
    if parameter_location != DEFAULT_PARAMETERS_PATH:
        parameters.save()
        default_params = load_json_parameters(DEFAULT_PARAMETERS_PATH, value_cast=True)
        if parameters.add_missing_items(default_params):
            raise Exception('Parameters file out of date.')

    # update our parameters file with system related information
    sys_info = get_system_info()

    # Initialize Save Folder
    save_folder = init_save_data_structure(
        parameters['data_save_loc'],
        user,
        parameter_location,
        task=task.label,
        experiment_id=experiment)

    # configure bcipy session logging
    configure_logger(save_folder,
                     log_name=parameters['log_name'],
                     version=sys_info['bcipy_version'])

    logging.getLogger(__name__).info(sys_info)

    # Collect experiment field data
    collect_experiment_field_data(experiment, save_folder)

    return execute_task(task, parameters, save_folder)
Example #3
0
    def test_validate_experiment_returns_true_on_default(self):
        experiment_name = DEFAULT_EXPERIMENT_ID

        # rely on the default experiment and field path kwargs, pass the experiment_name for validation
        response = validate_experiment(experiment_name)

        self.assertTrue(response)
Example #4
0
    def test_validate_experiment_throws_unregistered_exception_on_unregistered_fields(
            self):
        # create a fake experiment to load
        experiment_name = 'test'
        experiment = {
            experiment_name: {
                'fields': [{
                    'does_not_exist': {
                        'required': 'false'
                    }
                }],
                'summary': ''
            }
        }

        # save it to a custom path (away from default)
        path = save_experiment_data(experiment, '.', 'test_experiment.json')

        # assert it raises the expected exception
        with self.assertRaises(UnregisteredFieldException):
            validate_experiment(experiment_name, experiment_path=path)

        os.remove(path)
Example #5
0
 def test_validate_experiment_throws_unregistered_expection_on_unregistered_experiment(
         self):
     experiment_name = 'doesnotexist'
     with self.assertRaises(UnregisteredExperimentException):
         validate_experiment(experiment_name)
Example #6
0
def start_app() -> None:
    """Start Experiment Field Collection."""
    import argparse
    from bcipy.helpers.validate import validate_experiment, validate_field_data_written
    from bcipy.helpers.system_utils import DEFAULT_EXPERIMENT_ID

    parser = argparse.ArgumentParser()
    # save path

    # experiment_name
    parser.add_argument(
        '-p',
        '--path',
        default='.',
        help='Path to save collected field data to in json format')
    parser.add_argument(
        '-e',
        '--experiment',
        default=DEFAULT_EXPERIMENT_ID,
        help='Select a valid experiment to run the task for this user')
    parser.add_argument(
        '-f',
        '--filename',
        default='experiment_data.json',
        help=
        'Provide a json filename to write the field data to. Ex, experiment_data.json'
    )
    parser.add_argument(
        '-v',
        '--validate',
        default=False,
        help=
        'Whether or not to validate the experiment before proceeding to data collection.'
    )

    args = parser.parse_args()

    experiment_name = args.experiment
    validate = args.validate

    if validate:
        validate_experiment(experiment_name)
        print('Experiment valid!')

    save_path = args.path
    file_name = args.filename

    bcipy_gui = app(sys.argv)
    # todo change height based on field #?
    ex = MainPanel(title='Experiment Field Collection',
                   height=250,
                   width=600,
                   experiment_name=experiment_name,
                   save_path=save_path,
                   file_name=file_name)
    bcipy_gui.exec_()

    if validate:
        if validate_field_data_written(save_path, file_name):
            print('Field data successfully written!')
        else:
            raise Exception(
                f'Field data not written to {save_path}/{file_name}')

    sys.exit()