[Eeglablist] converting .set data back to .cnt or .eeg neuroscan data file

Yang, Qi yangq at ccf.org
Tue Jan 25 09:12:31 PST 2005


	Hi, 

	I think this topic has been touched before.
	I want to convert the eeglab .set data into .cnt or .eeg neuroscan 
	file for further analysis in other software. 
	There are some codes uploaded before (as following) . 
	But it seems not work? 

	The input 'dataset' is the CNT-dataset you 
	already have or a blank structure?
	This works for converting to .eeg data?

	Anybody has implemented those code? 
	or anybody has any other good suggestions? 
	  

	Thank you very much! 

	Regards, 

	qi yang 




% writecnt() - Write a Neuroscan continuous signal file.
%
% Usage:
%   >> writecnt(filename, CNT-dataset, varargin) 
%
% Inputs:
%   filename - name of the file with extension
%   dataset -  name of the CNT-dataset, a structure with the following fields
%                   cntdataset.header
%                   cntdataset.electloc
%                   cntdataset.data
%                   cntdataset.Teeg
%                   cntdataset.event
%                   cntdataset.tag
%                   cntdataset.endtag
%
% Optional inputs:
%  't1'         - start at time t1, default 0
%  'sample1'    - start at sample1, default 0, overrides t1
%  'lddur'      - duration of segment to load, default = whole file
%  'ldnsamples' - number of samples to load, default = whole file, 
%                 overrides lddur
%  'scale'      - ['on'|'off'] scale data to microvolt (default:'on')
%  'dataformat' - ['int16'|'int32'] default is 'int16' for 16-bit data.
%                 Use 'int32' for 32-bit data.
%
% Outputs:
%  file         - file containing NeuroScan CNT file with the continuous
%                 data and other information
%
% Authors:   Sean Fitzgibbon, Arnaud Delorme, Michiel Vestjens 2000-2004
%
% Known limitations: 
%  For more see http://www.cnl.salk.edu/~arno/cntload/index.html    

%123456789012345678901234567890123456789012345678901234567890123456789012

% Copyright (C) 2000 Sean Fitzgibbon, <psspf at id.psy.flinders.edu.au>
% Copyright (C) 2003 Arnaud Delorme, Salk Institute, arno at salk.edu
%
% This program is free software; you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation; either version 2 of the License, or
% (at your option) any later version.
%
% This program is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with this program; if not, write to the Free Software
% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

function f = writecnt(filename,cntdataset,varargin)

if ~isempty(varargin)
	 WriteOptions=struct(varargin{:});
else WriteOptions = []; 
end;

try, WriteOptions.t1;         catch, WriteOptions.t1=0; end
try, WriteOptions.sample1;    catch, WriteOptions.sample1=[]; end
try, WriteOptions.lddur;      catch, WriteOptions.lddur=[]; end
try, WriteOptions.ldnsamples; catch, WriteOptions.ldnsamples=[]; end
try, WriteOptions.scale;      catch, WriteOptions.scale='on'; end
try, WriteOptions.dataformat;  catch, WriteOptions.dataformat='int16'; end

sizeEvent1 = 8  ; %%% 8  bytes for Event1  
sizeEvent2 = 19 ; %%% 19 bytes for Event2 

type='cnt';
if nargin ==1 
    scan=0;
end     

h   = cntdataset.header;
e   = cntdataset.electloc;
dat = cntdataset.data;
eT  = cntdataset.Teeg;
ev2 = cntdataset.event;
t   = cntdataset.tag;
endtag=cntdataset.endtag;


fid = fopen(filename,'w');
disp(['Writing file ' filename ' ...'])

% HEADER : 900 bytes => Starts at 0h, finishes with 383h.

