[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.load(bids_config,Loader=yaml.Loader)_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