المحطة 2 · الدرس 3
الأحداث (events)
S001R03.set (D2) · ما طُبّق عليه قبل هذا الدرس: استيراد ملف خام: EDF و BDF و BrainVision، مواقع الأقطابتنزيل البيانات (يفتح في نافذة جديدة)سكربت الوصول لهذه الحالة
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
% Folder where you keep the course data (change it)
dataFolder = 'C:\Users\me\Documents\eeg-course';
EEG = pop_loadset('filename', 'S001R03.set', 'filepath', dataFolder);
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'S001R03', 'gui', 'off');
eeglab redraw;زر الرجوع في متصفحك يعيدك لنفس المكان الذي كنت فيه، فافتح ما تشاء بلا قلق.
الفكرة باختصار
حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير. (event) علامة في التسجيل تقول “هنا حصل شيء”: ظهر مثير، أو ضغط مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. زراً، أو بدأت مهمة. لكل حدث نوع (اسمه) وتوقيت (latency) (متى حصل).
قبل وبعد
الصورة تُضاف قريباً.
نافذة Channel data (scroll) لـ S001R03 بعد إضافة المواقع: بضع قنوات بأسمائها على اليسار، وخطوط أحداث عمودية ملوّنة وأسماؤها فوقها (T2 ثم T0 ثم T1 ثم T0)، بينها حوالي 4 ثوانٍ. زر Event types في الأسفل مُعلَّم بسهم. لقطة واجهة حقيقية من EEGLAB 2026.1 (source: eeglab-ui).
أسئلتك بعد هذا، كل جواب في قسمه:
لماذا أحتاج هذه الخطوة؟
السبب بالتفصيل، والمصطلحات التي تحتاجها
كل التحليلات اللاحقة تقريباً تعتمد على الأحداث. التقطيع يقصّ البيانات حولها، والـ ERPمتوسط استجابة الدماغ لحدث معيّن عبر محاولات كثيرة. يُحسب بالمتوسط عليها. إذا غابت الأحداث، أو جاءت بأسماء خاطئة، أو في توقيت خاطئ، فكل نتيجة بعدها خاطئة، حتى لو كانت إشارةsignalقيم تتغيّر مع الزمن، مثل الجهد المسجّل في قناة. نظيفة.
لذلك تحقّق بعد الاستيراد مباشرة من ثلاثة أشياء: هل أنواع الأحداث هي المتوقعة؟ وهل عددها صحيح؟ وهل توقيتها صحيح؟
في S001R03.edf تأتي الأحداث من تعليقات EDF+ (الـ annotations). وصفحة داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. (dataset) تعرّف ثلاثة رموز:
T0: راحة.T1وT2: بداية حركتين مختلفتين، حقيقية أو متخيَّلة. وأي حركة يعنيها كل رمز يعتمد على مهمة التسجيل. صفحة الداتاست تشرح ذلك.
لماذا أحتاج هذه الخطوة؟
كل التحليلات اللاحقة تقريباً تعتمد على الأحداث. التقطيع يقصّ البيانات حولها، والـ ERP يُحسب بالمتوسط عليها. إذا غابت الأحداث، أو جاءت بأسماء خاطئة، أو في توقيت خاطئ، فكل نتيجة بعدها خاطئة، حتى لو كانت الإشارة نظيفة.
لذلك تحقّق بعد الاستيراد مباشرة من ثلاثة أشياء: هل أنواع الأحداث هي المتوقعة؟ وهل عددها صحيح؟ وهل توقيتها صحيح؟
في S001R03.edf تأتي الأحداث من تعليقات EDF+ (الـ annotations). وصفحة الداتاست (dataset) تعرّف ثلاثة رموز:
T0: راحة.T1وT2: بداية حركتين مختلفتين، حقيقية أو متخيَّلة. وأي حركة يعنيها كل رمز يعتمد على مهمة التسجيل. صفحة الداتاست تشرح ذلك.
كيف أطبّقها في EEGLAB؟
10 خطوة من القوائم
1. شاهد الأحداث على الإشارة
- افتح
S001R03.set، وفيه الآن مواقع قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة.. - افتح Plot ثم Channel data (scroll).
- الخطوط العمودية هي الأحداث، ونوع كل حدث مكتوب فوقه. لكل نوع لونه.
- اضغط Event types في أسفل النافذة. يظهر مفتاح صغير بكل نوع ولونه.
- تنقّل بـ
>و<. الأحداث تأتي كل 4 ثوانٍ تقريباً:T1أوT2، ثمT0، ثمT1أوT2من جديد.
2. اقرأ قيم كل حدث
- افتح Edit ثم Event values.
- تعرض النافذة حدثاً واحداً في كل مرة. من حقوله
typeو latency (sec) و duration (sec). - الحدث الأول نوعه
T2، وتوقيته[4.1937]، ومدته4.1. - انتقل إلى الحدث التالي بزر
>. الحدث الثانيT0عند[8.2937]ثانية. - أغلق النافذة بزر Cancel حتى لا تغيّر شيئاً.
هذه النافذة تعرض التوقيتlatency (event)موضع الحدث في التسجيل، ويُخزَّن في EEGLAB بالعيّنات. والمدة بالثواني. أما داخل EEG.event فيُحفظان عيّنةsampleقيمة واحدة للإشارة في لحظة زمنية واحدة.. سكربتscriptملف أوامر MATLAB ينفّذ خطوات المعالجة بالترتيب. التالي يوضّح الفرق.
كيف أطبّقها في EEGLAB؟
1. شاهد الأحداث على الإشارة
- افتح
S001R03.set، وفيه الآن مواقع الأقطاب. - افتح Plot ثم Channel data (scroll).
- الخطوط العمودية هي الأحداث، ونوع كل حدث مكتوب فوقه. لكل نوع لونه.
- اضغط Event types في أسفل النافذة. يظهر مفتاح صغير بكل نوع ولونه.
- تنقّل بـ
>و<. الأحداث تأتي كل 4 ثوانٍ تقريباً:T1أوT2، ثمT0، ثمT1أوT2من جديد.
2. اقرأ قيم كل حدث
- افتح Edit ثم Event values.
- تعرض النافذة حدثاً واحداً في كل مرة. من حقوله
typeو latency (sec) و duration (sec). - الحدث الأول نوعه
T2، وتوقيته[4.1937]، ومدته4.1. - انتقل إلى الحدث التالي بزر
>. الحدث الثانيT0عند[8.2937]ثانية. - أغلق النافذة بزر Cancel حتى لا تغيّر شيئاً.
هذه النافذة تعرض التوقيت والمدة بالثواني. أما داخل EEG.event فيُحفظان بالعيّنات. السكربت التالي يوضّح الفرق.
كيف أكتبها بالكود؟
نفس الخطوات في 16 أسطر MATLAB
% Start EEGLAB and load the file from the previous lesson
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
dataFolder = 'C:\Users\me\Documents\eeg-course'; % change it
EEG = pop_loadset('filename', 'S001R03.set', 'filepath', dataFolder);
% Event types and how many of each
eeg_eventtypes(EEG) % T0 14, T1 8, T2 7
numel(EEG.event) % 29
% Type and latency of the first four events (latency in samples)
{EEG.event(1:4).type} % 'T2' 'T0' 'T1' 'T0'
[EEG.event(1:4).latency] % 672 1328 2000 2656
% The same latencies in seconds: (sample - 1) / sampling rate
([EEG.event(1:4).latency] - 1) / EEG.srate % 4.1937 8.2937 12.4938 16.5938
% Duration is also stored in samples
[EEG.event(1:2).duration] / EEG.srate % 4.1 4.2
% Scroll through the data with its events
pop_eegplot(EEG, 1, 1, 1);- لماذا نطرح 1؟ في EEGLAB أول عيّنة رقمها 1 وتقع عند الزمن صفر. بمعدل عيّنات (معدل العيّناتsampling rateعدد العيّنات المسجّلة في الثانية لكل قناة.) 160 هرتز، الثانية الواحدة 160 عيّنة.
- لماذا 4.19 لا 4.2؟ الملف يضع أول حدث عند 4.2 ثانية، والاستيراد يجعله العيّنة 4.2 × 160 = 672. ومع طرح 1 يصبح 4.19375 ثانية، وتعرضه النافذة
[4.1937]. الفرق عيّنة واحدة (حوالي 6 ميلي ثانية)، ولا يؤثر في هذا المسار. - لماذا 29 حدثاً لا 30؟ في الملف 30 تعليقاً، أولها
T0عند 0 ثانية. الاستيراد يعطيه التوقيت0، أي قبل أول عيّنة، فيحذفه EEGLAB ويطبع في الـ Command Window:eeg_checkset warning: 1/30 events had out-of-bounds latencies and were removed.
كيف أكتبها بالكود؟
% Start EEGLAB and load the file from the previous lesson
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
dataFolder = 'C:\Users\me\Documents\eeg-course'; % change it
EEG = pop_loadset('filename', 'S001R03.set', 'filepath', dataFolder);
% Event types and how many of each
eeg_eventtypes(EEG) % T0 14, T1 8, T2 7
numel(EEG.event) % 29
% Type and latency of the first four events (latency in samples)
{EEG.event(1:4).type} % 'T2' 'T0' 'T1' 'T0'
[EEG.event(1:4).latency] % 672 1328 2000 2656
% The same latencies in seconds: (sample - 1) / sampling rate
([EEG.event(1:4).latency] - 1) / EEG.srate % 4.1937 8.2937 12.4938 16.5938
% Duration is also stored in samples
[EEG.event(1:2).duration] / EEG.srate % 4.1 4.2
% Scroll through the data with its events
pop_eegplot(EEG, 1, 1, 1);- لماذا نطرح 1؟ في EEGLAB أول عيّنة رقمها 1 وتقع عند الزمن صفر. بمعدل عيّنات (sampling rate) 160 هرتز، الثانية الواحدة 160 عيّنة.
- لماذا 4.19 لا 4.2؟ الملف يضع أول حدث عند 4.2 ثانية، والاستيراد يجعله العيّنة 4.2 × 160 = 672. ومع طرح 1 يصبح 4.19375 ثانية، وتعرضه النافذة
[4.1937]. الفرق عيّنة واحدة (حوالي 6 ميلي ثانية)، ولا يؤثر في هذا المسار. - لماذا 29 حدثاً لا 30؟ في الملف 30 تعليقاً، أولها
T0عند 0 ثانية. الاستيراد يعطيه التوقيت0، أي قبل أول عيّنة، فيحذفه EEGLAB ويطبع في الـ Command Window:eeg_checkset warning: 1/30 events had out-of-bounds latencies and were removed.
أي قيمة أختار؟
القيم المناسبة حسب هدف تحليلك
لا توجد قيمة تختارها هنا. المهم أن تعرف ماذا تتوقع. هذه حقلfield (in a struct)جزء مسمّى داخل struct يحمل قيمة، مثل EEG.srate. الأحداث في هذا الملف:
| الحقل | ماذا يحفظ | وحدة الحفظ | يظهر في Edit > Event values | مثال (الحدث الأول) |
|---|---|---|---|---|
type | اسم الحدث | نص | نص | T2 |
latency | متى حصل الحدث | عيّنات | ثوانٍ | 672 (4.19 ثانية) |
duration | كم استمر الحدث | عيّنات | ثوانٍ | 656 (4.1 ثانية) |
urevent | رقم الحدث في الأصلية | رقم | لا يظهر | 1 |
وما تتوقعه في S001R03.edf:
| الفحص | المتوقع |
|---|---|
| أنواع الأحداث | T0 و T1 و T2 |
| عدد الأحداث | 29: منها 14 T0، و 8 T1، و 7 T2 (التعليق الأول عند 0 ثانية يُحذف) |
| المسافة بينها | حوالي 4.1 إلى 4.2 ثانية |
| آخر حدث | T1 عند 120.4 ثانية تقريباً، قبل نهاية التسجيل عند 125 ثانية |
إذا كانت الأحداث ناقصة أو متأخرة. في ملفات أخرى قد لا تأتي الأحداث مع الإشارة. استوردها من File ثم Import event info: من ملف نصي أو مصفوفة MATLAB، أو من قناة الـ trigger (From data channel)، أو من ملفات Presentation و E-Prime. وإذا كانت كل الأحداث متأخرة بقدر ثابت، مثل تأخر ظهور المثير على الشاشة، فحرّكها في السكربت بالقدر الذي قسته لجهازك:
EEG = pop_adjustevents(EEG, 'addms', 20); % move every event 20 ms later (use your own measured delay)القائمة المقابلة Edit ثم Adjust event latencies مخفية افتراضياً في 2026.1. لتظهر، فعّل في File ثم Preferences الخانة التي تبدأ بـ If set, show all menu items from previous EEGLAB versions. ثم أعد تشغيل EEGLAB. هذا يغيّر شكل كل القوائم عن صور الدروس، فألغِ الخانة بعد الاستعمال.
أي قيمة أختار؟
لا توجد قيمة تختارها هنا. المهم أن تعرف ماذا تتوقع. هذه حقول الأحداث في هذا الملف:
| الحقل | ماذا يحفظ | وحدة الحفظ | يظهر في Edit > Event values | مثال (الحدث الأول) |
|---|---|---|---|---|
type | اسم الحدث | نص | نص | T2 |
latency | متى حصل الحدث | عيّنات | ثوانٍ | 672 (4.19 ثانية) |
duration | كم استمر الحدث | عيّنات | ثوانٍ | 656 (4.1 ثانية) |
urevent | رقم الحدث في القائمة الأصلية | رقم | لا يظهر | 1 |
وما تتوقعه في S001R03.edf:
| الفحص | المتوقع |
|---|---|
| أنواع الأحداث | T0 و T1 و T2 |
| عدد الأحداث | 29: منها 14 T0، و 8 T1، و 7 T2 (التعليق الأول عند 0 ثانية يُحذف) |
| المسافة بينها | حوالي 4.1 إلى 4.2 ثانية |
| آخر حدث | T1 عند 120.4 ثانية تقريباً، قبل نهاية التسجيل عند 125 ثانية |
إذا كانت الأحداث ناقصة أو متأخرة. في ملفات أخرى قد لا تأتي الأحداث مع الإشارة. استوردها من File ثم Import event info: من ملف نصي أو مصفوفة MATLAB، أو من قناة الـ trigger (From data channel)، أو من ملفات Presentation و E-Prime. وإذا كانت كل الأحداث متأخرة بقدر ثابت، مثل تأخر ظهور المثير على الشاشة، فحرّكها في السكربت بالقدر الذي قسته لجهازك:
EEG = pop_adjustevents(EEG, 'addms', 20); % move every event 20 ms later (use your own measured delay)القائمة المقابلة Edit ثم Adjust event latencies مخفية افتراضياً في 2026.1. لتظهر، فعّل في File ثم Preferences الخانة التي تبدأ بـ If set, show all menu items from previous EEGLAB versions. ثم أعد تشغيل EEGLAB. هذا يغيّر شكل كل القوائم عن صور الدروس، فألغِ الخانة بعد الاستعمال.
كيف أتأكد أنها نجحت؟
4 فحوص سريعة
- سطر Events في النافذة الرئيسية يعرض
29. eeg_eventtypes(EEG)يعرضT014، وT18، وT27.- الحدث الأول في Edit ثم Event values هو
T2عند[4.1937]ثانية، والثانيT0عند[8.2937]ثانية. - نافذة التمرير تعرض خطوط أحداث كل 4 ثوانٍ تقريباً.
هذا الدرس لا يغيّر البيانات، فلا شيء تحفظه.
من المحطة القادمة نعمل على eeglab_data.set التي تأتي مع EEGLAB، لأنها صغيرة ومطابقة للتوثيق. ونفس الخطوات تنطبق على ملفك.
كيف أتأكد أنها نجحت؟
- سطر Events في النافذة الرئيسية يعرض
29. eeg_eventtypes(EEG)يعرضT014، وT18، وT27.- الحدث الأول في Edit ثم Event values هو
T2عند[4.1937]ثانية، والثانيT0عند[8.2937]ثانية. - نافذة التمرير تعرض خطوط أحداث كل 4 ثوانٍ تقريباً.
هذا الدرس لا يغيّر البيانات، فلا شيء تحفظه.
من المحطة القادمة نعمل على eeglab_data.set التي تأتي مع EEGLAB، لأنها صغيرة ومطابقة للتوثيق. ونفس الخطوات تنطبق على ملفك.
ما الأخطاء التي يقع فيها كثيرون؟
5 أخطاء، وكيف تتجنّبها
- قراءة
latencyعلى أنه ثوانٍ. فيEEG.eventهو بالعيّنات. حوّله بالمعادلة: (العيّنة − 1) ÷ معدل العيّنات. - ظهور الأنواع أرقاماً (
1و2و3) بدلT0وT1وT2. لم تُقرأ أسماء التعليقات. أعد الاستيراد مع تفعيل خانة Import EDF+ annotations (try also mexSLOAD below)، كما في درس الاستيراد. - لا أحداث أصلاً. سطر Events في النافذة الرئيسية يعرض
none. التعليقات لم تُستورد. أعد الاستيراد وتأكد من نفس الخانة. - افتراض أن
T1يعني دائماً نفس الحركة. في هذه الداتاست معناه يعتمد على مهمة التسجيل. اقرأ صفحة الداتاست لكل ملف تستخدمه. - تغيير حدث بالخطأ في Edit > Event values. أي قيمة تكتبها تغيّر الحدث. أغلق النافذة بـ Cancel إلا إذا كنت تقصد التعديل.
ما الأخطاء التي يقع فيها كثيرون؟
- قراءة
latencyعلى أنه ثوانٍ. فيEEG.eventهو بالعيّنات. حوّله بالمعادلة: (العيّنة − 1) ÷ معدل العيّنات. - ظهور الأنواع أرقاماً (
1و2و3) بدلT0وT1وT2. لم تُقرأ أسماء التعليقات. أعد الاستيراد مع تفعيل خانة Import EDF+ annotations (try also mexSLOAD below)، كما في درس الاستيراد. - لا أحداث أصلاً. سطر Events في النافذة الرئيسية يعرض
none. التعليقات لم تُستورد. أعد الاستيراد وتأكد من نفس الخانة. - افتراض أن
T1يعني دائماً نفس الحركة. في هذه الداتاست معناه يعتمد على مهمة التسجيل. اقرأ صفحة الداتاست لكل ملف تستخدمه. - تغيير حدث بالخطأ في Edit > Event values. أي قيمة تكتبها تغيّر الحدث. أغلق النافذة بـ Cancel إلا إذا كنت تقصد التعديل.
متصفحك لا يسمح بحفظ التقدّم. كل الدروس متاحة، لكن علامات الإكمال لن تُحفظ.
تم. حُفظ تقدّمك في هذا المتصفح.تراجعأين أقرأ أكثر؟
4 مراجع: التوثيق الرسمي أولاً
- EEGLAB Tutorialتوثيقb. Events: Plotting events; Recognized event fields
- EEGLAB Tutorialتوثيقb. Event Processing
- EEGLAB preprocessing #2: Events and channel locationsفيديوالفيديو كاملاً · 11:40
- EEG Motor Movement/Imagery Dataset (PhysioNet)Experimental Protocol
مكتوب لـ EEGLAB 2026.1 · 2026-10-28
للتوسّع
- EEGLAB Tutorial: https://eeglab.org/tutorials/04_Import/Importing_Event_Epoch_Info.html (b. Events: Plotting events; Recognized event fields)
- EEGLAB Tutorial: https://eeglab.org/tutorials/11_Scripting/Event_Processing_command_line.html (b. Event Processing)
- EEGLAB preprocessing #2: Events and channel locations: https://www.youtube.com/watch?v=2CPmmPG5Beo (الفيديو كاملاً)
- EEG Motor Movement/Imagery Dataset (PhysioNet): https://physionet.org/content/eegmmidb/1.0.0/ (Experimental Protocol)
تحتاج مساعدة؟
اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ
- بلّغ عن خطأ علمي · يحتاج حساباً على GitHub. لا تملك حساباً؟ استخدم "شاركنا رأيك".