[docs]defgenerate_bids_skeleton(target_path,bids_config):""" Converts a BIDS directory in dictionary form to a file structure. The BIDS configuration can either be a YAML or JSON file, or :obj:dict: object. Parameters ---------- target_path : str Path to generate BIDS directory at (must not exist) bids_config : dict or str Configuration on how to create the BIDS directory. """ifisinstance(bids_config,dict):# ensure dictionary remains unalteredbids_dict=deepcopy(bids_config)elifisinstance(bids_config,str):bids_config=Path(bids_config).read_text()try:bids_dict=json.loads(bids_config)exceptjson.JSONDecodeError:bids_dict=yaml.safe_load(bids_config)_bids_dict=deepcopy(bids_dict)root=Path(target_path).absolute()root.mkdir(parents=True)desc=bids_dict.pop('dataset_description',None)ifdescisNone:# default descriptiondesc={'Name':'Default','BIDSVersion':'1.6.0'}to_json(root/'dataset_description.json',desc)cached_subject_data=Noneforsubject,sessionsinbids_dict.items():bids_subject=subjectifsubject.startswith('sub-')elsef'sub-{subject}'subj_path=root/bids_subjectsubj_path.mkdir(exist_ok=True)ifsessions=='*':# special case to copy previous subject datasessions=cached_subject_data.copy()ifisinstance(sessions,dict):# single sessionsessions.update({'session':None})sessions=[sessions]cached_subject_data=deepcopy(sessions)forsessioninsessions:ses_name=session.pop('session',None)ifses_nameisnotNone:bids_session=ses_nameifses_name.startswith('ses-')elsef'ses-{ses_name}'bids_prefix=f'{bids_subject}_{bids_session}'curr_path=subj_path/bids_sessioncurr_path.mkdir(exist_ok=True)else:bids_prefix=bids_subjectcurr_path=subj_path# create modalitiesformodality,filesinsession.items():modality_path=curr_path/modalitymodality_path.mkdir(exist_ok=True)ifisinstance(files,dict):# single file / metadata combofiles=[files]forbids_fileinfiles:metadata=bids_file.pop('metadata',None)extension=bids_file.pop('extension','.nii.gz')suffix=bids_file.pop('suffix')entities=combine_entities(**bids_file)data_file=modality_path/f'{bids_prefix}{entities}_{suffix}{extension}'data_file.touch()ifmetadataisnotNone:out_metadata=data_file.parent/data_file.name.replace(extension,'.json')to_json(out_metadata,metadata)return_bids_dict