Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ENH] Define channel column for events and Delimiter field for column descriptions #1483

Merged
merged 7 commits into from
Nov 13, 2023
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/common-principles.md
Original file line number Diff line number Diff line change
Expand Up @@ -483,6 +483,7 @@ and a guide for using macros can be found at
),
"Levels": "RECOMMENDED",
"Units": "RECOMMENDED",
"Delimiter": "OPTIONAL",
"TermURL": "RECOMMENDED",
"HED": "OPTIONAL",
}
Expand Down
55 changes: 43 additions & 12 deletions src/modality-specific-files/task-events.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,9 +82,10 @@ A guide for using macros can be found at
Example of the content of the TSV file:

```Text
onset duration trial_type response_time stim_file
1.23 0.65 start 1.435 images/red_square.jpg
5.65 0.65 stop 1.739 images/blue_square.jpg
onset duration trial_type response_time stim_file channel annots
1.23 0.65 start 1.435 images/red_square.jpg n/a n/a
5.65 0.65 stop 1.739 images/blue_square.jpg n/a n/a
12.1 2.35 n/a n/a n/a F,1|F,2|Cz musc
```

In the accompanying JSON sidecar, the `trial_type` column might look as follows:
Expand All @@ -98,12 +99,49 @@ In the accompanying JSON sidecar, the `trial_type` column might look as follows:
"start": "A red square is displayed to indicate starting",
"stop": "A blue square is displayed to indicate stopping"
}
},
"channel": {
"Description": "Channel(s) associated with the event",
"Delimiter": "|"
},
"annots": {
"LongName": "Annotations",
"Description": "Hierarchical Event Descriptors (HED) annotations",
sappelhoff marked this conversation as resolved.
Show resolved Hide resolved
"Levels": {
"musc": "Muscle artifact. A very common, high frequency, sharp artifact that corresponds with agitation/nervousness in a patient."
},
"HED": {
"musc": "EMG-artifact"
}
}
}
```

Note that all other columns SHOULD also be described but are omitted for the
sake of brevity.
Note that in the example above:

1. Only a subset of columns are described for the sake of brevity.
In a real dataset, all other columns SHOULD also be described.

1. The `channel` column contains a list of values that are separated
VisLab marked this conversation as resolved.
Show resolved Hide resolved
by a delimiter (`|`), as is declared in the `Delimiter` metadata
field of the `events.json file.
Thus, the channels related to the event in the third row of the example
are called `F,1`, `F,2`, and `Cz`.

1. The example contains a column called `annots`.
This column is not defined in BIDS, and constitutes additional, arbitrary
(that is, unofficial) metadata.
In the present case, it is used to describe artifacts in the data,
sappelhoff marked this conversation as resolved.
Show resolved Hide resolved
in reference to the `channel` column.
The `annots` column is making
use of the powerful HED system for documenting events, see below.

Events MAY also be documented in machine-actionable form
using HED (Hierarchical Event Descriptor) tags.
This type of documentation is particularly useful for datasets likely to be used
in event-related analyses.
See [Hierarchical Event Descriptors](../appendices/hed.md)
for additional information and examples.

For multi-echo files, the `events.tsv` file is applicable to all echos of
a particular run:
Expand All @@ -125,13 +163,6 @@ A guide for using macros can be found at
}
) }}

Note: Events can also be documented in machine-actionable form
using HED (Hierarchical Event Descriptor) tags.
This type of documentation is particularly useful for datasets likely to be used
in event-related analyses.
See [Hierarchical Event Descriptors](../appendices/hed.md)
for additional information and examples.

## Stimuli

Additional information about the stimuli can be added in the `events.tsv`
Expand Down
12 changes: 12 additions & 0 deletions src/schema/objects/columns.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,18 @@ cardiac:
description: |
continuous pulse measurement
type: number
channel:
name: channel
display_name: Channel
description: |
Channel(s) associated with an event.
If multiple channels are specified, they MUST be separated by a delimiter
VisLab marked this conversation as resolved.
Show resolved Hide resolved
specified in the `"Delimiter"` field describing the `channel` column.
For example, channels separated with a comma (`,`) require the `events.json`
file to contain `"channel": {"Delimiter": ","}`.
In the absence of a delimiter, tools MUST interpret any character as being part
of a channel name.
type: string
color:
name: color
display_name: Color label
Expand Down
7 changes: 7 additions & 0 deletions src/schema/objects/metadata.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -570,6 +570,13 @@ DelayTime:
This field is mutually exclusive with `"VolumeTiming"`.
type: number
unit: s
Delimiter:
name: Delimiter
display_name: Delimiter
description: |
If rows in a column may be interpreted as a lists of values, the character that
Copy link
Member

@VisLab VisLab Nov 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This might be better as:
"If a column entry may be interpreted as..."

Also, does the Delimiter only apply to "channel" column or to any column as the above implies.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Delimiter will from now on apply to any column.

separates one value from the next.
type: string
Density:
name: Density
display_name: Density
Expand Down
5 changes: 5 additions & 0 deletions src/schema/rules/tabular_data/task.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@ TaskEvents:
response_time: optional
HED: optional
stim_file: optional
channel:
level: optional
description_addendum: |
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't completely understand why this is in the task.yaml file. Is task.yaml where it determines if tabular data applies to a particular modality?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

task.yaml is an arbitrary name. It could have been called events.yaml, but the rule schema.rules.tabular_data.task.TaskEvents defines what are valid columns in an _events.tsv file. The filename construction (and hence what modalities apply) are defined in the filename rules:

events:
suffixes:
- events
extensions:
- .tsv
- .json
datatypes:
- beh
- eeg
- ieeg
- meg
- nirs
entities:
subject: required
session: optional
task: required
acquisition: optional
run: optional

events:
suffixes:
- events
extensions:
- .tsv
- .json
datatypes:
- beh
- eeg
- ieeg
- meg
- nirs
entities:
subject: required
session: optional
task: required
acquisition: optional
run: optional

Note that this column only applies to data types where
channels are specified, such as EEG, iEEG, MEG or NIRS.
sappelhoff marked this conversation as resolved.
Show resolved Hide resolved
additional_columns: allowed
initial_columns:
- onset
Expand Down