function evol=readExperiment3 % Programa para visualización experimentos Cytation % minutos en un día mind = 60*24; % Temperatura experimento Texp= 37; % Nombre fichero. file=uigetfile('*.xlsx;*.xls'); if isequal(file,0) return; end % Abre diálogo para definición de las placas [placa,rangos,tind]=DefPlaca; if isempty(placa) return; end pdim=size(placa); pdim(1)=pdim(1)-1; plc=struct('strain',{},'Id',{},'isConc',{}); % Genera estructura de datos con la información de la placa for i=1:pdim(1) for j=1:pdim(2) cs=strsplit(placa{i,j},'_'); switch length(cs) case 1 % El medio figura en la primera fila, el strain en la última y la celda contiene concentración plc(i,j).strain=placa{end,j}; aux=placa{i,j}; plc(i,j).Id=aux; plc(i,j).isConc=(sum(isletter(aux))==0); plc(i,j).medio=placa{1,j}; case 2 % La celda contiene 'strain_concentracion' plc(i,j).strain=cs{1}; plc(i,j).Id=cs{2}; plc(i,j).isConc=(sum(isletter(cs{2}))==0); plc(i,j).medio=placa{1,j}; case 3 % La celda tiene formato medio_strain_concentracion plc(i,j).strain=cs{2}; plc(i,j).Id=cs{3}; plc(i,j).isConc=(sum(isletter(cs{3}))==0); plc(i,j).medio=cs{1}; otherwise % Error. Se detiene procesado return end plc(i,j).i=i; plc(i,j).j=j; % plc(i,j).col=(i-1)*12+j+2; plc(i,j).col=0; end end % Lee la fila de cabeceras % Determina la fila a leer raux=cell(2,2); rng=regexp(rangos{1},':','split'); raux(1,1)=regexp(rng{1},'[A-Z]+','match'); raux(2,1)=regexp(rng{2},'[A-Z]+','match'); raux(1,2)=regexp(rng{1},'[0-9]+','match'); raux(2,2)=regexp(rng{2},'[0-9]+','match'); fr=sscanf(raux{1,2},'%i')-1; % Rango de celdas a leer cb=[raux{1,1},sprintf('%i',fr),':',raux{2,1},sprintf('%i',fr)]; % Lee cabeceras [ncap,cap]=xlsread(file,cb); %Asigna columna de experimento for i=3:length(cap) %Fila fi=cap{i}(1)-'A'+1; %Columna col=sscanf(cap{i}(2:end),'%i'); plc(fi,col).col=i; end %Convierte el struct array en tabla para facilitar consulta tplaca=struct2table(plc(:)); % Busca índices cuyo Id sea igual a un str %find(strcmp(a.Id,'LB')) % Selecciona elemontos cuyo Id sea igual a str %a(strcmp(a.Id,'LB'),:) %a(strcmp(a.Id,'10'),:) % Elimina las filas vacias TF = ismissing(tplaca); tplaca=tplaca(~any(TF(:,2:end),2),:); % Distribución celdas experimento. Analizar si se puede automatizar OD_preRef=rangos{1}; F_preRef=rangos{2}; OD_postRef=rangos{3}; F_postRef=rangos{4}; OD_pre = xlsread(file,OD_preRef); OD = xlsread(file,OD_postRef); F_pre = xlsread(file,F_preRef); F = xlsread(file,F_postRef); OD(:,1)=OD(:,1)+OD_pre(end,1)+tind/mind; F(:,1)=F(:,1)+F_pre(end,1)+tind/mind; % Número de muestras preinducción npre=size(OD_pre,1); % monta los experimentos preinducción y postind en una única matriz OD_exp=[OD_pre;OD]; F_exp=[F_pre;F]; % Determina si hay datos de segunda fluorescencia isF2=length(rangos)>4 && ~any(cellfun(@isempty,rangos(5:6))); if isF2 F2_preRef=rangos{5}; F2_postRef=rangos{6}; F2_pre = xlsread(file,F2_preRef); F2 = xlsread(file,F2_postRef); F2(:,1)=F2(:,1)+F2_pre(end,1)+tind/mind; F2_exp=[F2_pre;F2]; end % Almacenamiento experimento en struct array % Permite el acceso estructurado a los datos del experimento % Nombres de strains cStraini=unique(tplaca.strain,'stable'); % Tipos de experientos realizados mediosi=unique(tplaca.medio,'stable'); %Genera un struct anidado strain->medios->datos para almacenar datos %experimento %evol=cell2struct(cStraini','strain'); evol.placa=placa; evol.rangos=rangos; evol.tinduccion=tind; evol.file=file; evol.npre=npre; % Número de muestras antes de la inducción evol.Texp=Texp; % Inicializa estructura medios->strains->concentración evol.medios=cell2struct(mediosi','Id'); % Almacena el vector con el tiempo de las medidas % Si se dispone de información de tiempo para cada celda se podría % incluir el tiempo en la matriz de datos del pocillo evol.time_OD=OD_exp(:,1)*mind; evol.time_F=F_exp(:,1)*mind; if isF2 evol.time_F2=F2_exp(:,1)*mind; end TF = ismissing(tplaca); for i=1:length(evol.medios) % Primer nivel: Array para cada medio: campo strain mantiene cepa y medios % es un array con los medios usados % Obtiene el índice de columnas con medios jm=table2array(tplaca(strcmp(tplaca.Id,evol.medios(i).Id),'col'))'; % Almacena los datos de experimentos evol.medios(i).OD=OD_exp(:,jm); evol.medios(i).F=F_exp(:,jm); % Obtiene la evolución media evol.medios(i).OD_medio=mean(OD_exp(:,jm),2); evol.medios(i).F_medio=mean(F_exp(:,jm),2); if isF2 evol.medios(i).F2=F2_exp(:,jm); evol.medios(i).F2_medio=mean(F2_exp(:,jm),2); end % Inicializa estructura para strains taux=tplaca(~TF(:,1),:); aux=unique(taux(strcmp(taux.medio,evol.medios(i).Id),:).strain,'stable'); evol.medios(i).strains=cell2struct(aux','Id'); for k=1:length(evol.medios(i).strains) % segundo nivel nivel: Para cada strain se dispone de los datos para % cada concentracion (data) %Concentraciones. Revisar poque podría haber distinto número %concentraciones en función de strain/medios aux2=tplaca(strcmp(tplaca.strain,evol.medios(i).strains(k).Id)&... strcmp(tplaca.medio,evol.medios(i).Id)&... tplaca.isConc,:); Ci=unique(aux2.Id,'stable'); evol.medios(i).strains(k).data=cell2struct(Ci','Inducc'); % Busca medio con concentración 0 para referencia medida for j=1:length(evol.medios(i).strains(k).data) if(strcmp(evol.medios(i).strains(k).data(j).Inducc,'0')) h=j; end end % El siguiente bucle se inicia siempre con concentración 0 auxFOD0=[]; % almacena temporalmente ratio sin inductor auxF2OD0=[]; for j=[h, 1:(h-1), (h+1):length(evol.medios(i).strains(k).data)] % Obtiene el índice de columnas con medios jm=table2array(tplaca(strcmp(tplaca.medio,evol.medios(i).Id)&... strcmp(tplaca.strain,evol.medios(i).strains(k).Id)&... strcmp(tplaca.Id,evol.medios(i).strains(k).data(j).Inducc),'col'))'; % Obtiene la evolución media evol.medios(i).strains(k).data(j).OD=OD_exp(:,jm); % Resta valor fluorescencia preinducción evol.medios(i).strains(k).data(j).F=F_exp(:,jm); %Lo quité YB%-ones(size(F_exp,1),1)*mean(F_pre(:,jm)); meanOD=mean(OD_exp(:,jm),2); meanF=mean(evol.medios(i).strains(k).data(j).F,2); evol.medios(i).strains(k).data(j).OD_medio=meanOD; evol.medios(i).strains(k).data(j).F_medio=meanF; if j==1 % auxFOD0=meanF./meanOD; auxFOD0=meanF; end % evol(i).medios(k).data(j).FOD=meanF./meanOD-auxFDO0; evol.medios(i).strains(k).data(j).FOD=(meanF-auxFOD0)./meanOD; if isF2 evol.medios(i).strains(k).data(j).F2=F2_exp(:,jm); meanF2=mean(F2_exp(:,jm),2); evol.medios(i).strains(k).data(j).F2_medio=meanF2; if j==1 auxF2OD0=meanF2; end evol.medios(i).strains(k).data(j).F2OD=(meanF2-auxF2OD0)./meanOD; end end end end name=strsplit(evol.file,'.'); save(name{1},'evol');