Skip to content

Commit df9ea95

Browse files
authored
Merge pull request #2116 from effigies/fix/reduce-recommendation-levels
FIX: Rescope or downgrade excess RECOMMENDED fields
2 parents 1547200 + 4f2a898 commit df9ea95

File tree

12 files changed

+155
-72
lines changed

12 files changed

+155
-72
lines changed

src/metaschema.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -595,8 +595,7 @@
595595
},
596596
"required": ["level"],
597597
"additionalProperties": false
598-
},
599-
{ "type": "string", "pattern": "recommended.*" }
598+
}
600599
]
601600
},
602601
"issue": {

src/modality-specific-files/magnetic-resonance-imaging-data.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ A guide for using macros can be found at
161161
https://github.com/bids-standard/bids-specification/blob/master/macros_doc.md
162162
-->
163163
{{ MACROS___make_sidecar_table([
164-
"mri.MRIB0FieldIdentifier",
164+
"fmap.MRIFieldmapB0FieldIdentifier",
165165
"mri.MRIEchoPlanarImagingAndB0FieldSource",
166166
])
167167
}}

src/schema/rules/checks/fmap.yaml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,3 +65,19 @@ EPISmallBVals:
6565
- '"bval" in associations'
6666
checks:
6767
- min(associations.bval.values) < 100
68+
69+
TotalReadoutTimeMustDefine:
70+
issue:
71+
code: TOTAL_READOUT_TIME_MUST_DEFINE
72+
message: |
73+
You must provide enough metadata to determine the TotalReadoutTime of this file.
74+
`TotalReadoutTime` or `EffectiveEchoSpacing` satisfy this criterion.
75+
level: error
76+
selectors:
77+
- datatype == "fmap"
78+
- suffix == "epi"
79+
- match(extension, "^\.nii(\.gz)?$")
80+
checks:
81+
- |
82+
sidecar.TotalReadoutTime ||
83+
sidecar.EffectiveEchoSpacing

src/schema/rules/sidecars/eeg.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,10 @@ EEGRecommended:
7474
TriggerChannelCount: recommended
7575
RecordingDuration: recommended
7676
RecordingType: recommended
77-
EpochLength: recommended
77+
EpochLength:
78+
level: optional
79+
# Implemented in rules.sidecars.electrophys
80+
level_addendum: recommended if RecordingType is "epoched"
7881
EEGGround: recommended
7982
HeadCircumference: recommended
8083
EEGPlacementScheme: recommended
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# Common rules for electrophysiological types
2+
---
3+
EpochedData:
4+
selectors:
5+
- intersects([datatype], ['eeg', 'meg', 'ieeg'])
6+
- sidecar.RecordingType == 'epoched'
7+
fields:
8+
EpochLength: recommended

src/schema/rules/sidecars/fmap.yaml

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,16 @@ MRIFieldmapB0FieldIdentifier:
2323
- match(extension, '\.nii(\.gz)?$')
2424
- '!("IntendedFor" in sidecar)'
2525
fields:
26-
B0FieldIdentifier: recommended
26+
B0FieldIdentifier:
27+
level: recommended
28+
issue:
29+
code: B0_FIELD_IDENTIFIER_RECOMMENDED
30+
message: |
31+
File is missing B0FieldIdentifier metadata and IntendedFor metadata,
32+
so it will not be possible to use to perform susceptibility distortion correction.
33+
B0FieldIdentifier metadata permits the flexible selection of images
34+
for estimating B0 inhomogeneity fields, and B0FieldSource permits EPI
35+
images to indicate the identifier of the estimated field to use.
2736
2837
# Case 1: Phase-difference map and at least one magnitude image
2938
MRIFieldmapPhaseDifferencePhasediff:
@@ -60,15 +69,27 @@ MRIFieldmapDirectFieldMapping:
6069
Fieldmaps must be in units of Hertz (`"Hz"`),
6170
radians per second (`"rad/s"`), or Tesla (`"T"`).
6271
63-
# Case 4: Multiple phase encoded directions ("pepolar")
72+
# Case 4: Multiple phase-encoded directions ("pepolar")
6473
MRIFieldmapPepolar:
6574
selectors:
6675
- datatype == "fmap"
6776
- suffix == "epi"
6877
- match(extension, '\.nii(\.gz)?$')
6978
fields:
70-
PhaseEncodingDirection: required
71-
TotalReadoutTime: required
79+
PhaseEncodingDirection:
80+
level: required
81+
issue:
82+
code: PHASE_ENCODING_DIRECTION_MUST_DEFINE
83+
message: |
84+
You have to define 'PhaseEncodingDirection' for this file.
85+
TotalReadoutTime:
86+
level: optional
87+
level_addendum: |
88+
required if other methods for calculating readout time are not present
89+
EffectiveEchoSpacing:
90+
level: optional
91+
level_addendum: |
92+
required if other methods for calculating readout time are not present
7293
7394
TB1EPI:
7495
selectors:

src/schema/rules/sidecars/func.yaml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,16 +53,16 @@ MRIFuncTimingParameters:
5353
- suffix == "bold"
5454
- match(extension, "^\.nii(\.gz)?$")
5555
fields:
56-
NumberOfVolumesDiscardedByScanner: recommended
57-
NumberOfVolumesDiscardedByUser: recommended
58-
DelayTime: recommended
56+
NumberOfVolumesDiscardedByScanner: optional
57+
NumberOfVolumesDiscardedByUser: optional
58+
DelayTime: optional
5959
AcquisitionDuration:
60-
level: recommended
60+
level: optional
6161
level_addendum: |
6262
required for sequences that are described with the `VolumeTiming`
6363
field and that do not have the `SliceTiming` field set to allow for
6464
accurate calculation of "acquisition time"
65-
DelayAfterTrigger: recommended
65+
DelayAfterTrigger: optional
6666

6767
# fMRI task information
6868
MRIFuncTaskInformation:

src/schema/rules/sidecars/ieeg.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,10 @@ iEEGRecommended:
8080
TriggerChannelCount: recommended
8181
RecordingDuration: recommended
8282
RecordingType: recommended
83-
EpochLength: recommended
83+
EpochLength:
84+
level: optional
85+
# Implemented in rules.sidecars.electrophys
86+
level_addendum: recommended if RecordingType is "epoched"
8487
iEEGGround: recommended
8588
iEEGPlacementScheme: recommended
8689
iEEGElectrodeGroups: recommended

src/schema/rules/sidecars/meg.yaml

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,10 @@ MEGRecommended:
102102
TriggerChannelCount: recommended
103103
RecordingDuration: recommended
104104
RecordingType: recommended
105-
EpochLength: recommended
105+
EpochLength:
106+
level: optional
107+
# Implemented in rules.sidecars.electrophys
108+
level_addendum: recommended if RecordingType is "epoched"
106109
ContinuousHeadLocalization: recommended
107110
HeadCoilFrequency: recommended
108111
MaxMovement: recommended

src/schema/rules/sidecars/mri.yaml

Lines changed: 75 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ MRIHardware:
3838
ReceiveCoilName: recommended
3939
ReceiveCoilActiveElements: recommended
4040
NumberReceiveCoilActiveElements: optional
41-
GradientSetType: recommended
42-
MRTransmitCoilSequence: recommended
41+
GradientSetType: optional
42+
MRTransmitCoilSequence: optional
4343
MatrixCoilMode: recommended
4444
CoilCombinationMethod: recommended
4545
NumberTransmitCoilActiveElements: optional
@@ -96,19 +96,27 @@ MRISequenceSpecifics:
9696
description_addendum: |
9797
Corresponds to [DICOM Tag 0018, 0020](https://dicomlookup.com/dicomtags/(0018,0020)) `Scanning Sequence`.
9898
SequenceVariant: recommended
99-
ScanOptions: recommended
99+
ScanOptions: optional
100100
SequenceName: recommended
101101
PulseSequenceDetails: recommended
102-
NonlinearGradientCorrection: |
103-
recommended, but required if [PET](./positron-emission-tomography.md) data are present
104-
MRAcquisitionType: recommended, but required for Arterial Spin Labeling
105-
MTState: recommended
102+
NonlinearGradientCorrection:
103+
level: recommended
104+
level_addendum: required if [PET](./positron-emission-tomography.md) data are present
105+
MRAcquisitionType:
106+
level: recommended
107+
level_addendum: required for Arterial Spin Labeling
108+
MTState:
109+
level: optional
110+
level_addendum: required if the `mt` entity is present
106111
MTOffsetFrequency: optional
107112
MTPulseBandwidth: optional
108113
MTNumberOfPulses: optional
109114
MTPulseShape: optional
110115
MTPulseDuration: optional
111-
SpoilingState: recommended
116+
NumberShots:
117+
level: optional
118+
level_addendum: required for some qMRI sequences
119+
SpoilingState: optional
112120
SpoilingType: optional
113121
SpoilingRFPhaseIncrement: optional
114122
SpoilingGradientMoment: optional
@@ -168,22 +176,54 @@ MRISpatialEncoding:
168176
- modality == "mri"
169177
- match(extension, "^\.nii(\.gz)?$")
170178
fields:
171-
NumberShots: recommended
172-
ParallelReductionFactorInPlane: recommended
173-
ParallelReductionFactorOutOfPlane: recommended
174-
ParallelAcquisitionTechnique: recommended
175-
PartialFourier: recommended
176-
PartialFourierDirection: recommended
179+
ParallelReductionFactorInPlane:
180+
level: optional
181+
level_addendum: recommended if `ParallelAcquisitionTechnique` is defined
182+
ParallelReductionFactorOutOfPlane:
183+
level: optional
184+
level_addendum: recommended if `ParallelAcquisitionTechnique` is defined
185+
ParallelAcquisitionTechnique: optional
186+
PartialFourier: optional
187+
PartialFourierDirection:
188+
level: optional
189+
level_addendum: recommended if PartialFourier is defined
177190
EffectiveEchoSpacing:
178-
level: recommended
179-
level_addendum: required if corresponding fieldmap data present
191+
level: optional
192+
level_addendum: recommended if corresponding fieldmap data present
180193
description_addendum: <sup>2</sup>
181-
MixingTime: recommended
194+
MixingTime:
195+
level: optional
196+
level_addendum: required for some qMRI sequences
197+
198+
MRIPartialFourier:
199+
selectors:
200+
- modality == "mri"
201+
- match(extension, "^\.nii(\.gz)?$")
202+
- type(sidecar.PartialFourier) != "null"
203+
fields:
204+
PartialFourierDirection: recommended
205+
206+
MRIParallelReductionFactorInPlane:
207+
selectors:
208+
- modality == "mri"
209+
- match(extension, "^\.nii(\.gz)?$")
210+
- type(sidecar.ParallelAcquisitionTechnique) == "string"
211+
fields:
212+
ParallelReductionFactorInPlane: recommended
213+
214+
MRIParallelReductionFactorOutOfPlane:
215+
selectors:
216+
- modality == "mri"
217+
- match(extension, "^\.nii(\.gz)?$")
218+
- type(sidecar.ParallelAcquisitionTechnique) == "string"
219+
- sidecar.MRAcquisitionType == "3D"
220+
fields:
221+
ParallelReductionFactorOutOfPlane: recommended
182222

183223
PhaseEncodingDirectionRec:
184224
selectors:
185225
- modality == "mri"
186-
- suffix != "epi"
226+
- intersects(suffix, ["bold", "sbref", "dwi", "asl"])
187227
- match(extension, "^\.nii(\.gz)?$")
188228
fields:
189229
PhaseEncodingDirection:
@@ -194,32 +234,13 @@ PhaseEncodingDirectionRec:
194234
(which can be later used for field inhomogeneity correction).
195235
TotalReadoutTime:
196236
level: recommended
237+
description_addendum: <sup>3</sup>
197238
level_addendum: |
198239
required if corresponding 'field/distortion' maps
199240
acquired with opposing phase encoding directions are present
200241
(see [Case 4: Multiple phase encoded
201242
directions](#case-4-multiple-phase-encoded-directions-pepolar))
202243
203-
PhaseEncodingDirectionReq:
204-
selectors:
205-
- datatype == "fmap"
206-
- suffix == "epi"
207-
- match(extension, "^\.nii(\.gz)?$")
208-
fields:
209-
PhaseEncodingDirection:
210-
level: required
211-
issue:
212-
code: PHASE_ENCODING_DIRECTION_MUST_DEFINE
213-
message: |
214-
You have to define 'PhaseEncodingDirection' for this file.
215-
TotalReadoutTime:
216-
level: required
217-
description_addendum: <sup>3</sup>
218-
issue:
219-
code: TOTAL_READOUT_TIME_MUST_DEFINE
220-
message: |
221-
You have to define 'TotalReadoutTime' for this file.
222-
223244
MRITimingParameters:
224245
selectors:
225246
- modality == "mri"
@@ -237,7 +258,9 @@ MRITimingParameters:
237258
[ASL](SPEC_ROOT/modality-specific-files/magnetic-resonance-imaging-data.md#\
238259
arterial-spin-labeling-perfusion-data)
239260
or variable echo time fMRI sequences.
240-
InversionTime: recommended
261+
InversionTime:
262+
level: optional
263+
level_addendum: required if `inv` entity is present
241264
DwellTime: recommended
242265

243266
EchoTimeRequiredASL:
@@ -259,7 +282,7 @@ SliceTimingMRI:
259282
level_addendum: |
260283
required for sparse sequences that do not have the `DelayTime` field set,
261284
and Arterial Spin Labeling with `MRAcquisitionType` set on `2D`.
262-
SliceEncodingDirection: recommended
285+
SliceEncodingDirection: optional
263286

264287
SliceTimingASL:
265288
selectors:
@@ -346,7 +369,7 @@ MRISliceAcceleration:
346369
- modality == "mri"
347370
- match(extension, "^\.nii(\.gz)?$")
348371
fields:
349-
MultibandAccelerationFactor: recommended
372+
MultibandAccelerationFactor: optional
350373

351374
MRIAnatomicalLandmarks:
352375
selectors:
@@ -356,20 +379,23 @@ MRIAnatomicalLandmarks:
356379
fields:
357380
AnatomicalLandmarkCoordinates__mri: recommended
358381

359-
MRIB0FieldIdentifier:
360-
selectors:
361-
- datatype == 'fmap'
362-
- match(extension, '\.nii(\.gz)?$')
363-
fields:
364-
B0FieldIdentifier: recommended
365-
366382
MRIEchoPlanarImagingAndB0FieldSource:
367383
selectors:
368384
- intersects(datatype, ['dwi', 'func', 'perf'])
369385
- intersects(dataset.datatypes, ['fmap'])
370386
- match(extension, "^\.nii(\.gz)?$")
371387
fields:
372-
B0FieldSource: recommended
388+
B0FieldSource:
389+
level: recommended
390+
issue:
391+
code: B0_FIELD_SOURCE_RECOMMENDED
392+
message: |
393+
File is missing B0FieldSource metadata, so it may not be possible to
394+
perform susceptibility distortion correction on it.
395+
B0FieldIdentifier metadata permits the flexible selection of images
396+
for estimating B0 inhomogeneity fields, and B0FieldSource permits EPI
397+
images to indicate the identifier of the estimated field to use.
398+
If associations are fully specified with `IntendedFor`, there is no need to change this.
373399
374400
MRIInstitutionInformation:
375401
selectors:

0 commit comments

Comments
 (0)