fwrite(fid,h.rev,'char');
fwrite(fid,h.nextfile,'long');
fwrite(fid,h.prevfile,'long');
fwrite(fid,h.type,'char');
fwrite(fid,h.id,'char');
fwrite(fid,h.oper,'char');
fwrite(fid,h.doctor,'char');
fwrite(fid,h.referral,'char');
fwrite(fid,h.hospital,'char');
fwrite(fid,h.patient,'char');
fwrite(fid,h.age,'short');
fwrite(fid,h.sex,'char');
fwrite(fid,h.hand,'char');
fwrite(fid,h.med,'char');
fwrite(fid,h.category,'char');
fwrite(fid,h.state,'char');
fwrite(fid,h.label,'char');
fwrite(fid,h.date,'char');
fwrite(fid,h.time,'char');
fwrite(fid,h.mean_age,'float');
fwrite(fid,h.stdev,'float');
fwrite(fid,h.n,'short');
fwrite(fid,h.compfile,'char');
fwrite(fid,h.spectwincomp,'float');
fwrite(fid,h.meanaccuracy,'float');
fwrite(fid,h.meanlatency,'float');
fwrite(fid,h.sortfile,'char');
fwrite(fid,h.numevents,'int');
fwrite(fid,h.compoper,'char');
fwrite(fid,h.avgmode,'char');
fwrite(fid,h.review,'char');
fwrite(fid,h.nsweeps,'ushort');
fwrite(fid,h.compsweeps,'ushort');
fwrite(fid,h.acceptcnt,'ushort');
fwrite(fid,h.rejectcnt,'ushort');
fwrite(fid,h.pnts,'ushort');
fwrite(fid,h.nchannels,'ushort');
fwrite(fid,h.avgupdate,'ushort');
fwrite(fid,h.domain,'char');
fwrite(fid,h.variance,'char');
fwrite(fid,h.rate,'ushort');
fwrite(fid,h.scale,'double');
fwrite(fid,h.veogcorrect,'char');
fwrite(fid,h.heogcorrect,'char');
fwrite(fid,h.aux1correct,'char');
fwrite(fid,h.aux2correct,'char');
fwrite(fid,h.veogtrig,'float');
fwrite(fid,h.heogtrig,'float');
fwrite(fid,h.aux1trig,'float');
fwrite(fid,h.aux2trig,'float');
fwrite(fid,h.heogchnl,'short');
fwrite(fid,h.veogchnl,'short');
fwrite(fid,h.aux1chnl,'short');
fwrite(fid,h.aux2chnl,'short');
fwrite(fid,h.veogdir,'char');
fwrite(fid,h.heogdir,'char');
fwrite(fid,h.aux1dir,'char');
fwrite(fid,h.aux2dir,'char');
fwrite(fid,h.veog_n,'short');
fwrite(fid,h.heog_n,'short');
fwrite(fid,h.aux1_n,'short');
fwrite(fid,h.aux2_n,'short');
fwrite(fid,h.veogmaxcnt,'short');
fwrite(fid,h.heogmaxcnt,'short');
fwrite(fid,h.aux1maxcnt,'short');
fwrite(fid,h.aux2maxcnt,'short');
fwrite(fid,h.veogmethod,'char');
fwrite(fid,h.heogmethod,'char');
fwrite(fid,h.aux1method,'char');
fwrite(fid,h.aux2method,'char');
fwrite(fid,h.ampsensitivity,'float');
fwrite(fid,h.lowpass,'char');
fwrite(fid,h.highpass,'char');
fwrite(fid,h.notch,'char');
fwrite(fid,h.autoclipadd,'char');
fwrite(fid,h.baseline,'char');
fwrite(fid,h.offstart,'float');
fwrite(fid,h.offstop,'float');
fwrite(fid,h.reject,'char');
fwrite(fid,h.rejstart,'float');
fwrite(fid,h.rejstop,'float');
fwrite(fid,h.rejmin,'float');
fwrite(fid,h.rejmax,'float');
fwrite(fid,h.trigtype,'char');
fwrite(fid,h.trigval,'float');
fwrite(fid,h.trigchnl,'char');
fwrite(fid,h.trigmask,'short');
fwrite(fid,h.trigisi,'float');
fwrite(fid,h.trigmin,'float');
fwrite(fid,h.trigmax,'float');
fwrite(fid,h.trigdir,'char');
fwrite(fid,h.autoscale,'char');
fwrite(fid,h.n2,'short');
fwrite(fid,h.dir,'char');
fwrite(fid,h.dispmin,'float');
fwrite(fid,h.dispmax,'float');
fwrite(fid,h.xmin,'float');
fwrite(fid,h.xmax,'float');
fwrite(fid,h.automin,'float');
fwrite(fid,h.automax,'float');
fwrite(fid,h.zmin,'float');
fwrite(fid,h.zmax,'float');
fwrite(fid,h.lowcut,'float');
fwrite(fid,h.highcut,'float');
fwrite(fid,h.common,'char');
fwrite(fid,h.savemode,'char');
fwrite(fid,h.manmode,'char');
fwrite(fid,h.ref,'char');
fwrite(fid,h.rectify,'char');
fwrite(fid,h.displayxmin,'float');
fwrite(fid,h.displayxmax,'float');
fwrite(fid,h.phase,'char');
fwrite(fid,h.screen,'char');
fwrite(fid,h.calmode,'short');
fwrite(fid,h.calmethod,'short');
fwrite(fid,h.calupdate,'short');
fwrite(fid,h.calbaseline,'short');
fwrite(fid,h.calsweeps,'short');
fwrite(fid,h.calattenuator,'float');
fwrite(fid,h.calpulsevolt,'float');
fwrite(fid,h.calpulsestart,'float');
fwrite(fid,h.calpulsestop,'float');
fwrite(fid,h.calfreq,'float');
fwrite(fid,h.taskfile,'char');
fwrite(fid,h.seqfile,'char');
fwrite(fid,h.spectmethod,'char');
fwrite(fid,h.spectscaling,'char');
fwrite(fid,h.spectwindow,'char');
fwrite(fid,h.spectwinlength,'float');
fwrite(fid,h.spectorder,'char');
fwrite(fid,h.notchfilter,'char');
fwrite(fid,h.headgain,'short');
fwrite(fid,h.additionalfiles,'int');
fwrite(fid,h.unused,'char');
fwrite(fid,h.fspstopmethod,'short');
fwrite(fid,h.fspstopmode,'short');
fwrite(fid,h.fspfvalue,'float');
fwrite(fid,h.fsppoint,'short');
fwrite(fid,h.fspblocksize,'short');
fwrite(fid,h.fspp1,'ushort');
fwrite(fid,h.fspp2,'ushort');
fwrite(fid,h.fspalpha,'float');
fwrite(fid,h.fspnoise,'float');
fwrite(fid,h.fspv1,'short');
fwrite(fid,h.montage,'char');
fwrite(fid,h.eventfile,'char');
fwrite(fid,h.fratio,'float');
fwrite(fid,h.minor_rev,'char');
fwrite(fid,h.eegupdate,'short');
fwrite(fid,h.compressed,'char');
fwrite(fid,h.xscale,'float');
fwrite(fid,h.yscale,'float');
fwrite(fid,h.xsize,'float');
fwrite(fid,h.ysize,'float');
fwrite(fid,h.acmode,'char');
fwrite(fid,h.commonchnl,'uchar');
fwrite(fid,h.xtics,'char');
fwrite(fid,h.xrange,'char');
fwrite(fid,h.ytics,'char');
fwrite(fid,h.yrange,'char');
fwrite(fid,h.xscalevalue,'float');
fwrite(fid,h.xscaleinterval,'float');
fwrite(fid,h.yscalevalue,'float');
fwrite(fid,h.yscaleinterval,'float');
fwrite(fid,h.scaletoolx1,'float');
fwrite(fid,h.scaletooly1,'float');
fwrite(fid,h.scaletoolx2,'float');
fwrite(fid,h.scaletooly2,'float');
fwrite(fid,h.port,'short');
fwrite(fid,h.numsamples,'ulong');
fwrite(fid,h.filterflag,'char');
fwrite(fid,h.lowcutoff,'float');
fwrite(fid,h.lowpoles,'short');
fwrite(fid,h.highcutoff,'float');
fwrite(fid,h.highpoles,'short');
fwrite(fid,h.filtertype,'char');
fwrite(fid,h.filterdomain,'char');
fwrite(fid,h.snrflag,'char');
fwrite(fid,h.coherenceflag,'char');
fwrite(fid,h.continuoustype,'char');
fwrite(fid,h.eventtablepos,'long');
fwrite(fid,h.continuousseconds,'float');
fwrite(fid,h.channeloffset,'long');
fwrite(fid,h.autocorrectflag,'char');
fwrite(fid,h.dcthreshold,'uchar');  % = 383H

