https://github.com/Rieke-Lab/turner-package
Raw File
Tip revision: e09ed136af28ceea83df29d84b6cf661d7361fb3 authored by Julian Freedland on 22 December 2020, 18:50:40 UTC
rig F
Tip revision: e09ed13
readLineScanDataFiles_riekeLab.m
function [header, pmtData, scannerPosData, roiGroup] = readLineScanDataFiles_riekeLab(fileName, optionalMetaFileName)
    %MHT mod from scanimage utility
    
    fileNameStem = fileName;  
    if nargin < 2
        metaFileName = [fileName '.meta.txt'];
    else
        metaFileName = [optionalMetaFileName, '.meta.txt'];
    end


    % read metadata
    try
        fid = fopen(metaFileName,'rt');
        assert(fid > 0, 'Failed to open metadata file.');
        headerStr = fread(fid,'*char')';
        fclose(fid);
    catch %metadata only produced for first file in a loop
        tempInd = strfind(fileName,'_');
        cellID = fileName(1:tempInd-1);
        targetFileNumber = str2num(fileName(end-4:end));
        
        availableMetaFiles = dir([cellID,'*.meta.txt']);
        metaFileInd = 0;
        for aa = 1:length(availableMetaFiles)
            newName = availableMetaFiles(aa).name;
            tempInd = strfind(newName,'_');
            fileNumber = str2num(newName(tempInd+1:tempInd+5));
            if fileNumber > targetFileNumber
                continue
            else %use most recent meta file
                metaFileInd = aa;
            end
        end
        try
        fileStr = [availableMetaFiles(metaFileInd).folder,'/' ...
            availableMetaFiles(metaFileInd).name];
        catch
        fileStr = availableMetaFiles(metaFileInd).name; 
        end
        fid = fopen(fileStr,'rt');
        assert(fid > 0, 'Failed to open metadata file.');
        headerStr = fread(fid,'*char')';
        fclose(fid);
    end
    
    % parse metadata
    if headerStr(1) == '{'
        data = most.json.loadjson(headerStr);
        header = data{1};
        rgData = data{2};
    else
        rows = textscan(headerStr,'%s','Delimiter','\n');
        rows = rows{1};
        
        rgDataStartLine = find(cellfun(@(x)strncmp(x,'{',1),rows),1);
        header = scanimage.util.private.decodeHeaderLines(rows(1:rgDataStartLine-1));
        
        rgStr = strcat(rows{rgDataStartLine:end});
        rgData = most.json.loadjson(rgStr);
    end
    roiGroup = scanimage.mroi.RoiGroup.loadobj(rgData.RoiGroups.imagingRoiGroup);
    
    % read and parse pmt data
    header.acqChannels = header.SI.hChannels.channelSave;
    nChannels = numel(header.acqChannels);
    fid = fopen([fileNameStem '.pmt.dat']);
    assert(fid > 0, 'Failed to open pmt data file.');
    pmtData = fread(fid,inf,'int16');
    fclose(fid);
    
    % add useful info to header struct
    header.sampleRate = header.SI.hScan2D.sampleRate;
    header.numSamples = size(pmtData,1)/nChannels;
    header.acqDuration = header.numSamples / header.sampleRate;
    header.samplesPerFrame = header.SI.hScan2D.lineScanSamplesPerFrame;
    header.frameDuration = header.samplesPerFrame / header.sampleRate;
    header.numFrames = ceil(header.numSamples / header.samplesPerFrame);
    N = header.samplesPerFrame * header.numFrames * nChannels;
    pmtData(end+1:N,:) = nan;
    pmtData = permute(reshape(pmtData,nChannels,header.samplesPerFrame,[]),[2 1 3]);
    
    % read and parse scanner position data
    fid = fopen([fileNameStem '.scnnr.dat']);
    if fid > 0
        dat = fread(fid,inf,'single');
        fclose(fid);
        
        nScnnrs = header.SI.hScan2D.lineScanNumFdbkChannels;
        header.feedbackSamplesPerFrame = header.SI.hScan2D.lineScanFdbkSamplesPerFrame;
        header.feedbackSampleRate = header.SI.hScan2D.sampleRateFdbk;
        header.numFeedbackSamples = size(dat,1)/nScnnrs;
        header.numFeedbackFrames = ceil(header.numFeedbackSamples / header.feedbackSamplesPerFrame);
        
        % pad data if last frame was partial
        N = header.feedbackSamplesPerFrame * header.numFeedbackFrames * nScnnrs;
        dat(end+1:N,:) = nan;
        
        dat = permute(reshape(dat,nScnnrs,header.feedbackSamplesPerFrame,[]),[2 1 3]);
        scannerPosData.G = dat(:,1:2,:);
        if nScnnrs > 2
            scannerPosData.Z = dat(:,3,:);
        end
    else
        scannerPosData = [];
    end
end

%--------------------------------------------------------------------------%
% readLineScanDataFiles.m                                                  %
% Copyright © 2016 Vidrio Technologies, LLC                                %
%                                                                          %
% ScanImage 2016 is premium software to be used under the purchased terms  %
% Code may be modified, but not redistributed without the permission       %
% of Vidrio Technologies, LLC                                              %
%--------------------------------------------------------------------------%
back to top