[FieldTrip] re-referencing using neuralynx.csc channels

Schoffelen, J.M. (Jan Mathijs) janmathijs.schoffelen at donders.ru.nl
Wed Apr 26 07:36:12 CEST 2023


Hi Peter,

Re-referencing can only be done once the channel that will be used as a reference has been read into the matlab workspace. You will need one round of ft_preprocessing for that. It is not a necessary prerequisite to specify the rereferencing upon the first call to ft_preprocessing. In your use case, you need to read in the data in a for loop, because of the particular way in which your data is represented (i.e. one channel per file). ft_preprocessing can then be applied to the ‘appended’ data, with the reference channel of choice (which in your case will be ‘CSC84’ (without the .ncs I think).

Good luck,

Jan-Mathijs


On 25 Apr 2023, at 23:06, Peter Kaskan via fieldtrip <fieldtrip at science.ru.nl<mailto:fieldtrip at science.ru.nl>> wrote:

Thanks for your help Jan-Matijs,

I implemented your corrected loop and I am now reading in multiple .csc channels using
      alldata = ft_appenddata([], data{:});

I think I read somewhere that one should define re-referencing before running ft_preprocessing. However, ft_preprocessing occurs within this loop:

for k = 1:numel(channellist)
cfg.dataset = sprintf('%s.ncs',channellist{k});
data{k} = ft_preprocessing(cfg);
end

It seems like I should insert this in the loop (above, before ft_preprocessing), because I want to use channel 84 as a reference for each channel.
cfg.reref = 'yes';
cfg.refchannel = 'CSC84.ncs';

But this construction throws errors:
Error using preproc (line 279)
reference channel was not found

Error in ft_preprocessing (line 599)
      [cutdat{i}, label, time{i}, cfg] = preproc(dat, hdr.label(rawindx),
      tim, cfg, begpadding, endpadding);

Any guidance you can provide?

Thank you!



------------------------------

Message: 2
Date: Tue, 11 Apr 2023 20:30:18 +0000
From: Peter Kaskan <peter.kaskan at einsteinmed.edu<mailto:peter.kaskan at einsteinmed.edu>>
To: "fieldtrip at science.ru.nl<mailto:fieldtrip at science.ru.nl>" <fieldtrip at science.ru.nl<mailto:fieldtrip at science.ru.nl>>
Subject: Re: [FieldTrip] fieldtrip Digest, Vol 148, Issue 24

Hello Jan-Mathijs,

Thanks for the reply; I was traveling and just got back to this...

In my initial, very rudimentary preprocessing script, cfg.dataset will take a single neuralynx file:

      cfg.dataset = 'CSC4.ncs';
            cfg.continuous = 'yes';
            highpass, lowlass, demean, detrend etc..
            filtContData = ft_preprocessing(cfg);

But the question was how to reference one channel with another.

I have been trying to implement your channellist and appenddata suggestion as you describe (below) using channellist = {'CSC1.ncs'; 'CSC2.ncs'; 'CSC3.ncs'} and the subsequent data loop.

However, my initial attempt left some errors related to
Error using ft_checkconfig (line 163)
The field cfg.datafile is required
The field cfg.headerfile is required

Error in ft_preprocessing (line 385)
      cfg = ft_checkconfig(cfg, 'required',   {'headerfile', 'datafile'});
After digging a little further in ft_preprocessing lines 446-447

% translate the channel groups (like 'all' and 'MEG') into real labels

  cfg.channel = ft_channelselection(cfg.channel, hdr);

  assert(~isempty(cfg.channel), 'the selection of channels is empty');

... we rescued the error by resetting

cfg.channel = CSC1.ncs;

Do you know what is happening? If we use: channellist = {'CSC1.ncs'; 'CSC2.ncs'; 'CSC3.ncs'}

does the cfg.datafile and cfg.headerfile need to be defined some other way?


Thanks, Peter



________________________________
From: fieldtrip <fieldtrip-bounces at science.ru.nl<mailto:fieldtrip-bounces at science.ru.nl>> on behalf of fieldtrip-request at science.ru.nl<mailto:fieldtrip-request at science.ru.nl> <fieldtrip-request at science.ru.nl<mailto:fieldtrip-request at science.ru.nl>>
Sent: Monday, March 27, 2023 6:00 AM

Hi Peter,

ft_read_data is a so-called ‘intermediate’ level fieldtrip function and not typically called directly by the casual user.

I think your use case calls for the following strategy:

channellist = {‘channel1’;’channel2’;…’channelN’};
for k = 1:numel(channellist)
   cfg.channel = channellist{k}; % or something equivalent, at least instructing the reading function to grab a channel specific file
   data{k} = ft_preprocessing(cfg);
end

alldata = ft_appenddata([], data{:});

Once you have the alldata object, you can apply re-referencing. Perhaps indeed this is best done by creating a ‘montage’, and apply it to the data.

Best wishes,

Jan-Mathijs



On 23 Mar 2023, at 22:12, Peter Kaskan via fieldtrip <fieldtrip at science.ru.nl<mailto:fieldtrip at science.ru.nl><mailto:fieldtrip at science.ru.nl>> wrote:

Hello,

I am writing a ft_preprocessing script; I can give it channel1.csc and proceed with filtering, defining trials etc.

...but, how do I re-reference to another channel?

Is there a way to use ft_read_data to create a structure with all channels, and then tell it what channel I want to use as a reference?

Or do I need to create a montage, and how do I do that with n #s of separate neuralynx.csc channels?



Thanks - Peter


------------------------------

Message: 3
Date: Wed, 12 Apr 2023 06:30:21 +0000
From: "Schoffelen, J.M. (Jan Mathijs)"
        <janmathijs.schoffelen at donders.ru.nl<mailto:janmathijs.schoffelen at donders.ru.nl>>

Hi Peter,

Apologies, I was a bit sloppy in my earlier code snippet. I think it should have read something like this

channellist = {‘channel1’;’channel2’;…’channelN’};

cfg = [];
cfg.<someoptionsfor filtering etc>
for k = 1:numel(channellist)
   %% NOT THIS: cfg.channel = channellist{k}; % or something equivalent, at least instructing the reading function to grab a channel specific file
   cfg.dataset = sprintf(‘%s.ncs’,channellist{k});
   data{k} = ft_preprocessing(cfg);
end

If each channel is represented as a single file, ft_preprocessing needs to be instructed in each iteration of the loop with a fresh cfg.dataset
Once you have ‘appended’ the channels through ft_appenddata (note that this requires each of the channels' data structures to have the same number of samples) , you should be able to re-reference.

I hope that this helps to get you on your way.

Good luck,
Jan-Mathijs
_______________________________________________
fieldtrip mailing list
https://mailman.science.ru.nl/mailman/listinfo/fieldtrip
https://urldefense.com/v3/__https://doi.org/10.1371/journal.pcbi.1002202__;!!HJOPV4FYYWzcc1jazlU!8VkSVyWbeCmfBJiAtBB12ouWee--iAf4--1ZgohZyMP23AdtlAZbqHCY_eLiftS64yKk9nEy1Yt01h28F4J2m9v3ZwcSO0LI7wq-DQ$

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.science.ru.nl/pipermail/fieldtrip/attachments/20230426/e5445867/attachment.htm>


More information about the fieldtrip mailing list