% ELECT.DESCRIPTIONS : 75*n.channels bytes.
% Starts with 384h, finishes with (899+75*nchannels)dec
% 10 channels: 671h   % 12 channels: 707h
% 24 channels: A8Bh   % 32 channels: CE3h
% 64 channels: 1643h  % 128 channels: 2903h

for n = 1:h.nchannels
    fwrite(fid,e(n).lab,'char');
    fwrite(fid,e(n).reference,'char');
    fwrite(fid,e(n).skip,'char');
    fwrite(fid,e(n).reject,'char');
    fwrite(fid,e(n).display,'char');
    fwrite(fid,e(n).bad,'char');
    fwrite(fid,e(n).n,'ushort');
    fwrite(fid,e(n).avg_reference,'char');
    fwrite(fid,e(n).clipadd,'char');
    fwrite(fid,e(n).x_coord,'float');
    fwrite(fid,e(n).y_coord,'float');
    fwrite(fid,e(n).veog_wt,'float');
    fwrite(fid,e(n).veog_std,'float');
    fwrite(fid,e(n).snr,'float');
    fwrite(fid,e(n).heog_wt,'float');
    fwrite(fid,e(n).heog_std,'float');
    fwrite(fid,e(n).baseline,'short');
    fwrite(fid,e(n).filtered,'char');
    fwrite(fid,e(n).fsp,'char');
    fwrite(fid,e(n).aux1_wt,'float');
    fwrite(fid,e(n).aux1_std,'float');
    fwrite(fid,e(n).senstivity,'float');
    fwrite(fid,e(n).gain,'char');
    fwrite(fid,e(n).hipass,'char');
    fwrite(fid,e(n).lopass,'char');
    fwrite(fid,e(n).page,'uchar');
    fwrite(fid,e(n).size,'uchar');
    fwrite(fid,e(n).impedance,'uchar');
    fwrite(fid,e(n).physicalchnl,'uchar');
    fwrite(fid,e(n).rectify,'char');
    fwrite(fid,e(n).calib,'float');
