المحطة 2 · الدرس 3

الأحداث (events)

أساسي12 دقيقةقبل هذا الدرس: استيراد ملف خام: EDF و BDF و BrainVisionاطبع البطاقة
تبدأ من: S001R03.set (D2) · ما طُبّق عليه قبل هذا الدرس: استيراد ملف خام: EDF و BDF و BrainVision، مواقع الأقطابتنزيل البيانات (يفتح في نافذة جديدة)
سكربت الوصول لهذه الحالة
MATLAB
[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: بداية حركتين مختلفتين، حقيقية أو متخيَّلة. وأي حركة يعنيها كل رمز يعتمد على مهمة التسجيل. صفحة الداتاست تشرح ذلك.

كيف أطبّقها في EEGLAB؟

10 خطوة من القوائم

1. شاهد الأحداث على الإشارة

  1. افتح S001R03.set، وفيه الآن مواقع قطبelectrodeالقطعة المعدنية التي توضع على الرأس لالتقاط الإشارة..
  2. افتح Plot ثم Channel data (scroll).
  3. الخطوط العمودية هي الأحداث، ونوع كل حدث مكتوب فوقه. لكل نوع لونه.
  4. اضغط Event types في أسفل النافذة. يظهر مفتاح صغير بكل نوع ولونه.
  5. تنقّل بـ > و <. الأحداث تأتي كل 4 ثوانٍ تقريباً: T1 أو T2، ثم T0، ثم T1 أو T2 من جديد.

2. اقرأ قيم كل حدث

  1. افتح Edit ثم Event values.
  2. تعرض النافذة حدثاً واحداً في كل مرة. من حقوله type و latency (sec) و duration (sec).
  3. الحدث الأول نوعه T2، وتوقيته [4.1937]، ومدته 4.1.
  4. انتقل إلى الحدث التالي بزر >. الحدث الثاني T0 عند [8.2937] ثانية.
  5. أغلق النافذة بزر Cancel حتى لا تغيّر شيئاً.

هذه النافذة تعرض التوقيتlatency (event)موضع الحدث في التسجيل، ويُخزَّن في EEGLAB بالعيّنات. والمدة بالثواني. أما داخل EEG.event فيُحفظان عيّنةsampleقيمة واحدة للإشارة في لحظة زمنية واحدة.. سكربتscriptملف أوامر MATLAB ينفّذ خطوات المعالجة بالترتيب. التالي يوضّح الفرق.

كيف أكتبها بالكود؟

نفس الخطوات في 16 أسطر MATLAB
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.

أي قيمة أختار؟

القيم المناسبة حسب هدف تحليلك

لا توجد قيمة تختارها هنا. المهم أن تعرف ماذا تتوقع. هذه حقلfield (in a struct)جزء مسمّى داخل struct يحمل قيمة، مثل EEG.srate. الأحداث في هذا الملف:

الحقلماذا يحفظوحدة الحفظيظهر في Edit > Event valuesمثال (الحدث الأول)
typeاسم الحدثنصنصT2
latencyمتى حصل الحدثعيّناتثوانٍ672 (4.19 ثانية)
durationكم استمر الحدثعيّناتثوانٍ656 (4.1 ثانية)
ureventرقم الحدث في قائمةmenuمجموعة أوامر تظهر عند الضغط على اسمها في أعلى النافذة. الأصليةرقملا يظهر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. وإذا كانت كل الأحداث متأخرة بقدر ثابت، مثل تأخر ظهور المثير على الشاشة، فحرّكها في السكربت بالقدر الذي قسته لجهازك:

MATLAB
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 فحوص سريعة
  1. سطر Events في النافذة الرئيسية يعرض 29.
  2. eeg_eventtypes(EEG) يعرض T0 14، و T1 8، و T2 7.
  3. الحدث الأول في Edit ثم Event values هو T2 عند [4.1937] ثانية، والثاني T0 عند [8.2937] ثانية.
  4. نافذة التمرير تعرض خطوط أحداث كل 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 إلا إذا كنت تقصد التعديل.

أين أقرأ أكثر؟

4 مراجع: التوثيق الرسمي أولاً

مكتوب لـ EEGLAB 2026.1 · 2026-10-28

تحتاج مساعدة؟

اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