Automazione funzioni su celle

di il
1 risposte

Automazione funzioni su celle

Buongiorno a tutti,
sono ancora alle prese con l'automazione delle funzioni e visto che mi sono inceppata, provo a chiedere aiuto.
Sto usando MATLAB per i miei esperimenti di elettrofisiologia dove registro attività neuronale, indotta da stimoli, tramite 16 canali di registrazione.
Il mio capo mi ha fornito il seguente script che permette di caricare i dati della piattaforma di registrazione. Il suo script permette di calcolare la variabile "Spikes" che è composta da 16 celle, una per ogni canale. In ogni cella c'è riportato il tempo in cui si verifica un evento di spike registrato.
%% Add your path to Matlab
path(path,'C:\Users\daian\Desktop\24aprile2020\2020-03-31_08-10-02-20200424T130037Z-001')

%% Select your folder
selpath = uigetdir;
cd(selpath)
Events=importdata('all_channels.events');

% Get sampling rate
Fs=Events{8};
Fs=strsplit(Fs,'header.sampleRate = '); Fs=Fs{2};
Fs=strsplit(Fs,';'); Fs=Fs{1};
Fs=str2double(Fs);

%% Read LFPs

% Number of ADC and electrode channels
N_ADC=10;
N_CH=16;

% Find continuous files
Files_tmp=dir;
Files=strings(1); m=1;
for n=1:length(Files_tmp)
    F=Files_tmp(n);
    if strfind(F.name,'continuous')>0
        Files(m,1)=F.name;
        k1=strfind(F.name,'_'); k2=strfind(F.name,'.continuous');
        Files(m,2)=F.name(k1+1:k2-1);
        m=m+1;
    end
end

% Load and sort continuous data
X=load_open_ephys_data(char(Files(1,1)));
N=length(X); clear X;
ADC=zeros(N_ADC,N); CH=zeros(N_CH,N);
for n=1:N_ADC+N_CH
    F=Files(n,1); Type=char(Files(n,2));
    if sum(Type(1:3)=='ADC')==3
        n_adc=str2num(Type(4:length(Type)));
        ADC(n_adc+1,:)=load_open_ephys_data(char(F));
    end
    if sum(Type(1:2)=='CH')==2
        n_ch=str2num(Type(3:length(Type)));
        CH(n_ch+1,:)=load_open_ephys_data(char(F));
    end
end

% Build time vector
Time=(0:1/Fs:(length(CH(1,:))-1)/Fs);

%% Read Spikes
% Find spikes data
Files=strings(1); m=1;
for n=1:length(Files_tmp)
    F=Files_tmp(n);
    if strfind(F.name,'spikes')>0
        Files(m,1)=F.name;
        k1=strfind(F.name,'n'); k2=strfind(F.name,'.spikes');
        Files(m,2)=F.name(k1:k2-1);
        m=m+1;
    end
end

% Load and sort spikes data
N_spikes=length(Files);
Spikes=cell(N_spikes,1);
for n=1:N_spikes
    F=Files(n,1); Type=char(Files(n,2));
    n_sp=str2num(Type(2:length(Type)));
    [data,S,info]=load_open_ephys_data(char(F));
    Spikes{n_sp+1}=S;

L'obiettivo è quello di calcolare il numero di spikes in diversi intervalli di tempo in cui mando i diversi stimoli.
I tempi sono i seguenti.

Trep=0.5; % Period of pulses
Tpulse= 0.05; % Duration of pulses
Tdelay=1.5; % Delay before the first pulse and after the last pulse (to match experiments)
Ipotizzando di dare 10 stimoli (N_ADC=10) e definendo il tempo del primo stimolo come T0+Tdelay (dove T0 è il momento di inizio dell'esperimento) ho pensato di calcolare con la funzione "find" tutti i valori per ogni cella di "Spikes" che sono compresi nei vari intervalli di tempo che mi interessano. In questo modo ottengo la variabile "Spike_per_ADC" che presenta in ogni cella le posizioni dei valori compresi nei miei intervalli di tempo all'interno di Spikes{1,1} (che rappresenta i dati relativi al primo canale di registrazione).

t0=16;
T1=t0+Tdelay;

N_ADC=10;
Spike_per_ADC=cell(N_ADC,1);

for N_ADC=1:10 %10 is the number of ADC
    
    findspike=find(Spikes{1,1}>(T1+(Trep*N_ADC-Trep)) & Spikes{1, 1}<((T1+Trep)+(Trep*N_ADC-Trep)));
    Spike_per_ADC{N_ADC,1}=findspike  %posizione dei valori che soddisfano le condizioni in spike(1,1)
      
end  
Pensavo poi di usare la funzione "lenght" per calcolare il numero di valori all'interno di ogni cella "Spike_per_ADC" che corrisponde quindi al numero di Spikes per i diversi stimoli.
numerospike=lenght(Spike_per_ADC{1, 1});
Il problema è che visto che dovrei riuscire a fare un istogramma in cui riporto per ogni stimolo, il numero di spike per canale, ho bisogno di applicare i codici per "findspike" a tutte le celle di "Spikes" per generare una variabile "Spike_per_ADC{N_ADC,N_CH} in cui quindi per ogni canale trovo le posizioni nelle varie celle di "Spikes" dei valori che corrispondi ai miei intervalli di tempo. A questo punto vorrei riuscire a creare la matrice "numerospike"(di 10 righe e 16 colonne) con la funzione length che mi riporta il numero dei valori presenti in ogni cella di "Spike_per_ADC". Poi potrei fare il mio istogramma.

Visto che sono nuova su MATLAB, vi chiedere prima di tutto cosa pensate del ragionamento e in seconda battuta se potete spiegarmi come automatizzare le funzioni che vi ho scritto per lavorare su ogni cella delle variabili trattate.

Vi ringrazio infinitamente e mi scuso per il lunghissimo post.
Buona giornata a tutti!
Daiana

1 Risposte

  • Re: Automazione funzioni su celle

    Dovresti semplificare la domanda.
    Hai pubblicato quasi 100 righe di codice che nessuno potrà mai testare e provare a "migliorare" perchè non hai pubblicato nessun dato / file di input.
    Chiedi un'opinione sul metodo che utilizzi: hai provato? Funziona?
    Dovresti semplificare la domanda evidenziando chiaramente quale sia il problema.
    Ad esempio, pensi che qualcuno sia in grado di comprendere un'istruzione come questa senza "stuidiare" tutto il codice che hai pubblicato, cercando di capire cosa rappresentino le variabili?

    findspike=find(Spikes{1,1}>(T1+(Trep*N_ADC-Trep)) & Spikes{1, 1}<((T1+Trep)+(Trep*N_ADC-Trep)));

    soprattutto quando non è possibile eseguire il codice, visto che non ci sono i dati di input.

    Dovresti pubblicare un estratto del codice, i dati di input necessari ad eseguirlo e l'output che ti aspetti.
Devi accedere o registrarti per scrivere nel forum
1 risposte