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)
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)
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)
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)
def test_validate_experiment_throws_unregistered_expection_on_unregistered_experiment( self): experiment_name = 'doesnotexist' with self.assertRaises(UnregisteredExperimentException): validate_experiment(experiment_name)
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()