Skip to content

Commit

Permalink
adding details of data acq
Browse files Browse the repository at this point in the history
  • Loading branch information
schluppeck committed Feb 7, 2024
1 parent c6b2aa8 commit 990e12f
Show file tree
Hide file tree
Showing 7 changed files with 162 additions and 75 deletions.
13 changes: 13 additions & 0 deletions 2017-18-scanning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Scanner - actual numbers from the day (2017/18)

2. **inplane anatomy** - T1w, 2D MPRAGE. 24 slices, inplane voxel size: 1.5 mm, slice thickness 3 mm (same prescription as fMRI data). Matrix size 128 x 128.
4. **fMRI data** (and all fMRI scans) 2D gradient-echo EPI, TR 1.5s, TE 40ms, FA: 72º, 160 dynamics. Voxel size 3mm isotropic. Matrix size 64 x 64.
6. **whole head anatomy** - T1w 3D MPRAGE. Matrix size 256 x 256, 160 slices. Reconstructed as sagittal images. voxel size 1 mm isotropic. TE 3.7 ms, TR 8.13 ms, FA 8°, TI 960 ms, and linear phase encoding order.

## Stimulus set-up

- stimuli were presented on a BOLDscreen (CRS Ltd, Rochester, UK) - https://www.crsltd.com/tools-for-functional-imaging/mr-safe-displays/boldscreen-32-lcd-for-fmri/
- **2018/19 stimulus code:** inspect ``scene_localiser()`` in the ``stimulusCode`` directory. If you can't run the code and get errors, have a lootk at [this clip on youtube](https://www.youtube.com/watch?v=5kSvEO4-HVc) to get an impression.
- other details have remained the same since the 2017/18 version.


7 changes: 7 additions & 0 deletions 2018-19-scanning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
## Scanner - actual numbers from the day (2018/19).

