المحطة 10 · الدرس 1
تحليل المصدر DIPFIT
eeglab_data.set (D1) · ما طُبّق عليه قبل هذا الدرس: فلترة high-pass و low-pass، إزالة ضوضاء الكهرباء (50 أو 60 هرتز)، القنوات السيئة، الاستيفاء (interpolation)، إعادة المرجع (re-referencing)، تشغيل ICA، فلتر 1 هرتز قبل ICA ونسخ الأوزانتنزيل البيانات (يفتح في نافذة جديدة)سكربت الوصول لهذه الحالة
[ALLEEG, EEG, CURRENTSET, ALLCOM] = eeglab;
eeglabRoot = fileparts(which('eeglab'));
EEG = pop_loadset('eeglab_data.set', fullfile(eeglabRoot, 'sample_data'));
fullLocs = EEG.chanlocs;
% Main dataset: high-pass at 0.1 Hz, then 60 Hz line-noise removal
EEG = pop_eegfiltnew(EEG, 'locutoff', 0.1);
EEG = pop_eegfiltnew(EEG, 'locutoff', 58, 'hicutoff', 62, 'revfilt', 1);
% Bad channels you removed earlier, e.g. {'T7'}; leave empty if none
badChans = {};
if ~isempty(badChans)
EEG = pop_select(EEG, 'rmchannel', badChans);
EEG = pop_interp(EEG, fullLocs, 'spherical');
end
% Average reference, EOG channels excluded
eogIdx = find(ismember({EEG.chanlocs.labels}, {'EOG1', 'EOG2'}));
EEG = pop_reref(EEG, [], 'exclude', eogIdx);
EEG.setname = 'D1 main';
% ICA on a 1-Hz copy, then copy the weights back
EEG_ica = pop_eegfiltnew(EEG, 'locutoff', 1);
EEG_ica = pop_runica(EEG_ica, 'icatype', 'runica', 'extended', 1);
EEG.icaweights = EEG_ica.icaweights;
EEG.icasphere = EEG_ica.icasphere;
EEG.icachansind = EEG_ica.icachansind;
EEG.icawinv = [];
EEG.icaact = [];
EEG = eeg_checkset(EEG);
% Show the dataset in the main EEGLAB window
EEG.filename = ''; EEG.filepath = ''; EEG.datfile = ''; EEG.saved = 'no';
[ALLEEG, EEG, CURRENTSET] = pop_newset(ALLEEG, EEG, 0, 'setname', 'D1 main', 'gui', 'off');
eeglab redraw;زر الرجوع في متصفحك يعيدك لنفس المكان الذي كنت فيه، فافتح ما تشاء بلا قلق.
الفكرة باختصار
كل مكوّن ICAطريقة تفصل الإشارة المسجّلة إلى مصادر مستقلة، بعضها دماغي وبعضها آرتفاكت. له خريطة رأس ثابتة. السؤال الطبيعي بعدها: من أين في الدماغ يمكن أن تأتي هذه الخريطة؟
pluginحزمة تضيف وظائف أو قوائم جديدة إلى EEGLAB. DIPFIT تجيب بنموذج بسيط: مصدر واحد صغير داخل الرأس، اسمه ثنائي القطبdipoleنموذج لمصدر كهربائي صغير داخل الدماغ له موضع واتجاه. (dipole)، يشبه بطارية صغيرة لها موضع واتجاه. تبحث DIPFIT عن الموضع الذي ينتج خريطة أقرب ما يمكن لخريطة المكوّن.
قبل وبعد

ماذا يعني ما رأيته؟

ماذا يعني ما رأيته؟