end

% finding if 32-bits of 16-bits file
% ----------------------------------
begdata = ftell(fid);
enddata = h.eventtablepos;   % after data
if strcmpi(WriteOptions.dataformat, 'int16')
     nums    = (enddata-begdata)/h.nchannels/2;
else nums    = (enddata-begdata)/h.nchannels/4;
end;

% number of sample to write
% -------------------------
if ~isempty(WriteOptions.sample1)
   WriteOptions.t1      = WriteOptions.sample1/h.rate;
else 
   WriteOptions.sample1 = WriteOptions.t1*h.rate;
end;
if strcmpi(WriteOptions.dataformat, 'int16')
     startpos = WriteOptions.t1*h.rate*2*h.nchannels;
else startpos = WriteOptions.t1*h.rate*4*h.nchannels;
end;
if isempty(WriteOptions.ldnsamples)
     if ~isempty(WriteOptions.lddur)
          WriteOptions.ldnsamples = round(WriteOptions.lddur*h.rate); 
     else WriteOptions.ldnsamples = nums; 
     end;
end;

% scaling data from microvolts
% ----------------------------
if strcmpi(WriteOptions.scale, 'on')
    disp('Scaling data .....')
    for i=1:h.nchannels
       bas=e(i).baseline;
       sen=e(i).senstivity;
       cal=e(i).calib;
       mf=sen*(cal/204.8);
       dat(i,:)=(dat(i,:)/mf)+bas;
   end
end


