المحطة 9 · الدرس 5
تنظيم الملفات والتخزين
sub-002_task-FaceRecognition_eeg.set (D4) · لا شيء: البيانات كما نزّلتها.تنزيل البيانات (يفتح في نافذة جديدة)سكربت الوصول لهذه الحالة
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
% Run from inside faces_project, where ds002718 sits in rawdata
bidsRoot = fullfile(pwd, 'rawdata');
EEG = pop_loadset('sub-002_task-FaceRecognition_eeg.set', fullfile(bidsRoot, 'sub-002', 'eeg'));
% Show the dataset in the main EEGLAB window
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'sub-002 raw', 'gui', 'off');
eeglab redraw;زر الرجوع في متصفحك يعيدك لنفس المكان الذي كنت فيه، فافتح ما تشاء بلا قلق.
الفكرة باختصار
مع مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة. واحد، كل شيء في مجلد واحد يكفي. مع عشرين مشاركاً وخمس مراحل معالجة، يصبح عندك مئة ملف أو أكثر. بعد شهرين لن تتذكر أي ملف نظّفته، ولا بأي إعدادات، ولا أي نسخة استخدمتها في الرسم.
قبل وبعد
أسئلتك بعد هذا، كل جواب في قسمه:
لماذا أحتاج هذه الخطوة؟
السبب بالتفصيل، والمصطلحات التي تحتاجها
والتخزين يكبر أسرع مما تتوقع. كل نسخة مستمرة تحفظها من مشارك تأخذ تقريباً نفس حجم ملفه الخام. في D4 الملف الخام لكل مشارك حوالي 234 ميجابايت، وفيها 18 مشاركاً، أي حوالي 4.2 جيجابايت للبيانات الخام وحدها. إذا حفظت خمس مراحل لكل مشارك، تصل إلى حوالي 21 جيجابايت قبل أي epochمقطع زمني قصير مقتطع حول حدث. أو رسم.
هذا الدرس يعطيك ثلاث قواعد قبل أن تبدأ أي مشروع: هيكل مجلدات ثابت، وأسماء ملفات ثابتة، وحساب للتخزين وقرار مسبق بما تحفظه.
لماذا أحتاج هذه الخطوة؟
والتخزين يكبر أسرع مما تتوقع. كل نسخة مستمرة تحفظها من مشارك تأخذ تقريباً نفس حجم ملفه الخام. في D4 الملف الخام لكل مشارك حوالي 234 ميجابايت، وفيها 18 مشاركاً، أي حوالي 4.2 جيجابايت للبيانات الخام وحدها. إذا حفظت خمس مراحل لكل مشارك، تصل إلى حوالي 21 جيجابايت قبل أي epoch أو رسم.
هذا الدرس يعطيك ثلاث قواعد قبل أن تبدأ أي مشروع: هيكل مجلدات ثابت، وأسماء ملفات ثابتة، وحساب للتخزين وقرار مسبق بما تحفظه.
كيف أطبّقها في EEGLAB؟
8 خطوة من القوائم
أولاً: الهيكل
- أنشئ مجلداً للمشروع، وفيه خمسة مجلدات فقط:
rawdata: البيانات الخام كما نزّلتها. لا تكتب فيه شيئاً أبداً.derivatives/eeglab: كل ما تنتجه المعالجة، بمجلد لكل مشارك.code: سكربتscriptملف أوامر MATLAB ينفّذ خطوات المعالجة بالترتيب.. هي التي تعيد إنتاج كل شيء آخر.figures: الرسوم النهائية.logs: ملفات الأخطاء التي يكتبها سكربت الدفعات من الدرس السابق.
هذا نفس منطق BIDSمعيار موحّد لتسمية ملفات البيانات العصبية وتنظيمها في مجلدات.: البيانات الخام في مكان، والمشتقات (derivatives) في مكان آخر، بنفس أسماء المشاركين.
ثانياً: الأسماء
- سمِّ كل ملف من نفس الأجزاء وبنفس الترتيب: المشارك، ثم المهمة، ثم وصف المرحلة، ثم النوع. مثال:
sub-002_task-FaceRecognition_desc-clean_eeg.set. الجزءdesc-يقول أي مرحلة هذه، والباقي منسوخ من الملف الخام. - اجعل اسم داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. داخل EEGLAB يقول نفس الشيء. عند الحفظ من File ثم Save current dataset as اكتب الاسم الكامل، وغيّر Dataset name من Edit ثم Dataset info عند الحاجة.
ثالثاً: التخزين
- افتح مجلد
rawdataفي مستكشف الملفات، وانظر حجم ملف.setلمشارك واحد. اضربه في عدد المشاركين، ثم في عدد المراحل المستمرة التي تنوي حفظها. - قرّر ماذا تحفظ قبل أن تشغّل. قاعدة عملية:
- احفظ ما هو بطيء أو يعتمد على حكمك: أوزان ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت.، قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. السيئة، وأرقام المكوّنات التي حذفتها.
- أعد حسابه ما هو سريع وآلي: فلترfilterأداة تُضعف ترددات معيّنة في الإشارة وتُبقي غيرها.، المرجعreferenceالنقطة التي يُقاس جهد كل قناة بالنسبة لها.، والتقطيع، والخط القاعدي.
- احفظ دائماً النسخة النهائية التي تدخل الإحصاء.
رابعاً: حوّل بياناتك إلى BIDS
- إذا كانت بياناتك الخام ليست بصيغة BIDS، pluginحزمة تضيف وظائف أو قوائم جديدة إلى EEGLAB. EEG-BIDS المرفقة مع EEGLAB تحوّلها. افتح File ثم BIDS tools ثم BIDS export wizard (from raw EEG to BIDS)، واتبع الخطوات: الملفات، ثم المهمة، ثم المشاركين، ثم حدثeventعلامة في التسجيل تحدد لحظة شيء مهم، مثل ظهور مثير..
- إذا كانت عندك STUDY جاهزة، فاستخدم File ثم BIDS tools ثم Export STUDY to BIDS folder.
- افحص الناتج بـ File ثم BIDS tools ثم Validate BIDS dataset. يفتح صفحة الفاحص الرسمي في المتصفح.
D4 نفسها مثال على BIDS جاهز: افتح مجلدها وانظر dataset_description.json و README و task-FaceRecognition_events.json ومجلدات sub-002 وما بعدها.
لمشاركة ملف واحد مع شخص يستخدم برنامجاً آخر، يكتبه File ثم Export ثم Data to EDF/BDF/GDF file بصيغة قياسية تقرؤها أغلب برامج EEG (يحتاج إضافة Biosig من درس التثبيت). استخدمه للمشاركة فقط، وأبقِ داخل مشروعك ملفات .set ومجلد BIDS.
كيف أطبّقها في EEGLAB؟
أولاً: الهيكل
- أنشئ مجلداً للمشروع، وفيه خمسة مجلدات فقط:
rawdata: البيانات الخام كما نزّلتها. لا تكتب فيه شيئاً أبداً.derivatives/eeglab: كل ما تنتجه المعالجة، بمجلد لكل مشارك.code: السكربتات. هي التي تعيد إنتاج كل شيء آخر.figures: الرسوم النهائية.logs: ملفات الأخطاء التي يكتبها سكربت الدفعات من الدرس السابق.
هذا نفس منطق BIDS: البيانات الخام في مكان، والمشتقات (derivatives) في مكان آخر، بنفس أسماء المشاركين.
ثانياً: الأسماء
- سمِّ كل ملف من نفس الأجزاء وبنفس الترتيب: المشارك، ثم المهمة، ثم وصف المرحلة، ثم النوع. مثال:
sub-002_task-FaceRecognition_desc-clean_eeg.set. الجزءdesc-يقول أي مرحلة هذه، والباقي منسوخ من الملف الخام. - اجعل اسم الداتاست داخل EEGLAB يقول نفس الشيء. عند الحفظ من File ثم Save current dataset as اكتب الاسم الكامل، وغيّر Dataset name من Edit ثم Dataset info عند الحاجة.
ثالثاً: التخزين
- افتح مجلد
rawdataفي مستكشف الملفات، وانظر حجم ملف.setلمشارك واحد. اضربه في عدد المشاركين، ثم في عدد المراحل المستمرة التي تنوي حفظها. - قرّر ماذا تحفظ قبل أن تشغّل. قاعدة عملية:
- احفظ ما هو بطيء أو يعتمد على حكمك: أوزان ICA، وقائمة القنوات السيئة، وأرقام المكوّنات التي حذفتها.
- أعد حسابه ما هو سريع وآلي: الفلاتر، والمرجع، والتقطيع، والخط القاعدي.
- احفظ دائماً النسخة النهائية التي تدخل الإحصاء.
رابعاً: حوّل بياناتك إلى BIDS
- إذا كانت بياناتك الخام ليست بصيغة BIDS، فإضافة EEG-BIDS المرفقة مع EEGLAB تحوّلها. افتح File ثم BIDS tools ثم BIDS export wizard (from raw EEG to BIDS)، واتبع الخطوات: الملفات، ثم المهمة، ثم المشاركين، ثم الأحداث.
- إذا كانت عندك STUDY جاهزة، فاستخدم File ثم BIDS tools ثم Export STUDY to BIDS folder.
- افحص الناتج بـ File ثم BIDS tools ثم Validate BIDS dataset. يفتح صفحة الفاحص الرسمي في المتصفح.
D4 نفسها مثال على BIDS جاهز: افتح مجلدها وانظر dataset_description.json و README و task-FaceRecognition_events.json ومجلدات sub-002 وما بعدها.
لمشاركة ملف واحد مع شخص يستخدم برنامجاً آخر، يكتبه File ثم Export ثم Data to EDF/BDF/GDF file بصيغة قياسية تقرؤها أغلب برامج EEG (يحتاج إضافة Biosig من درس التثبيت). استخدمه للمشاركة فقط، وأبقِ داخل مشروعك ملفات .set ومجلد BIDS.
كيف أكتبها بالكود؟
نفس الخطوات في 36 أسطر MATLAB
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
eeglabRoot = fileparts(which('eeglab'));
% Project layout: raw data stay untouched, results go to derivatives
projectRoot = pwd; % run from inside faces_project
bidsRoot = fullfile(projectRoot, 'rawdata'); % ds002718 lives here
derivRoot = fullfile(projectRoot, 'derivatives', 'eeglab');
folders = {bidsRoot, derivRoot, fullfile(projectRoot, 'code'), ...
fullfile(projectRoot, 'figures'), fullfile(projectRoot, 'logs')};
for k = 1:numel(folders)
if ~exist(folders{k}, 'dir'), mkdir(folders{k}); end
end
% Storage estimate from the raw files on disk
rawFiles = dir(fullfile(bidsRoot, 'sub-*', 'eeg', '*_eeg.set'));
rawGB = sum([rawFiles.bytes]) / 1e9;
nSubjects = numel(rawFiles);
fprintf('%d subject(s) on disk, %.2f GB of raw data\n', nSubjects, rawGB);
% Each continuous stage you save costs about one raw copy per subject
nSavedStages = 2; % clean continuous + epochs
fprintf('Derivatives for these subjects: up to about %.1f GB\n', rawGB * nSavedStages);
fprintf('Full dataset (18 subjects): about %.1f GB raw\n', 18 * rawGB / max(nSubjects, 1));
% BIDS-style derivative name for one subject and one stage
subj = 'sub-002';
stage = 'clean';
outDir = fullfile(derivRoot, subj, 'eeg');
if ~exist(outDir, 'dir'), mkdir(outDir); end
outName = sprintf('%s_task-FaceRecognition_desc-%s_eeg.set', subj, stage);
fprintf('Save stage "%s" as %s\n', stage, fullfile(outDir, outName));
% Small files are cheap: keep ICA weights apart from the data
% icaInfo = struct('icaweights', EEG.icaweights, 'icasphere', EEG.icasphere, ...
% 'icachansind', EEG.icachansind);
% save(fullfile(outDir, sprintf('%s_task-FaceRecognition_desc-ica.mat', subj)), '-struct', 'icaInfo');
% Convert a non-BIDS dataset (here D1) to BIDS with EEG-BIDS
data = struct('file', {fullfile(eeglabRoot, 'sample_data', 'eeglab_data.set')});
% Practice export only: delete d1_bids when you are done
bids_export(data, 'targetdir', fullfile(projectRoot, 'd1_bids'), ...
'tInfo', struct('TaskName', 'attention', 'PowerLineFrequency', 60));كيف أكتبها بالكود؟
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
eeglabRoot = fileparts(which('eeglab'));
% Project layout: raw data stay untouched, results go to derivatives
projectRoot = pwd; % run from inside faces_project
bidsRoot = fullfile(projectRoot, 'rawdata'); % ds002718 lives here
derivRoot = fullfile(projectRoot, 'derivatives', 'eeglab');
folders = {bidsRoot, derivRoot, fullfile(projectRoot, 'code'), ...
fullfile(projectRoot, 'figures'), fullfile(projectRoot, 'logs')};
for k = 1:numel(folders)
if ~exist(folders{k}, 'dir'), mkdir(folders{k}); end
end
% Storage estimate from the raw files on disk
rawFiles = dir(fullfile(bidsRoot, 'sub-*', 'eeg', '*_eeg.set'));
rawGB = sum([rawFiles.bytes]) / 1e9;
nSubjects = numel(rawFiles);
fprintf('%d subject(s) on disk, %.2f GB of raw data\n', nSubjects, rawGB);
% Each continuous stage you save costs about one raw copy per subject
nSavedStages = 2; % clean continuous + epochs
fprintf('Derivatives for these subjects: up to about %.1f GB\n', rawGB * nSavedStages);
fprintf('Full dataset (18 subjects): about %.1f GB raw\n', 18 * rawGB / max(nSubjects, 1));
% BIDS-style derivative name for one subject and one stage
subj = 'sub-002';
stage = 'clean';
outDir = fullfile(derivRoot, subj, 'eeg');
if ~exist(outDir, 'dir'), mkdir(outDir); end
outName = sprintf('%s_task-FaceRecognition_desc-%s_eeg.set', subj, stage);
fprintf('Save stage "%s" as %s\n', stage, fullfile(outDir, outName));
% Small files are cheap: keep ICA weights apart from the data
% icaInfo = struct('icaweights', EEG.icaweights, 'icasphere', EEG.icasphere, ...
% 'icachansind', EEG.icachansind);
% save(fullfile(outDir, sprintf('%s_task-FaceRecognition_desc-ica.mat', subj)), '-struct', 'icaInfo');
% Convert a non-BIDS dataset (here D1) to BIDS with EEG-BIDS
data = struct('file', {fullfile(eeglabRoot, 'sample_data', 'eeglab_data.set')});
% Practice export only: delete d1_bids when you are done
bids_export(data, 'targetdir', fullfile(projectRoot, 'd1_bids'), ...
'tInfo', struct('TaskName', 'attention', 'PowerLineFrequency', 60));أي قيمة أختار؟
القيم المناسبة حسب هدف تحليلك
| القرار | الاختيار في الدرس | لماذا |
|---|---|---|
| مكان البيانات الخام | rawdata، للقراءة فقط | إذا خرّبت ملفاً خاماً بالخطأ لا يمكن إصلاحه. كل ما بعده يُعاد من السكربت. |
| مكان النتائج | derivatives/eeglab/sub-XXX/eeg | نفس منطق مواصفات BIDS للمشتقات، فيفهمه أي باحث، وتقرؤه أدوات BIDS. |
| عدد المراحل المحفوظة | اثنتان: النسخة النظيفة المستمرة، ثم الـ epochs | تكفي لإعادة أي تحليل لاحق بدون تشغيل ICA من جديد. |
| ما يُحفظ منفصلاً | أوزان ICA، والقنوات السيئة، والمكوّنات المحذوفة | صغيرة جداً، وهي نتيجة ساعات حساب أو قرارات بعينك. |
| ملف أو ملفان لكل داتاست | ملفان، .set و .fdt (افتراضي EEGLAB 2026.1) | تُحمَّل البيانات أسرع في الـ STUDY. انسخ الملفين أو انقلهما معاً دائماً. خيار الملف .set الواحد في File ثم Preferences. |
| صيغة الأرقام | single (افتراضي EEGLAB) | double يضاعف الحجم بلا فائدة لبيانات EEG. |
أي قيمة أختار؟
| القرار | الاختيار في الدرس | لماذا |
|---|---|---|
| مكان البيانات الخام | rawdata، للقراءة فقط | إذا خرّبت ملفاً خاماً بالخطأ لا يمكن إصلاحه. كل ما بعده يُعاد من السكربت. |
| مكان النتائج | derivatives/eeglab/sub-XXX/eeg | نفس منطق مواصفات BIDS للمشتقات، فيفهمه أي باحث، وتقرؤه أدوات BIDS. |
| عدد المراحل المحفوظة | اثنتان: النسخة النظيفة المستمرة، ثم الـ epochs | تكفي لإعادة أي تحليل لاحق بدون تشغيل ICA من جديد. |
| ما يُحفظ منفصلاً | أوزان ICA، والقنوات السيئة، والمكوّنات المحذوفة | صغيرة جداً، وهي نتيجة ساعات حساب أو قرارات بعينك. |
| ملف أو ملفان لكل داتاست | ملفان، .set و .fdt (افتراضي EEGLAB 2026.1) | تُحمَّل البيانات أسرع في الـ STUDY. انسخ الملفين أو انقلهما معاً دائماً. خيار الملف .set الواحد في File ثم Preferences. |
| صيغة الأرقام | single (افتراضي EEGLAB) | double يضاعف الحجم بلا فائدة لبيانات EEG. |
كيف أتأكد أنها نجحت؟
4 فحوص سريعة
- مجلد المشروع فيه الخمسة مجلدات، ولم يتغيّر أي ملف في
rawdataمنذ نزّلته. - السكربت يطبع عدد المشاركين وحجم بياناتهم الخام والتقدير الكلي.
- كل ملف في
derivativesاسمه يبدأ بـsub-ويحتويdesc-باسم مرحلته. - المجلد
d1_bidsفيهdataset_description.jsonومجلدsub-001.
كيف أتأكد أنها نجحت؟
- مجلد المشروع فيه الخمسة مجلدات، ولم يتغيّر أي ملف في
rawdataمنذ نزّلته. - السكربت يطبع عدد المشاركين وحجم بياناتهم الخام والتقدير الكلي.
- كل ملف في
derivativesاسمه يبدأ بـsub-ويحتويdesc-باسم مرحلته. - المجلد
d1_bidsفيهdataset_description.jsonومجلدsub-001.
ما الأخطاء التي يقع فيها كثيرون؟
4 أخطاء، وكيف تتجنّبها
- الحفظ فوق الملف الخام. File ثم Resave current dataset(s) يكتب فوق الملف المفتوح. استخدم دائماً File ثم Save current dataset as مع اسم المرحلة.
- حفظ كل مرحلة “احتياطاً”. خمس مراحل في 18 مشاركاً تعني أكثر من 20 جيجابايت من D4 وحدها، وأغلبها يُعاد حسابه في دقائق.
- أسماء مثل
final2_new_REAL.set. بعد شهر لا أحد يعرف الفرق. اسم المرحلة فيdesc-يكفي، والإعدادات مكانها السكربت فيcode. - فصل السكربت عن النتائج. نتيجة بلا السكربت الذي أنتجها لا يمكن إعادتها. احفظ السكربت مع كل تشغيل، أو استخدم نظام نسخ مثل git لمجلد
code.
ما الأخطاء التي يقع فيها كثيرون؟
- الحفظ فوق الملف الخام. File ثم Resave current dataset(s) يكتب فوق الملف المفتوح. استخدم دائماً File ثم Save current dataset as مع اسم المرحلة.
- حفظ كل مرحلة “احتياطاً”. خمس مراحل في 18 مشاركاً تعني أكثر من 20 جيجابايت من D4 وحدها، وأغلبها يُعاد حسابه في دقائق.
- أسماء مثل
final2_new_REAL.set. بعد شهر لا أحد يعرف الفرق. اسم المرحلة فيdesc-يكفي، والإعدادات مكانها السكربت فيcode. - فصل السكربت عن النتائج. نتيجة بلا السكربت الذي أنتجها لا يمكن إعادتها. احفظ السكربت مع كل تشغيل، أو استخدم نظام نسخ مثل git لمجلد
code.
متصفحك لا يسمح بحفظ التقدّم. كل الدروس متاحة، لكن علامات الإكمال لن تُحفظ.
تم. حُفظ تقدّمك في هذا المتصفح.تراجعأين أقرأ أكثر؟
4 مراجع: التوثيق الرسمي أولاً
- EEGLAB Tutorialتوثيق4. Import data > d. BIDS
- EEG-BIDS (GitHub)bids_export.m, bids_export_example.m
- BIDS specificationDerivatives
- From raw EEG to BIDS in 2 minutesفيديوالفيديو كاملاً · 22:58
مكتوب لـ EEGLAB 2026.1 · 2026-10-28
للتوسّع
- EEGLAB Tutorial: https://eeglab.org/tutorials/04_Import/BIDS.html (4. Import data > d. BIDS)
- EEG-BIDS (GitHub): https://github.com/sccn/EEG-BIDS (bids_export.m, bids_export_example.m)
- BIDS specification: https://bids-specification.readthedocs.io/ (Derivatives)
- From raw EEG to BIDS in 2 minutes: https://www.youtube.com/watch?v=LIiRj8-BVk4 (الفيديو كاملاً)
تحتاج مساعدة؟
اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ
- بلّغ عن خطأ علمي · يحتاج حساباً على GitHub. لا تملك حساباً؟ استخدم "شاركنا رأيك".