Skip to content

Commit 9d01d99

Browse files
authored
Merge pull request #5 from TaskBeacon/codex/update-documentation-and-examples-for-trigger-dictionary
Update trigger docs
2 parents 8c8143c + 941a98f commit 9d01d99

File tree

4 files changed

+26
-49
lines changed

4 files changed

+26
-49
lines changed

docs/api/psyflow.rst

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,6 @@ psyflow.StimUnit module
4444
:undoc-members:
4545
:show-inheritance:
4646

47-
psyflow.TriggerBank module
48-
--------------------------
49-
50-
.. automodule:: psyflow.TriggerBank
51-
:members:
52-
:undoc-members:
53-
:show-inheritance:
54-
5547
psyflow.TriggerSender module
5648
----------------------------
5749

docs/modules.rst

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ API Reference
99
psyflow/StimUnit
1010
psyflow/StimBank
1111
psyflow/SubInfo
12-
psyflow/TriggerBank
1312
psyflow/TriggerSender
1413
psyflow/TaskSettings
1514
psyflow/utils

docs/tutorials/getting_started.md

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ A typical psyflow experiment has these core steps:
2929
1. **Configure** experiment settings (`TaskSettings`)
3030
2. **Collect** participant info (`SubInfo`)
3131
3. **Build** stimuli (`StimBank`)
32-
4. **Define** triggers (`TriggerBank` + `TriggerSender`)
32+
4. **Define** triggers (a dictionary of codes + `TriggerSender`)
3333
5. **Create** a trial (`StimUnit`)
3434
6. **Run** the trial and collect data
3535

@@ -94,10 +94,12 @@ Retrieve with:
9494

9595
### 6. Set Up Triggers
9696

97-
from psyflow import TriggerBank, TriggerSender
97+
import yaml
98+
from psyflow import TriggerSender
99+
100+
with open("triggers.yaml") as f:
101+
triggers = yaml.safe_load(f)
98102

99-
tb = TriggerBank()
100-
tb.add_from_yaml("triggers.yaml") # or .add_from_dict(...)
101103
sender = TriggerSender(lambda code: port.write(bytes([code])))
102104

103105

@@ -109,13 +111,13 @@ Retrieve with:
109111
trial = StimUnit("T1", win, kb, triggersender=sender)
110112
trial \
111113
.add_stim(fix, tgt) \
112-
.on_start(lambda u: u.send_trigger(tb.get("fix_onset"))) \
114+
.on_start(lambda u: u.send_trigger(triggers["fix_onset"])) \
113115
.capture_response(
114116
keys=["left","right"],
115117
duration=1.0,
116-
onset_trigger=tb.get("fix_onset"),
117-
response_trigger={"left":tb.get("resp_L"), "right":tb.get("resp_R")},
118-
timeout_trigger=tb.get("timeout"),
118+
onset_trigger=triggers["fix_onset"],
119+
response_trigger={"left":triggers["resp_L"], "right":triggers["resp_R"]},
120+
timeout_trigger=triggers["timeout"],
119121
correct_keys=["left"],
120122
highlight_stim={"left": highlight_left, "right": highlight_right}
121123
) \

docs/tutorials/send_trigger.md

Lines changed: 16 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,9 @@
1-
# ⏱ Trigger System for EEG/MEG: `TriggerBank` + `TriggerSender`
1+
# ⏱ Trigger System for EEG/MEG: Trigger Dictionary + `TriggerSender`
22

3-
This system separates **trigger definition** (`TriggerBank`) from **trigger sending** (`TriggerSender`), allowing you to maintain clean logic, central config, and robust signal dispatch for EEG/MEG experiments.
3+
Store your event codes in a plain dictionary and let `TriggerSender` handle the dispatch. This keeps your configuration centralized and your send logic simple.
44

55
### 🧵 Summary of Key Methods
66

7-
#### `TriggerBank`
8-
9-
| Purpose | Method |
10-
|--|--|
11-
| Add one event-code | `.add(event, code)` |
12-
| Add from dict | `.add_from_dict(dict)` |
13-
| Add from YAML file | `.add_from_yaml(path)` |
14-
| Retrieve code | `.get(event)` |
15-
167
#### `TriggerSender`
178

189
| Purpose | Method |
@@ -23,40 +14,34 @@ This system separates **trigger definition** (`TriggerBank`) from **trigger send
2314
| Control post-delay | `post_delay=0.001` |
2415

2516

26-
### 🗂 1. Defining Triggers with `TriggerBank`
17+
### 🗂 1. Prepare a Trigger Dictionary
2718

28-
TriggerBank maps event labels (e.g., "cue_onset", "response") to integer codes.
19+
Store event labels (e.g., "cue_onset", "response") as keys in a dictionary with integer codes as values.
2920

3021
#### A. Define manually
3122

32-
from your_package import TriggerBank
33-
34-
tb = TriggerBank()
35-
tb.add("cue_onset", 32)
36-
tb.add("key_press", 33)
37-
38-
#### B. Load from a dictionary
39-
40-
tb.add_from_dict({
23+
triggers = {
4124
"cue_onset": 32,
42-
"key_press": [33] # also accepts single-item list (YAML-safe)
43-
})
25+
"key_press": 33,
26+
}
4427

45-
#### C. Load from YAML
28+
#### B. Load from YAML
4629

4730
YAML format:
4831

4932
triggers:
5033
cue_onset: 32
51-
key_press: [33]
34+
key_press: 33
5235

5336
Code:
5437

55-
tb.add_from_yaml("trigger_config.yaml")
38+
import yaml
39+
with open("trigger_config.yaml") as f:
40+
triggers = yaml.safe_load(f)["triggers"]
5641

57-
#### D. Get a code
42+
#### C. Get a code
5843

59-
code = tb.get("key_press") # returns 33 or None
44+
code = triggers["key_press"] # returns 33
6045

6146

6247

@@ -77,7 +62,7 @@ TriggerSender handles the dispatch logic. It wraps your actual send function (e.
7762

7863
#### C. Sending a trigger
7964

80-
sender.send(tb.get("cue_onset"))
65+
sender.send(triggers["cue_onset"])
8166

8267
This prints:
8368

@@ -104,7 +89,6 @@ Here we used mock mode for testing and a serial port for real device communicati
10489
trigger_config = {
10590
**config.get('triggers', {})
10691
}
107-
triggerbank = TriggerBank(trigger_config)
10892
ser = serial.serial_for_url("loop://", baudrate=115200, timeout=1)
10993
triggersender = TriggerSender(
11094
trigger_func=lambda code: ser.write([1, 225, 1, 0, (code)]),
@@ -114,4 +98,4 @@ triggersender = TriggerSender(
11498
)
11599
```
116100

117-
Using `TriggerBank` and `TriggerSender` gives you a clean separation of config and logic, making your experiment easier to debug, replicate, and maintain.
101+
Using a trigger dictionary with `TriggerSender` keeps configuration and logic separated, making your experiment easier to debug, replicate, and maintain.

0 commit comments

Comments
 (0)