% write data
% ----------
disp('Writing data .....')
if type == 'cnt' 
    channel_off = h.channeloffset/2;
  
      fseek(fid, startpos, 0);
	  if channel_off <= 1
          for temploop =1:WriteOptions.ldnsamples;
              fwrite(fid, dat(1:h.nchannels, temploop), WriteOptions.dataformat)';
          end;
 	  else
          for temploop =1:h.nchannels;
              fwrite(fid, dat(temploop, 1:channel_off), WriteOptions.dataformat)';
          end;
          
		  counter = 1;	
 		  while counter*channel_off < WriteOptions.ldnsamples

              for temploop =1:h.nchannels;
                fwrite(fid, dat(temploop, counter*channel_off+1:counter*channel_off+channel_off), WriteOptions.dataformat)';
              end;
              counter = counter + 1;
		  end;
	  end;	
      
      % write event table
      % -----------------
      frewind(fid);
      fseek(fid,h.eventtablepos,'bof');

      disp('Writing Event Table...')
      fwrite(fid,eT.teeg,'uchar');
      fwrite(fid,eT.size,'ulong');
      fwrite(fid,eT.offset,'ulong');

      if eT.teeg==2
          nevents=eT.size/sizeEvent2;
      elseif eT.teeg==1
          nevents=eT.size/sizeEvent1;
      else
          disp('No !!! teeg <> 2 and teeg <> 1');
          ev2 = [];
      end     
  
     %%%% to change offset in points back to bytes 
     if ~isempty(ev2)
          ev2p=ev2; 
          ioff=900+(h.nchannels*75); %% initial offset : header + electordes desc 
          for i=1:nevents 
              ev2p(i).offset=((ev2p(i).offset + WriteOptions.sample1)*2*h.nchannels) +ioff; %% 2 short int end 
          end     
          ev2 = ev2p;
     end;

     if eT.teeg==2
          nevents=eT.size/sizeEvent2;
          for i=1:nevents
              ev2(i).stimtype      = fwrite(fid,ev2(i).stimtype,'ushort');
              ev2(i).keyboard      = fwrite(fid,ev2(i).keyboard,'char');
              ev2(i).keypad_accept = fwrite(fid,ev2(i).keypad_accept,'char');
              ev2(i).offset        = fwrite(fid,ev2(i).offset,'long');
              ev2(i).type          = fwrite(fid,ev2(i).type,'short'); 
              ev2(i).code          = fwrite(fid,ev2(i).code,'short');
              ev2(i).latency       = fwrite(fid,ev2(i).latency,'float');
              ev2(i).epochevent    = fwrite(fid,ev2(i).epochevent,'char');
              ev2(i).accept        = fwrite(fid,ev2(i).accept,'char');
              ev2(i).accuracy      = fwrite(fid,ev2(i).accuracy,'char');
          end     
      elseif eT.teeg==1
          nevents=eT.size/sizeEvent1;
          for i=1:nevents
              ev2(i).stimtype      = fwrite(fid,ev2(i).stimtype,'ushort');
              ev2(i).keyboard      = fwrite(fid,ev2(i).keyboard,'char');
              ev2(i).keypad_accept = fwrite(fid,ev2(i).keypad_accept,'char');
              ev2(i).offset        = fwrite(fid,ev2(i).offset,'long');
          end;
      else
          disp('No !!! teeg <> 2 and teeg <> 1');
          ev2 = [];
      end     
end 

if size(endtag,1)>1
    fwrite(fid,endtag);
else
    fwrite(fid,t,'char');
end

fclose(fid);
disp(['Finished writing file ' filename ' ...'])





------------------------------------------------------------------------------
Confidentiality Note:  This message is intended for use only by the individual or entity to which it is addressed and may contain information that is privileged, confidential, and exempt from disclosure under applicable law.  If the reader of this message is not the intended recipient or the employee or agent responsible for delivering the message to the intended recipient, you are hereby notified that any dissemination, distribution or copying of this communication is strictly prohibited.  If you have received this communication in error,  please contact the sender immediately and destroy the material in its entirety, whether electronic or hard copy.  Thank you.
------------
Visit us online at our award-winning www.clevelandclinic.org for a complete listing of Cleveland Clinic services, staff and locations from one of the country's leading hospitals.
==============================================================================
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://sccn.ucsd.edu/pipermail/eeglablist/attachments/20050125/e87dfaa1/attachment.html>


More information about the eeglablist mailing list