Table of Contents

Attaching a protocol to a VTC

Motivation

BrainVoyager QX uses the name of a “linked protocol file” from the VTC header for quite a few built-in functions (e.g. when visualizing the conditions as colored background patches from the protocol information when displaying time courses).

For several reasons, it can be desirable to use different versions of the protocol (e.g. with conditions split or collapsed across one within-subjects factor of the study design, or using slightly shifted onsets in a deconvolution design to capture potential anticipation effects), and linking those protocol files in BrainVoyager can be relatively cumbersome.

Requirements

To fully use the scriptability of this feature, your data files must be arranged in a specific way:

Script

Here is a template script that will look for VTC and PRT files in subject folders according to a pattern. The script will then load each VTC file in turn, link the corresponding found PRT file and then store the VTC back to disk.

vtc_link_protocols.m
% pre-set variables
% - studyfolder: folder where the (subject) sub-folders are located
% - vtcfpattern: VTC filename pattern
% - prtfpattern: PRT filename pattern (this needs to be altered to link
%   different protocols!)
studyfolder = '/Volumes/hms_study/Imaging';
vtcfpattern = '*_run*MNI.vtc';
prtfpattern = '*_run*_hmcollapsed.prt';
 
% find folders in the study folder
subfolders = findfiles(studyfolder, '*', 'dirs=1', 'depth=1');
nsf = numel(subfolders);
 
% create a cell array for VTC and PRT filenames
vtcfiles = cell(nsf, 1);
prtfiles = cell(nsf, 1);
 
% first pass: lookup files
for fc = 1:nsf
 
    % look for VTC and PRT files
    vtcfiles{fc} = findfiles(subfolders{fc}, vtcfpattern);
    prtfiles{fc} = findfiles(subfolders{fc}, prtfpattern);
 
    % ensure that the number is the same
    if numel(vtcfiles{fc}) ~= numel(prtfiles{fc})
        error('Number of found files mismatch.');
    end
end
 
% as we are sure that the number of files is correct for each subject
% we can simply create two large arrays with filenames
vtcfiles = cat(1, vtcfiles{:});
prtfiles = cat(1, prtfiles{:});
 
% NOTE: AT THIS PLACE, IT IS POSSIBLE TO ADD CODE TO EITHER
% - CHECK THE INTEGRITY OF FILES
% - PERFORM SOME PROCESS WITH THE PRT CONTENT AND RE-SAVE
% - ALTER THE VTC DATA AND RE-SAVE
% - etc...
 
% iterate over found files
for fc = 1:numel(vtcfiles)
 
    % load VTC file
    vtc = xff(vtcfiles{fc});
 
    % link protocol
    vtc.NrOfLinkedPRTs = 1;
    vtc.NameOfLinkedPRT = prtfiles{fc};
 
    % save and clear VTC
    vtc.Save;
    vtc.ClearObject;
end

Notes

The code makes some additional assumptions:

Naturally, it would be possible to ascertain these assumptions, but it might be more efficient (in particular with the second condition) to use a separate script that creates and/or validates the protocol files.