2. **inplane anatomy** - T1w, 2D MPRAGE. 24 slices, inplane voxel size: 1.5 mm, slice thickness 3 mm (same prescription as fMRI data). Matrix size 128 x 128.
4. **fMRI data** (and all fMRI scans) 2D gradient-echo EPI, TR 1.5s, TE 40ms, FA: 72º, *scene localiser scan*: 294 (288+4) dynamics, retinotopy scan: 160 dynamics. Voxel size 3mm isotropic (acquired). Matrix size 64 x 64. **Note: the scanner reconstruction may have changed the "reconstructed voxel size" to something else, for mathematical expediency.** (Check the dimensions in the actual data with ``fslinfo`` or ``fslhd``.)
6. **whole head anatomy** - T1w 3D MPRAGE. Matrix size 256 x 256, 160 slices. Reconstructed as sagittal images. voxel size 1 mm isotropic. TE 3.7 ms, TR 8.13 ms, FA 8°, TI 960 ms, and linear phase encoding order.
7. across the subjects we also acquired various other data sets (including **diffusion weighted**, a **T2 weighted** anatomy scan (using multiple echoes), ... but we didn't find time to analyze these in class.

13 changes: 13 additions & 0 deletions 2019-20-scanning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
## Scanner - actual numbers from the day (2019/20).

For each of three subjects (``subject-A``, ``subject-B`` and ``subject-C``) we collected 5 scans. The "series" numbers may be slightly different across individuals. but the scans (in order) were the same:

1. **fMRI data** - 2D gradient-echo EPI, TR 2.0s, TE 30ms, multiband factor 2, FA: 80º, ``scene_localiser()`` scan: 192 dynamics. (Check the dimensions in the actual data with ``fslinfo`` or ``fslhd``.)

2. **fMRI data** - acquisition details as in 1, but only 120 dynamics. Pseudorandomly ordered blocks on "normal", "inverted" and "caricatured" faces (at different levels).

3. same as 2 (a repeat)

4. **whole head anatomy** - T1w 3D MPRAGE. Matrix size 256 x 256, 160 slices. Reconstructed as sagittal images. voxel size 1 mm isotropic. TE 3.7 ms, TR 8.13 ms, FA 8°, TI 960 ms, and linear phase encoding order.

5. **T2 weighted** anatomy scan. TE 89ms, TR 3.38s, FA, 90º (Check the dimensions in the actual data with ``fslinfo`` or ``fslhd``.)
14 changes: 14 additions & 0 deletions 2022-23-scanning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
## Scanner - actual numbers from the day (2022/23).

For each of four subjects (``sub-01`` .. ``sub-02``) we collected most of those scans. Look at the `Readme.md` file in each folder for any notes (eg `sub-02` has one scan with TR=2s, because of the sample protocol I had picked.)

Data shared via `OneDrive` link on a moodle message to the participants on the module.

### A note on the block-design parameters.

- the visual scan (faces versus objects) used a `rest-A-rest-B-...` pattern.
- the finger tapping scan follwed the same timing. `rest-LEFT-rest-RIGHT...`

Each `rest-stimulus` block took 24s (so 16 TRs at 1.5s... or 12 TRs for the one scan with a 2s TR).

The code for these experiments is in the `stimulusCode` folder (`FFAlocaliser()` and `M1localiser()`). Ask DS for details on how this works, if you are interested in generating stimuli.
124 changes: 75 additions & 49 deletions gettingData.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,90 +24,116 @@ The protocol will be pretty standard for a cognitive neuroscience scanning sessi
2. A test EPI to make sure that the slice positioning for the fMRI experiment is ok.
3. fMRI experiment (block): gradient-echo EPI, TR 1.5s **(~4min)**
4. T1w-MPRAGE: to illustrate detailed (1mm isotropic) anatomy **(~5min)**
5. T2w-anatomy: higher resolution inplane, but thicker slices
6. fMRI experiment (block): gradient-echo EPI, TR 1.5s **(~4min)** (a finger-tapping experiment as opposed to a visual experiment)
5. T2w-FLAIR: (1mm isotropic)

## Scanner - actual numbers from the day (2023/24).
## Stimulus code

*details to be updated*
+ stimulus code: inspect ``FFAlocaliser`` for lots of details.
+ **timing: block design** 12s images (faces, objects), 12s rest: a 24s cycle. 10 repeats per scan - 240s or 160 dynamics (@ 1.5s). Stimuli were images from face and object image database (details below).

The code is written in ``matlab/mgl`` using the ``task`` library that comes with ``mgl``. Written by Alex Beckett and DS based on a version of a working code from Justin Gardner :smile:

## Scanner - actual numbers from the day (2022/23).
There are a couple of short youtube videos explaining a version of <a href="https://youtu.be/wcA_h-rrVeM" target="_blank">the FFA localiser</a> and the <a href="https://youtu.be/exqNc7q8zSs" target="_blank">fixation dimming task</a> to control attention, which would be used in a real experiment. This should give you a sense of what the subject is doing inside the scanner.

For each of four subjects (``sub-01`` .. ``sub-02``) we collected most of those scans. Look at the `Readme.md` file in each folder for any notes (eg `sub-02` has one scan with TR=2s, because of the sample protocol I had picked.)
The experiment runs as a simple block design in the following order:

Data shared via `OneDrive` link on a moodle message to the participants on the module.
>[faces, rest] , [objects, rest] - ...
### A note on the block-design parameters.
The length of each ``[stimulus, rest]`` cycle is determined by the ``cycleLength`` (in TRs).

- the visual scan (faces versus objects) used a `rest-A-rest-B-...` pattern.
- the finger tapping scan follwed the same timing. `rest-LEFT-rest-RIGHT...`
To run, make sure the ``stimulusCode`` folder is on the path and then simply run the following command. the ``Escape`` key can be used to stop the experiment at any point:

Each `rest-stimulus` block took 24s (so 16 TRs at 1.5s... or 12 TRs for the one scan with a 2s TR).
```matlab
FFAlocaliser % quick test to see what's going on
```

The code for these experiments is in the `stimulusCode` folder (`FFAlocaliser()` and `M1localiser()`). Ask DS for details on how this works, if you are interested in generating stimuli.
To run at the MR centre, we also want to specify TR, not to run in a small window, etc. So probably worth setting a few parameters in the call like this:

## Scanner - actual numbers from the day (2019/20).
```matlab
FFAlocaliser('TR=1.5', 'debug=0', 'numBlocks=10', 'cycleLength=12')
```

For each of three subjects (``subject-A``, ``subject-B`` and ``subject-C``) we collected 5 scans. The "series" numbers may be slightly different across individuals. but the scans (in order) were the same:
## Scanner - actual numbers from the day (2023/24)

1. **fMRI data** - 2D gradient-echo EPI, TR 2.0s, TE 30ms, multiband factor 2, FA: 80º, ``scene_localiser()`` scan: 192 dynamics. (Check the dimensions in the actual data with ``fslinfo`` or ``fslhd``.)
2024-02-07, Denis Schluppeck

2. **fMRI data** - acquisition details as in 1, but only 120 dynamics. Pseudorandomly ordered blocks on "normal", "inverted" and "caricatured" faces (at different levels).
4 volunteers (``sub-01`` .. ``sub-04``), scanned on the 3T GE scanner at the SPMIC QMC site. Scanner operator: AC. Start time 1400h.

3. same as 2 (a repeat)
(Data available via `moodle` link to a zip file on OneDrive).

4. **whole head anatomy** - T1w 3D MPRAGE. Matrix size 256 x 256, 160 slices. Reconstructed as sagittal images. voxel size 1 mm isotropic. TE 3.7 ms, TR 8.13 ms, FA 8°, TI 960 ms, and linear phase encoding order.
For each person we obtained several scans. See `json` sidecar copied along for some details.

5. **T2 weighted** anatomy scan. TE 89ms, TR 3.38s, FA, 90º (Check the dimensions in the actual data with ``fslinfo`` or ``fslhd``.)
- T1w MPRAGE (1mm isotropic)
- T2w FLAIR (1mm isotropic)
- one or two repeats of an fMRI experiment (`FFAlocaliser.m`); 2.2mm isotropic, TR/TE 1500ms/35ms

## Scanner - actual numbers from the day (2018/19).
## fMRI experiment and timing

2. **inplane anatomy** - T1w, 2D MPRAGE. 24 slices, inplane voxel size: 1.5 mm, slice thickness 3 mm (same prescription as fMRI data). Matrix size 128 x 128.
4. **fMRI data** (and all fMRI scans) 2D gradient-echo EPI, TR 1.5s, TE 40ms, FA: 72º, *scene localiser scan*: 294 (288+4) dynamics, retinotopy scan: 160 dynamics. Voxel size 3mm isotropic (acquired). Matrix size 64 x 64. **Note: the scanner reconstruction may have changed the "reconstructed voxel size" to something else, for mathematical expediency.** (Check the dimensions in the actual data with ``fslinfo`` or ``fslhd``.)
6. **whole head anatomy** - T1w 3D MPRAGE. Matrix size 256 x 256, 160 slices. Reconstructed as sagittal images. voxel size 1 mm isotropic. TE 3.7 ms, TR 8.13 ms, FA 8°, TI 960 ms, and linear phase encoding order.
7. across the subjects we also acquired various other data sets (including **diffusion weighted**, a **T2 weighted** anatomy scan (using multiple echoes), ... but we didn't find time to analyze these in class.
- the original scan was 168 timepoints long, but the first 8TRs (12s) were cut to allow for steady state.
- after removing these initial dummies, the time series is 160 timepoints long
- timing of the experiment is (Faces-rest-Obj-rest)*5)

## Scanner - actual numbers from the day (2017/18)
```
12s ON (faces)
12s OFF (gray)
2. **inplane anatomy** - T1w, 2D MPRAGE. 24 slices, inplane voxel size: 1.5 mm, slice thickness 3 mm (same prescription as fMRI data). Matrix size 128 x 128.
4. **fMRI data** (and all fMRI scans) 2D gradient-echo EPI, TR 1.5s, TE 40ms, FA: 72º, 160 dynamics. Voxel size 3mm isotropic. Matrix size 64 x 64.
6. **whole head anatomy** - T1w 3D MPRAGE. Matrix size 256 x 256, 160 slices. Reconstructed as sagittal images. voxel size 1 mm isotropic. TE 3.7 ms, TR 8.13 ms, FA 8°, TI 960 ms, and linear phase encoding order.
12s ON (objects)
12s OFF (gray)
## Stimulus set-up
... then each repeated for a total of 10 stimulus-rest blocks
```

- stimuli were presented on a BOLDscreen (CRS Ltd, Rochester, UK) - https://www.crsltd.com/tools-for-functional-imaging/mr-safe-displays/boldscreen-32-lcd-for-fmri/
- **2018/19 stimulus code:** inspect ``scene_localiser()`` in the ``stimulusCode`` directory. If you can't run the code and get errors, have a lootk at [this clip on youtube](https://www.youtube.com/watch?v=5kSvEO4-HVc) to get an impression.
- other details have remained the same since the 2017/18 version.
## File organisation

The zip file contains data from the 4 participants in the following layout:

```text
.
├── Readme.md
├── sub-01
├── sub-02
│   ├── sub-02-FLAIR.png
│   ├── sub-02-MPRAGE.png
│   ├── sub-02-flair.json
│   ├── sub-02-flair.nii.gz
│   ├── sub-02-fmri01.nii.gz
│   ├── sub-02-fmri02.nii.gz
│   ├── sub-02-mprage.json
│   └── sub-02-mprage.nii.gz
├── sub-03
└── sub-04
```

## Stimulus code (2017/18)

+ stimulus code: inspect ``FFAlocaliser`` and ``jazLocaliser`` for lots of details. You should be able to run the code, too.
+ **timing: block design** 12s rest, 12s images (faces, objects), so 24s cycles. 10 repeats per scan - 240s or 160 dynamics (@ 1.5s). Stimuli were images from face and object image database (details below).
+ **timing: event-related design** 1.5s stimuli followed be a randomly chosen ITI between 9s and and 18s (in 1.5s increments). Stimuli were white, moving, random dots on a black background. 100% coherence, speed 4 deg/s. Scans lasted 240s or 160 dynamics (@ 1.5s).
## Notes

The code is written in ``matlab/mgl`` using the ``task`` library that comes with ``mgl``. Written by Alex Beckett and DS based on a version of a working code from Justin Gardner :smile:
For FSL design matrix rules, this means for EVs

There are a couple of short youtube videos explaining <a href="https://youtu.be/wcA_h-rrVeM" target="_blank">the FFA localiser</a> and the <a href="https://youtu.be/exqNc7q8zSs" target="_blank">fixation dimming task</a> to control attention. This should give you a sense of what the subject is doing inside the scanner.
| setting | Faces | Objects |
| :---------- | :----- | :------ |
| Skip | 36 | 36 |
| Off | 36 | 36 |
| On | 12 | 12 |
| Phase | **36** | **12** |
| Stop After | -1 | -1 |
| Convolution | Gamma | Gamma |

The experiment runs as a simple block design in the following order:

>[faces, rest] , [objects, rest] - ...

The length of each ``[stimulus, rest]`` cycle is determined by the ``cycleLength`` (in TRs).

To run, make sure the ``stimulusCode`` folder is on the path and then simply run the following command. the ``Escape`` key can be used to stop the experiment at any point:

```Matlab
FFAlocaliser % quick test to see what's going on
```
## Previous scanning sessions

- [2022-23 cohort](./2022-23-scanning.md)

- [2019-20 cohort](./2019-20-scanning.md)

- [2018-19 cohort](./2018-19-scanning.md)

- [2017-18 cohort](./2017-18-scanning.md)

To run at the MR centre, we also want to specify TR, not to run in a small window, etc. So probably worth setting a few parameters in the call like this:

```Matlab
FFAlocaliser('TR=1.5', 'debug=0', 'numBlocks=10', 'cycleLength=12')
```

### Notes

Expand Down
48 changes: 30 additions & 18 deletions stimulusCode/FFAlocaliser.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,13 @@
% purpose: code for doing face and object area localiser.
% images courtesy of Tim Andrews (York) and others.
%
%
%
%
%
% e.g.:
% FFAlocaliser()
% FFAlocaliser('displayname=3T-GE-debug', 'TR=1.5')
%
% make sure to also look at jazLocaliser.m for event-related expt
function myscreen = FFAlocaliser( varargin )
Expand All @@ -17,6 +22,8 @@

% setup default arguments
if ieNotDefined('debug'), debug=0; end
if ieNotDefined('displayname'), displayname = ''; end


% scanning params
if ieNotDefined('TR'), TR=1.5; end
Expand Down Expand Up @@ -50,7 +57,7 @@
myscreen.datadir = './';
myscreen.allowpause = 0;
myscreen.eatkeys = 1;
myscreen.displayname = '';
myscreen.displayname = displayname;
myscreen.background = 'gray';
myscreen.TR = TR;
myscreen.cycleLength = cycleLength; % in TRs
Expand All @@ -65,6 +72,7 @@
fixStimulus.diskSize = 0.0; % no disk (just superimpose on stim)
fixStimulus.fixWidth = 1;

% by default the screen params should come from mglEditScreenParams setup!!
if debug == 1
% gethostname and then display the stimulus on the corresponding screen
% myscreen.screenParams{1} = {gethostname(),[],0,1024,768,80,[31 23],60,1,1,1.4,[],flipHV};
Expand All @@ -79,23 +87,25 @@
fixStimulus.fixWidth = 1;
fixStimulus.diskSize = 0;

else
% running at 3T for experiment
defaultMonitorGamma = 1.8;
% myscreen.screenParams{1} = {gethostname(),'',2,1280,960,231,[83 3*83/4],60,1,1,defaultMonitorGamma,'',flipHV}; % 3T nottingham
myscreen.screenParams{1} = struct('computerName', gethostname(),...
'displayName',[], 'screenNumber', 2, ...
'screenWidth', 1280, 'screenHeight', 960, 'displayDistance', 231,...
'displaySize',[83 3*83/4], 'framesPerSecond', 60, 'autoCloseScreen', 1, ...
'saveData', 1, 'calibType', 1, 'monitorGamma', defaultMonitorGamma, 'calibFilename',[], ...
'flipHV', flipHV, 'digin',[], 'hideCursor', 1, 'displayPos', [], 'backtickChar', '5');
elseif debug == 2
fprintf('should not need this code!!')
% don't run this code now...
% running at 3T for experiment
% defaultMonitorGamma = 1.8;
% % myscreen.screenParams{1} = {gethostname(),'',2,1280,960,231,[83 3*83/4],60,1,1,defaultMonitorGamma,'',flipHV}; % 3T nottingham
% myscreen.screenParams{1} = struct('computerName', gethostname(),...
% 'displayName',displayname, 'screenNumber', 2, ...
% 'screenWidth', 1280, 'screenHeight', 960, 'displayDistance', 231,...
% 'displaySize',[83 3*83/4], 'framesPerSecond', 60, 'autoCloseScreen', 1, ...
% 'saveData', 1, 'calibType', 1, 'monitorGamma', defaultMonitorGamma, 'calibFilename',[], ...
% 'flipHV', flipHV, 'digin',[], 'hideCursor', 1, 'displayPos', [], 'backtickChar', '5');
end

% and init myscreen
myscreen = initScreen(myscreen);

% fix keys for our scanner setup.
myscreen.keyboard.backtick = mglCharToKeycode({'5'}); % that's the backtick
% myscreen.keyboard.backtick = mglCharToKeycode({'5'}); % that's the backtick
myscreen.keyboard.nums = mglCharToKeycode({'1' '2' '3' '4' '6' '7' '8' '9' '0'});

% set the first task to be the fixation staircase task
Expand Down Expand Up @@ -132,7 +142,7 @@
myscreen = initStimulus('stimulus',myscreen);
% load in images and prep textures
stimulus = initFaces(stimulus,myscreen);
stimulus.displayWidth = 10; % decide how WIDE the stimuli should be
stimulus.displayWidth = 18; % WAS 10!! decide how WIDE the stimuli should be

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% run the eye calibration
Expand Down Expand Up @@ -249,12 +259,14 @@
MAX_IMAGES_TO_LOAD = 50;

% stim directories are hard-coded. Could do better here.
imdir{1} = './stims/multiracial/frontal/';
files{1} = dir([imdir{1} '*.jpg']);
% imdir{1} = './stims/multiracial/frontal/';
imdir{1} = './scene_localiser/images/';
files{1} = dir([imdir{1} 'face_*.png']);
nFiles{1} = min(MAX_IMAGES_TO_LOAD, length(files{1}));

imdir{2} = './stims/objects/';
files{2} = dir([imdir{2} '*.jpg']);
% imdir{2} = './stims/objects/';
imdir{2} ='./scene_localiser/images/';
files{2} = dir([imdir{2} 'object*.png']);
nFiles{2} = min(MAX_IMAGES_TO_LOAD, length(files{2}));

% imdir{3} = './stims/houses/';
Expand All @@ -274,7 +286,7 @@
im2 = reshape(im, imdims(1).*imdims(2), []); % x*y, RGBA
im2(:,4) = 255.0; % add transparency layer and also makes it FLOAT!!

WHITE_CUTOFF = 200;
WHITE_CUTOFF = 254;
GRAY_VAL = 127;

% place on textured noise?
Expand Down
Loading

0 comments on commit 990e12f

Please sign in to comment.