أسئلتك بعد هذا، كل جواب في قسمه:
لماذا أحتاج هذه الخطوة؟
السبب بالتفصيل، والمصطلحات التي تحتاجها
ما لم تفسّره الملاءمة اسمه التباين المتبقّيresidual varianceنسبة خريطة الرأس التي لا يفسّرها نموذج ثنائي القطب. (residual variance). كلما قلّ، كان المكوّن أقرب لمصدر واحد في الدماغ. هذا يساعدك على تمييز المكوّنات الدماغية، ويلزمك لاحقاً في تجميعclusteringتجميع مكوّنات ICA المتشابهة من عدة مشاركين في مجموعات. مكوّنات ICA بين مشاركparticipantالشخص الذي سُجّلت بياناته في التجربة..
إذا كانت عندك صورة MRI لكل مشارك، فإضافة NFT تبني نموذج رأس خاصاً به بدل النموذج القياسي، وتجدها في مدير الإضافات.
لماذا أحتاج هذه الخطوة؟
ما لم تفسّره الملاءمة اسمه التباين المتبقّي (residual variance). كلما قلّ، كان المكوّن أقرب لمصدر واحد في الدماغ. هذا يساعدك على تمييز المكوّنات الدماغية، ويلزمك لاحقاً في تجميع مكوّنات ICA بين المشاركين.
إذا كانت عندك صورة MRI لكل مشارك، فإضافة NFT تبني نموذج رأس خاصاً به بدل النموذج القياسي، وتجدها في مدير الإضافات.
كيف أطبّقها في EEGLAB؟
16 خطوة من القوائم
ابدأ من النسخة الرئيسية وفيها أوزان ICA، كما في “نقطة البداية”. الخطوة 4 تغيّر مواقع الأقطاب في داتاستdatasetملف بيانات EEG واحد محمّل في EEGLAB مع معلوماته. المفتوحة، فاحفظ النتيجة في آخر الدرس في ملف جديد، ولا تحفظها فوق النسخة الرئيسية.
أولاً: تأكد أن Fieldtrip-lite مثبّت
- يحسب DIPFIT الملاءمة بدوال من FieldTrip. هذه الدوال ليست داخل EEGLAB نفسه، بل تأتي في إضافة منفصلة اسمها Fieldtrip-lite. للتأكد، اكتب في نافذة الأوامر:
exist('ft_dipolefitting', 'file')إذا طبع 2 فالإضافة مثبّتة، فانتقل إلى الخطوة 3. وإذا طبع 0 فهي غير مثبّتة.
2. لتثبيتها، افتح File ثم Manage EEGLAB extensions، وابحث عن Fieldtrip-lite، وثبّتها، ثم أعد تشغيل eeglab. إذا تجاوزت هذه الخطوة، يسألك EEGLAB عند فتح إعدادات DIPFIT في الخطوة 6: Fieldtrip-lite extension is not installed. Do you want to download it now?. اضغط Yes. درس تجميع مكوّنات ICA في المحطة 8 يحتاج هذه الإضافة أيضاً.
ثانياً: طابق أسماء الأقطاب مع ملف نموذج الرأسhead modelنموذج رياضي لطبقات الرأس يُستخدم لتحديد موقع المصدر.
- افتح Edit ثم Channel locations.
- اضغط Look up locs، واختر من البند الذي وصفه use MNI coordinate file for BEM dipfit model. اضغط Ok.
- اضغط Ok في نافذة مواقع الأقطاب. تطبع نافذة الأوامر السطر
Channel lookup: no location for EOG1,EOG2، لأن القناتين ليستا في ملف القوالب. هذا مقصود: قناةchannelالإشارة المسجّلة من قطب واحد، وهي ما يعرضه EEGLAB. العين لا تدخل في الملاءمة.
ثالثاً: اختر نموذج الرأس
- افتح Tools ثم Source localization using DIPFIT ثم Head model and settings.
- في Select a head model اترك الاختيار الافتراضي Template Boundary Element Model (MNI).
- انظر خانةfield (in a dialog)مكان في نافذة نكتب فيه قيمة أو نختارها. Matrix to align chan. locs. with head model. يجب أن تكون ممتلئة، وأغلبها أصفار وآحاد مع الرقم
-1.5708، أي دوران 90 درجة بين اتجاه الأنف في EEGLAB وفي النموذج. إذا كانت فارغة، ارجع للخطوة 4. - اضغط Ok. تطبع نافذة الأوامر
Warning: 2 channels without coordinates removed from dipole fitting، وهما قناتا العين نفسهما.
رابعاً: ملاءمة آلية لكل المكوّنات
- افتح Tools ثم Source localization using DIPFIT ثم Component dipole autofit.
- اترك Component indices (default:all) فارغة، فتُلاءَم كل المكوّنات.
- اترك Rejection threshold RV (%) على
100، حتى يبقى لكل مكوّن ثنائي قطب وتقرأ تباينه المتبقّي بنفسك. - فعّل Plot resulting dipoles using dipplot (check)، واضغط Ok. الملاءمة تأخذ دقائق، وتطبع نافذة الأوامر تقدّمها.
خامساً: اقرأ النتيجة
- افتح Plot ثم Component maps ثم In 2-D، واكتب
1:12في رقم المكوّنات، وفعّل Plot associated dipole(s) (if present). - افتح Tools ثم Source localization using DIPFIT ثم Component dipole plot، وفعّل Plot summary mode، واضغط Ok. تعرض نافذة واحدة كل ثنائيات الأقطاب من ثلاثة مناظر (من الأعلى ومن الخلف ومن الجانب)، مع قائمة المكوّنات وتباينها المتبقّي.
- لكل مكوّن: هل ثنائي القطب داخل الدماغ؟ وما تباينه المتبقّي؟ قارن مكوّن الرمش الذي عرفته في درس ICLabel بمكوّن دماغي مثل ألفا في الخلف.
- احفظ من File ثم Save current dataset as باسم
D1_dipfit.set.
كيف أطبّقها في EEGLAB؟
ابدأ من النسخة الرئيسية وفيها أوزان ICA، كما في “نقطة البداية”. الخطوة 4 تغيّر مواقع الأقطاب في الداتاست المفتوحة، فاحفظ النتيجة في آخر الدرس في ملف جديد، ولا تحفظها فوق النسخة الرئيسية.
أولاً: تأكد أن Fieldtrip-lite مثبّت
- يحسب DIPFIT الملاءمة بدوال من FieldTrip. هذه الدوال ليست داخل EEGLAB نفسه، بل تأتي في إضافة منفصلة اسمها Fieldtrip-lite. للتأكد، اكتب في نافذة الأوامر:
exist('ft_dipolefitting', 'file')إذا طبع 2 فالإضافة مثبّتة، فانتقل إلى الخطوة 3. وإذا طبع 0 فهي غير مثبّتة.
2. لتثبيتها، افتح File ثم Manage EEGLAB extensions، وابحث عن Fieldtrip-lite، وثبّتها، ثم أعد تشغيل eeglab. إذا تجاوزت هذه الخطوة، يسألك EEGLAB عند فتح إعدادات DIPFIT في الخطوة 6: Fieldtrip-lite extension is not installed. Do you want to download it now?. اضغط Yes. درس تجميع مكوّنات ICA في المحطة 8 يحتاج هذه الإضافة أيضاً.
ثانياً: طابق أسماء الأقطاب مع ملف نموذج الرأس
- افتح Edit ثم Channel locations.
- اضغط Look up locs، واختر من القائمة البند الذي وصفه use MNI coordinate file for BEM dipfit model. اضغط Ok.
- اضغط Ok في نافذة مواقع الأقطاب. تطبع نافذة الأوامر السطر
Channel lookup: no location for EOG1,EOG2، لأن القناتين ليستا في ملف القوالب. هذا مقصود: قنوات العين لا تدخل في الملاءمة.
ثالثاً: اختر نموذج الرأس
- افتح Tools ثم Source localization using DIPFIT ثم Head model and settings.
- في Select a head model اترك الاختيار الافتراضي Template Boundary Element Model (MNI).
- انظر خانة Matrix to align chan. locs. with head model. يجب أن تكون ممتلئة، وأغلبها أصفار وآحاد مع الرقم
-1.5708، أي دوران 90 درجة بين اتجاه الأنف في EEGLAB وفي النموذج. إذا كانت فارغة، ارجع للخطوة 4. - اضغط Ok. تطبع نافذة الأوامر
Warning: 2 channels without coordinates removed from dipole fitting، وهما قناتا العين نفسهما.
رابعاً: ملاءمة آلية لكل المكوّنات
- افتح Tools ثم Source localization using DIPFIT ثم Component dipole autofit.
- اترك Component indices (default:all) فارغة، فتُلاءَم كل المكوّنات.
- اترك Rejection threshold RV (%) على
100، حتى يبقى لكل مكوّن ثنائي قطب وتقرأ تباينه المتبقّي بنفسك. - فعّل Plot resulting dipoles using dipplot (check)، واضغط Ok. الملاءمة تأخذ دقائق، وتطبع نافذة الأوامر تقدّمها.
خامساً: اقرأ النتيجة
- افتح Plot ثم Component maps ثم In 2-D، واكتب
1:12في رقم المكوّنات، وفعّل Plot associated dipole(s) (if present). - افتح Tools ثم Source localization using DIPFIT ثم Component dipole plot، وفعّل Plot summary mode، واضغط Ok. تعرض نافذة واحدة كل ثنائيات الأقطاب من ثلاثة مناظر (من الأعلى ومن الخلف ومن الجانب)، مع قائمة المكوّنات وتباينها المتبقّي.
- لكل مكوّن: هل ثنائي القطب داخل الدماغ؟ وما تباينه المتبقّي؟ قارن مكوّن الرمش الذي عرفته في درس ICLabel بمكوّن دماغي مثل ألفا في الخلف.
- احفظ من File ثم Save current dataset as باسم
D1_dipfit.set.
كيف أكتبها بالكود؟
نفس الخطوات في 25 أسطر MATLAB
% DIPFIT needs the Fieldtrip-lite plugin: install it once if missing
if ~exist('ft_dipolefitting', 'file')
plugin_askinstall('Fieldtrip-lite', 'ft_dipolefitting', true);
end
% Work on a copy: the lookup below changes channel coordinates
EEG.setname = 'D1 dipfit';
% Template electrode positions that match the BEM head model.
% Channels missing from the template (EOG1, EOG2) lose their
% coordinates and are left out of the fit.
EEG = pop_chanedit(EEG, 'lookup', 'standard_1005.elc');
% Template BEM head model (MNI); the alignment matrix is set
% automatically from the template file name
EEG = pop_dipfit_settings(EEG, 'model', 'standardBEM');
disp(EEG.dipfit.coord_transform); % expect 0 0 0 0 0 -1.5708 1 1 1
% Coarse grid scan + fine fit for all components, keep every dipole
EEG = pop_multifit(EEG, [], 'threshold', 100);
% Residual variance per component, in percent
rv = 100 * [EEG.dipfit.model.rv];
fprintf('IC %2d: RV = %5.1f%%\n', [1:numel(rv); rv]);
fprintf('%d of %d components below 15%% RV\n', sum(rv < 15), numel(rv));
% Scalp maps of the first 12 components with their dipoles
pop_topoplot(EEG, 0, 1:12, 'D1 dipfit', 0, 1);
% Summary view of all dipoles: top, back and side, with component numbers
pop_dipplot(EEG, 1:numel(EEG.dipfit.model), 'normlen', 'on', 'summary', 'on', 'num', 'on');
EEG = pop_saveset(EEG, 'filename', 'D1_dipfit.set', 'filepath', pwd);كيف أكتبها بالكود؟
% DIPFIT needs the Fieldtrip-lite plugin: install it once if missing
if ~exist('ft_dipolefitting', 'file')
plugin_askinstall('Fieldtrip-lite', 'ft_dipolefitting', true);
end
% Work on a copy: the lookup below changes channel coordinates
EEG.setname = 'D1 dipfit';
% Template electrode positions that match the BEM head model.
% Channels missing from the template (EOG1, EOG2) lose their
% coordinates and are left out of the fit.
EEG = pop_chanedit(EEG, 'lookup', 'standard_1005.elc');
% Template BEM head model (MNI); the alignment matrix is set
% automatically from the template file name
EEG = pop_dipfit_settings(EEG, 'model', 'standardBEM');
disp(EEG.dipfit.coord_transform); % expect 0 0 0 0 0 -1.5708 1 1 1
% Coarse grid scan + fine fit for all components, keep every dipole
EEG = pop_multifit(EEG, [], 'threshold', 100);
% Residual variance per component, in percent
rv = 100 * [EEG.dipfit.model.rv];
fprintf('IC %2d: RV = %5.1f%%\n', [1:numel(rv); rv]);
fprintf('%d of %d components below 15%% RV\n', sum(rv < 15), numel(rv));
% Scalp maps of the first 12 components with their dipoles
pop_topoplot(EEG, 0, 1:12, 'D1 dipfit', 0, 1);
% Summary view of all dipoles: top, back and side, with component numbers
pop_dipplot(EEG, 1:numel(EEG.dipfit.model), 'normlen', 'on', 'summary', 'on', 'num', 'on');
EEG = pop_saveset(EEG, 'filename', 'D1_dipfit.set', 'filepath', pwd);أي قيمة أختار؟
القيم المناسبة حسب هدف تحليلك
| الإعداد | القيمة | لماذا |
|---|---|---|
| نموذج الرأس | Template Boundary Element Model (MNI) | التوثيق الرسمي: النموذج الكروي (BESA) باقٍ للتوافق مع القديم ولا يُستخدم للنشر، ونموذج BEM أقرب لشكل الرأس الحقيقي (صفحة Head model). |
| حد قبول ثنائي القطب | التباين المتبقّي أقل من 15% | الحد الافتراضي في EEGLAB لاختيار المكوّنات قبل التجميع، مع ورقة تبرّره في نفس الصفحة (STUDY ICA clusters). قاعدة بداية لا قانون. |
| حد الرفض في الملاءمة | 100% أثناء التعلّم | تحتفظ بكل ثنائيات القطب وتقرأها. في سكربت المشروع يمكن وضعه 15 فيُعلَّم الباقي تلقائياً. |
| عدد ثنائيات القطب | واحد، واثنان متماثلان فقط إذا كانت الخريطة متماثلة بين النصفين | الخيار Fit bilateral dipoles (check) مخصّص لهذه الحالة (صفحة DIPFIT، Fitting symmetrical dipoles). |
أي قيمة أختار؟
| الإعداد | القيمة | لماذا |
|---|---|---|
| نموذج الرأس | Template Boundary Element Model (MNI) | التوثيق الرسمي: النموذج الكروي (BESA) باقٍ للتوافق مع القديم ولا يُستخدم للنشر، ونموذج BEM أقرب لشكل الرأس الحقيقي (صفحة Head model). |
| حد قبول ثنائي القطب | التباين المتبقّي أقل من 15% | الحد الافتراضي في EEGLAB لاختيار المكوّنات قبل التجميع، مع ورقة تبرّره في نفس الصفحة (STUDY ICA clusters). قاعدة بداية لا قانون. |
| حد الرفض في الملاءمة | 100% أثناء التعلّم | تحتفظ بكل ثنائيات القطب وتقرأها. في سكربت المشروع يمكن وضعه 15 فيُعلَّم الباقي تلقائياً. |
| عدد ثنائيات القطب | واحد، واثنان متماثلان فقط إذا كانت الخريطة متماثلة بين النصفين | الخيار Fit bilateral dipoles (check) مخصّص لهذه الحالة (صفحة DIPFIT، Fitting symmetrical dipoles). |
كيف أتأكد أنها نجحت؟
5 فحوص سريعة
exist('ft_dipolefitting', 'file')يطبع2.EEG.dipfit.coord_transformليس فارغاً، وفيه-1.5708.numel(EEG.dipfit.model)يساوي عدد مكوّنات ICA عندك.- مكوّن الرمش موضعه في مقدمة الرأس، ومكوّن ألفا الخلفي موضعه في الجزء الخلفي من الدماغ.
- عدد المكوّنات تحت 15% يطبعه السكربت. سجّله، فستحتاجه في تجميع مكوّنات ICA.
كيف أتأكد أنها نجحت؟
exist('ft_dipolefitting', 'file')يطبع2.EEG.dipfit.coord_transformليس فارغاً، وفيه-1.5708.numel(EEG.dipfit.model)يساوي عدد مكوّنات ICA عندك.- مكوّن الرمش موضعه في مقدمة الرأس، ومكوّن ألفا الخلفي موضعه في الجزء الخلفي من الدماغ.
- عدد المكوّنات تحت 15% يطبعه السكربت. سجّله، فستحتاجه في تجميع مكوّنات ICA.
ما الأخطاء التي يقع فيها كثيرون؟
5 أخطاء، وكيف تتجنّبها
- ترك مصفوفة المطابقة فارغة. بدون مطابقة بين مواقع الأقطاب ونموذج الرأس، تخرج المواضع في أماكن خاطئة. تأكد أنها ممتلئة قبل الملاءمة.
- تغيير مواقع الأقطاب بعد ضبط النموذج. إذا عدّلت المواقع، افتح Head model and settings من جديد حتى تُحسب المطابقة مرة ثانية.
- قراءة الموضع كعنوان تشريحي دقيق. النموذج والأقطاب قياسيان، فالخطأ قد يبلغ سنتيمترات. اكتب “قرب” المنطقة، لا “في” تلفيف بعينه.
- اعتبار التباين المنخفض دليلاً على مصدر دماغي. مكوّن الرمش قد يُلاءَم جيداً بتباين منخفض، لكن موضعه في مقدمة الرأس قرب العينين. اقرأ الموضع والخريطة والطيف معاً، كما في درس ICLabel.
- إدخال قنوات العين في الملاءمة. نموذج الرأس ضعيف عند العينين، والتوثيق الرسمي ينصح باستبعادها. في هذا الدرس استُبعدت تلقائياً لأنها بلا موقع بعد الخطوة 2.
ما الأخطاء التي يقع فيها كثيرون؟
- ترك مصفوفة المطابقة فارغة. بدون مطابقة بين مواقع الأقطاب ونموذج الرأس، تخرج المواضع في أماكن خاطئة. تأكد أنها ممتلئة قبل الملاءمة.
- تغيير مواقع الأقطاب بعد ضبط النموذج. إذا عدّلت المواقع، افتح Head model and settings من جديد حتى تُحسب المطابقة مرة ثانية.
- قراءة الموضع كعنوان تشريحي دقيق. النموذج والأقطاب قياسيان، فالخطأ قد يبلغ سنتيمترات. اكتب “قرب” المنطقة، لا “في” تلفيف بعينه.
- اعتبار التباين المنخفض دليلاً على مصدر دماغي. مكوّن الرمش قد يُلاءَم جيداً بتباين منخفض، لكن موضعه في مقدمة الرأس قرب العينين. اقرأ الموضع والخريطة والطيف معاً، كما في درس ICLabel.
- إدخال قنوات العين في الملاءمة. نموذج الرأس ضعيف عند العينين، والتوثيق الرسمي ينصح باستبعادها. في هذا الدرس استُبعدت تلقائياً لأنها بلا موقع بعد الخطوة 2.
متصفحك لا يسمح بحفظ التقدّم. كل الدروس متاحة، لكن علامات الإكمال لن تُحفظ.
تم. حُفظ تقدّمك في هذا المتصفح.تراجعكيف أكتبها في ورقتي؟
قالب Methods: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته
قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.
Equivalent current dipoles were fitted to each independent component (pop_multifit, dipfit plugin 5.6, EEGLAB 2026.1) using the template boundary element head model (MNI) and template electrode positions (standard_1005); components with residual variance above 15% were considered non-dipolar.كيف أكتبها في ورقتي؟
قالب: عدّل البيانات والإعدادات والإصدارات لتطابق ما نفّذته.
Equivalent current dipoles were fitted to each independent component (pop_multifit, dipfit plugin 5.6, EEGLAB 2026.1) using the template boundary element head model (MNI) and template electrode positions (standard_1005); components with residual variance above 15% were considered non-dipolar.أين أقرأ أكثر؟
4 مراجع: التوثيق الرسمي أولاً
- EEGLAB Tutorialتوثيق9. Source analysis > a. Head model
- EEGLAB Tutorialتوثيق9. Source analysis > b. Indep. Comp. sources
- EEGLAB Tutorialتوثيق10. Group analysis > STUDY ICA clusters (residual variance threshold)
- ICA applied to EEG part 5: Source localization of ICA componentsفيديوالفيديو كاملاً · 14:05
مكتوب لـ EEGLAB 2026.1 · 2026-10-28
للتوسّع
- EEGLAB Tutorial: https://eeglab.org/tutorials/09_source/Model_Settings.html (9. Source analysis > a. Head model)
- EEGLAB Tutorial: https://eeglab.org/tutorials/09_source/DIPFIT.html (9. Source analysis > b. Indep. Comp. sources)
- EEGLAB Tutorial: https://eeglab.org/tutorials/10_Group_analysis/component_clustering_tools.html (10. Group analysis > STUDY ICA clusters (residual variance threshold))
- ICA applied to EEG part 5: Source localization of ICA components: https://www.youtube.com/watch?v=kQI3Yzv1wqs (الفيديو كاملاً)
تحتاج مساعدة؟
اسأل، أو شاركنا رأيك، أو بلّغ عن خطأ
- بلّغ عن خطأ علمي · يحتاج حساباً على GitHub. لا تملك حساباً؟ استخدم "شاركنا رأيك".