Skip to content

Commit 8ddf7f8

Browse files
author
Dan Levitas
committed
[ENH] Add BIDS URI option for IntendedFor mapping
1 parent 5a83cec commit 8ddf7f8

File tree

5 files changed

+52
-17
lines changed

5 files changed

+52
-17
lines changed

handler/convert.js

Lines changed: 6 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

handler/ezBIDS_core/ezBIDS_core.py

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,12 @@ def modify_uploaded_dataset_list(uploaded_img_list):
473473
config_file = ""
474474
exclude_data = False
475475

476-
config_file_list = natsorted([x for x in os.listdir(DATA_DIR) if x.endswith('ezBIDS_template.json')])
476+
config_file_list = []
477+
for root, dirs, files in os.walk(DATA_DIR):
478+
for file in files:
479+
if file.endswith('ezBIDS_template.json'):
480+
config_file_list.append(os.path.join(root, file))
481+
477482
if len(config_file_list):
478483
# Ideally only one config file uploaded, but if multiple configurations found, select last one (most recent?)
479484
config = True
@@ -1392,7 +1397,7 @@ def determine_sub_ses_IDs(dataset_list, bids_compliant):
13921397
List of dictionaries containing pertinent and unique information about
13931398
the data, primarily coming from the metadata in the json files.
13941399
1395-
subjects_information : list
1400+
subs_information : list
13961401
List of dictionaries containing subject identification info, such as
13971402
PatientID, PatientName, PatientBirthDate, and corresponding session
13981403
information.
@@ -1402,7 +1407,7 @@ def determine_sub_ses_IDs(dataset_list, bids_compliant):
14021407
"""
14031408
date_counter = 1
14041409
subject_idx_counter = 0
1405-
subjects_information = []
1410+
subs_information = []
14061411
participants_info = {}
14071412
# Determine unique subjects from uploaded dataset
14081413
for sub in np.unique([x["subject"] for x in dataset_list]):
@@ -1550,9 +1555,9 @@ def determine_sub_ses_IDs(dataset_list, bids_compliant):
15501555
"validationErrors": []
15511556
}
15521557

1553-
subjects_information.append(subject_ids_info)
1558+
subs_information.append(subject_ids_info)
15541559

1555-
return dataset_list, subjects_information, participants_info
1560+
return dataset_list, subs_information, participants_info
15561561

15571562

15581563
def determine_unique_series(dataset_list, bids_compliant):
@@ -1638,15 +1643,15 @@ def determine_unique_series(dataset_list, bids_compliant):
16381643
return dataset_list, dataset_list_unique_series
16391644

16401645

1641-
def template_configuration(dataset_list_unique_series, subjects_information, config_file):
1646+
def template_configuration(dataset_list_unique_series, subs_information, config_file):
16421647
"""
16431648
Parameters
16441649
----------
16451650
dataset_list_unique_series : list of dictionaries
16461651
A modified version of dataset_list, where this list contains only the
16471652
dictionaries of acquisitions with a unique series group ID.
16481653
1649-
subjects_information : list
1654+
subs_information : list
16501655
List of dictionaries containing subject identification info, such as
16511656
PatientID, PatientName, PatientBirthDate, and corresponding session
16521657
information.
@@ -1669,13 +1674,16 @@ def template_configuration(dataset_list_unique_series, subjects_information, con
16691674
A modified version of dataset_list, where this list contains only the
16701675
dictionaries of acquisitions with a unique series group ID.
16711676
1672-
subjects_information : list
1677+
subs_information : list
16731678
List of dictionaries containing subject identification info, such as
16741679
PatientID, PatientName, PatientBirthDate, and corresponding session
16751680
information.
16761681
16771682
events : dictionary
16781683
Information pertaining to the events timing files for func/bold data.
1684+
1685+
bids_uri : boolean
1686+
Specifies whether or not user wants BIDS URI format for IntendedFor metadata mapping
16791687
"""
16801688

16811689
config_data = open(config_file)
@@ -1687,6 +1695,7 @@ def template_configuration(dataset_list_unique_series, subjects_information, con
16871695
subjects_sessions_info = config_data["subjects"]
16881696
config_dataset_list_unique_series = config_data["series"]
16891697
config_dataset_list_objects = config_data["objects"]
1698+
bids_uri = config_data["BIDSURI"]
16901699

16911700
# Try to determine subject (and session) mapping from what's in the configuration
16921701
match_start_index = None
@@ -1712,7 +1721,7 @@ def template_configuration(dataset_list_unique_series, subjects_information, con
17121721
"AcquisitionDateTime"
17131722
]
17141723

1715-
for sub_info in subjects_information:
1724+
for sub_info in subs_information:
17161725
sub = sub_info["subject"]
17171726
for key in ref_patient_info.keys():
17181727
if ref_subject_id in ref_patient_info[key]:
@@ -1819,7 +1828,7 @@ def template_configuration(dataset_list_unique_series, subjects_information, con
18191828
events["sampleValues"] = {}
18201829

18211830
return (readme, dataset_description_dic, participants_column_info,
1822-
dataset_list_unique_series, subjects_information, events)
1831+
dataset_list_unique_series, subs_information, events, bids_uri)
18231832

18241833

18251834
def create_lookup_info():
@@ -3106,15 +3115,15 @@ def check_dwi_b0maps(dataset_list_unique_series):
31063115
dataset_list = organize_dataset(dataset_list)
31073116

31083117
# Determine subject (and session) information
3109-
dataset_list, subjects_information, participants_info = determine_sub_ses_IDs(dataset_list, bids_compliant)
3118+
dataset_list, subs_information, participants_info = determine_sub_ses_IDs(dataset_list, bids_compliant)
31103119

31113120
# Make a new list containing the dictionaries of only unique dataset acquisitions
31123121
dataset_list, dataset_list_unique_series = determine_unique_series(dataset_list, bids_compliant)
31133122

31143123
# If ezBIDS configuration file detected in upload, use that for datatype, suffix, and entity identifications
31153124
if config is True:
3116-
readme, dataset_description_dic, participants_column_info, dataset_list_unique_series, subjects_information, events = \
3117-
template_configuration(dataset_list_unique_series, subjects_information, config_file)
3125+
readme, dataset_description_dic, participants_column_info, dataset_list_unique_series, subs_information, events, \
3126+
bids_uri = template_configuration(dataset_list_unique_series, subs_information, config_file)
31183127

31193128
else:
31203129
# README
@@ -3160,6 +3169,9 @@ def check_dwi_b0maps(dataset_list_unique_series):
31603169
}
31613170
}
31623171

3172+
# BIDS URI
3173+
bids_uri = False
3174+
31633175
# Generate lookup information directory to help with datatype and suffix identification (and to some degree, entities)
31643176
lookup_dic = create_lookup_info()
31653177

@@ -3212,12 +3224,13 @@ def check_dwi_b0maps(dataset_list_unique_series):
32123224
EZBIDS = {
32133225
"readme": readme,
32143226
"datasetDescription": dataset_description_dic,
3215-
"subjects": subjects_information,
3227+
"subjects": subs_information,
32163228
"participantsColumn": participants_column_info,
32173229
"participantsInfo": participants_info,
32183230
"series": ui_series_info_list,
32193231
"objects": objects_list,
3220-
"events": events
3232+
"events": events,
3233+
"BIDSURI": bids_uri
32213234
}
32223235

32233236
# Write dictionary to ezBIDS_core.json

ui/src/Finalize.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ export default defineComponent({
204204
205205
//things that convert.ts uses
206206
objects: this.ezbids.objects, //most important thing that convert.ts needs
207+
BIDSURI: this.ezbids.BIDSURI,
207208
events: this.ezbids.events,
208209
entityMappings, //helps with convert
209210
datasetDescription: this.ezbids.datasetDescription,

ui/src/SeriesPage.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,9 @@
4848
The information you specify here will be applied to all subjects that uses matching
4949
SeriesDescription. You can also override this information later for each subject.
5050
</p>
51+
<el-checkbox v-model="this.ezbids.BIDSURI" @change="BIDSURI(this.ezbids, $event)">
52+
<small>Use BIDS URI format for IntendedFor metadata mapping (if applicable)</small>
53+
</el-checkbox>
5154
<div style="background-color: white; padding: 10px; color: #666">
5255
<i class="el-icon-back" /> &lt; Please select a series to view/edit
5356
</div>
@@ -308,7 +311,7 @@ import ModalityForm from './components/modalityForm.vue';
308311
309312
import { prettyBytes } from './filters';
310313
311-
import { Series, IObject } from './store';
314+
import { Series, IObject, IEzbids } from './store';
312315
313316
import { validateEntities, validate_B0FieldIdentifier_B0FieldSource, metadataAlerts } from './libUnsafe';
314317
import anatYaml from '../src/assets/schema/rules/sidecars/anat.yaml';
@@ -378,6 +381,16 @@ export default defineComponent({
378381
this.showInfo[entity] = !this.showInfo[entity];
379382
},
380383
384+
BIDSURI($root: IEzbids, b: boolean) {
385+
if (b === true) {
386+
$root.BIDSURI = true;
387+
localStorage.setItem('checkboxState', 'true');
388+
} else {
389+
$root.BIDSURI = false;
390+
localStorage.setItem('checkboxState', 'false');
391+
}
392+
},
393+
381394
validate(s: Series | null) {
382395
if (!s) return;
383396
@@ -389,7 +402,7 @@ export default defineComponent({
389402
validate_B0FieldIdentifier_B0FieldSource(s);
390403
}
391404
392-
/* Alert users to metadata issues, such as missing required fields or
405+
/* Alert users to metadata issues, such as missing required fields or
393406
improperly-formmated metadata field values.
394407
*/
395408
let bidsDatatypeMetadata = {};

ui/src/store/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,6 +314,7 @@ const state = {
314314
subjects: [] as Subject[],
315315
series: [] as Series[],
316316
objects: [] as IObject[],
317+
BIDSURI: false,
317318

318319
_organized: [] as OrganizedSubject[], //above things are organized into subs/ses/run/object hierarchy for quick access
319320

@@ -509,6 +510,7 @@ const store = createStore({
509510
subjects: [],
510511
series: [],
511512
objects: [],
513+
BIDSURI: false,
512514

513515
_organized: [], //above things are organized into subs/ses/run/object hierarchy for quick access
514516

0 commit comments

Comments
 (0)